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;
* @since 2021-07-28
*/
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);
@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 {
@Transactional
public void insertOrUpdateDur(VisitLogEntity vs) {
// 分布式锁
for (;;) {
for (int i = 0; i < 5 * 10; i++) {
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) {
visitLogMapper.insert(vs);
} else {
visitLogMapper.updateDurByIdent(vs.getDuration(), vs.getIdent(), vs.getRefId(), vs.getRefType());
}
// 如果执行超时,会删除别的实例的key
redisCache.evict(key);
redisCache.evict(key + ":" + rand);
return;
}
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