为什么要用可重入锁?
让我们来了解一个新名词:“业务线程”
采用 lua脚本+redis, 由于【判断和删除】是lua脚本执行,所以要么全成功,要么全失败
流程一览
- 先判断是否有,如没这个key,则设置key-value,配置过期时间,加锁成功
- 如果有这个key,判断value是否是同个账号,是同个账号则返回加锁成功
- 如果不是同个账号则加锁失败
实际代码
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@GetMapping("test")
public JsonData test(@RequestParam(name = "code")String code, @RequestParam(name = "accountNo") Long accountNo ){
//key1是短链码,ARGV[1]是accountNo,ARGV[2]是过期时间
String script = "if redis.call('EXISTS',KEYS[1])==0 then redis.call('set',KEYS[1],ARGV[1]); redis.call('expire',KEYS[1],ARGV[2]); return 1;" +
" elseif redis.call('get',KEYS[1]) == ARGV[1] then return 2;" +
" else return 0; end;";
Long result = redisTemplate.execute(new
DefaultRedisScript<>(script, Long.class), Arrays.asList(code), accountNo,100);
return JsonData.buildSuccess(result);
} 大功告成[aru_50]
本文作者为DBC,转载请注明。