Java高频率面试题
1、Redis分布式锁有哪几种?
Redis分布式锁方案一:SETNX + EXPIRE。即先用setnx来抢锁,如果抢到之后,再用expire给锁设置一个过期时间,防止锁忘记了释放。、
Redis分布式锁方案二:SETNX + value值是(系统时间+过期时间)。把过期时间放到setnx的value值里面。如果加锁失败,再拿出value值校验一下即可。这个方案的优点是,巧妙移除expire单独设置过期时间的操作,把「过期时间放到setnx的value值」里面来。解决了方案一发生异常,锁得不到释放的问题。但是这个方案还有别的缺点:
- 过期时间是客户端自己生成的(System.currentTimeMillis()是当前系统的时间),必须要求分布式环境下,每个客户端的时间必须同步。
- 如果锁过期的时候,并发多个客户端同时请求过来,都执行jedis.getSet(),最终只能有一个客户端加锁成功,但是该客户端锁的过期时间,可能被别的客户端覆盖
- 该锁没有保存持有者的唯一标识,可能被别的客户端释放/解锁。
Redis分布式锁方案三:使用Lua脚本(包含SETNX + EXPIRE两条指令)
Redis分布式锁方案方案四:SET的扩展命令(SET EX PX NX)
方案五:SET EX PX NX + 校验唯一随机值,再删除

浙公网安备 33010602011771号