redis有一个命令: set key value nx;
该命令的用处是,只有当redis中不含key时,才能set成功。
基于以上原理,可以设计分布式锁。
分布式锁可用于防止redis缓存击穿,也可解决幂等性问题。
分布式锁设计思路:
分布式锁会设置一个过期时间,以防止在解锁前服务器突然宕机,导致死锁。因此加锁和设计过期时间得设计成原子性操作。
分布式锁解锁的过程,也存在问题。若业务超时,锁已过期,而业务完成之后默认会删除锁,而此时的锁已经是别人的锁了,导致误删。为了解决这一问题,可将key设置为指定值,删锁时先查询该锁是否存在,存在的话再执行删锁操作。
但是, 如果查锁和删锁之间锁过期,同样会导致误删。因此查锁和删锁也要采用原子操作。



