Commit a5b0db55 authored by 刘基明's avatar 刘基明

Merge branch '0214_visitlog_fix' into 'master'

0214 visitlog fix

See merge request !42
parents 0f2d329a 7407ddb2
...@@ -21,7 +21,7 @@ import java.util.List; ...@@ -21,7 +21,7 @@ import java.util.List;
* @since 2021-07-28 * @since 2021-07-28
*/ */
public interface VisitLogMapper extends BaseMapper<VisitLogEntity> { public interface VisitLogMapper extends BaseMapper<VisitLogEntity> {
@Select("select * from visit_log where ident=#{ident} and ref_id=#{refId} and ref_type=#{refType}") @Select("select * from visit_log where ident=#{ident} and ref_id=#{refId} and ref_type=#{refType} limit 1 for update")
VisitLogEntity selectByIdentAndRefId(@Param("ident") String ident, @Param("refId") String refId, @Param("refType") String refType); VisitLogEntity selectByIdentAndRefId(@Param("ident") String ident, @Param("refId") String refId, @Param("refType") String refType);
@Update("update visit_log set duration=duration+#{duration} where ident=#{ident} and ref_id=#{refId} and ref_type=#{refType}") @Update("update visit_log set duration=duration+#{duration} where ident=#{ident} and ref_id=#{refId} and ref_type=#{refType}")
......
...@@ -65,16 +65,16 @@ public class VisitLogService { ...@@ -65,16 +65,16 @@ public class VisitLogService {
@Transactional @Transactional
public void insertOrUpdateDur(VisitLogEntity vs) { public void insertOrUpdateDur(VisitLogEntity vs) {
// 分布式锁 // 分布式锁
for (;;) { for (int i = 0; i < 5 * 10; i++) {
String key = getVisitLogRedisKey(vs); String key = getVisitLogRedisKey(vs);
if (redisCache.setIfAbsent(key, "1", 15)) { String rand = String.valueOf((int) Math.floor(Math.random() * 100));
if (redisCache.setIfAbsent(key, rand, 15)) {
if (visitLogMapper.selectByIdentAndRefId(vs.getIdent(), vs.getRefId(), vs.getRefType()) == null) { if (visitLogMapper.selectByIdentAndRefId(vs.getIdent(), vs.getRefId(), vs.getRefType()) == null) {
visitLogMapper.insert(vs); visitLogMapper.insert(vs);
} else { } else {
visitLogMapper.updateDurByIdent(vs.getDuration(), vs.getIdent(), vs.getRefId(), vs.getRefType()); visitLogMapper.updateDurByIdent(vs.getDuration(), vs.getIdent(), vs.getRefId(), vs.getRefType());
} }
// 如果执行超时,会删除别的实例的key redisCache.evict(key + ":" + rand);
redisCache.evict(key);
return; return;
} }
try { try {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment