set命令: 当key存在的时候,set就会覆盖key的value值
setnx命令: 如果key已存在,返回0,如果key不存在,设置成功,返回1,只有第一个请求可以设置key成功,也就是拿到锁,执行完业务逻辑后,再del key
如果程序有问题,没有正常del key,那么这个锁会一直释放不了
优化的方法就是加过期时间,确保锁在一定时间后能够释放.
这样处理后,就可以保证锁可以正常的释放。但是会有一个新的问题,就是取锁和设置过期时间这两个操作之间,服务器可能会挂掉,因为取锁,也就是setnx和设置过期时间是两个操作,不具备原子性所以不可能同时完成,那么如何解决呢?
从 Redis 2.6.12 版本开始,setnx和expire可以通过一个set命令一起执行,让两个操作变成一个,可以解决这个问题。
SET key value [EX seconds] [PX millisecounds] [NX|XX]
EX seconds:设置键的过期时间为second秒
PX millisecounds:设置键的过期时间为millisecounds 毫秒
NX:只在键不存在的时候,才对键进行设置操作
XX:只在键已经存在的时候,才对键进行设置操作
SET操作成功后,返回的是OK,失败返回NIL
网友评论