为什么要用可重入锁?
让我们来了解一个新名词:“业务线程”
采用 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,转载请注明。