👌redis的setnx和setex的区别?
口语化答案
setnx 和 setex 都是在最基础的 set 命令上面所做的升级。setnx 的一个特性就是如果 key 已经存在,在此放入会放不进去,这种特性也常常用来做分布式锁。如果 setnx 成功,则证明获取到锁成功,没有 set 成功,则证明获取锁失败。setex 只多了一个过期时间的概念,比如我希望本次放入的缓存 3 秒后自动失效,就可以通过这个命令来实现。
题目解析
比较基础的一道题,面试官主要是借这个问题,聊到分布式锁相关的一些处理。注意二者的区别即可。
面试得分点
不存在则设置,过期时间,分布式锁
题目详细答案
SET:最基础的命令,setnx 和 setex 都是在此基础上进行变种。set 命令就是设置键值对,如果已经有值则覆盖,没值就放进去,不涉及过期时间的概念。
SETNX:是一个设置键-值对的命令,但仅在键不存在时才设置该键。如果键已经存在,则不进行任何操作。它是“Set if Not Exists”的缩写,即“如果不存在则设置”。
SETEX:这个命令用于为指定的键设置值及其过期时间。如果键已经存在,SETEX命令将会替换旧的值和过期时间。
命令使用
SETNX的语法为:SETNX key value。其中,key是要设置的键名,value是要设置的值。如果key不存在,则返回1表示设置成功;如果key已经存在,则返回0表示设置失败。
SETEX的语法为:SETEX key seconds value。其中,key是要设置的键名,seconds是过期时间(以秒为单位),value是要设置的值。如果设置成功,则返回“OK”。
应用场景
SETNX常用于分布式场景中的锁机制。例如,在多个客户端同时访问共享资源或执行关键操作时,可以使用SETNX命令尝试在Redis中设置一个特定的键作为锁键,从而确保只有一个客户端能够成功设置该键并执行关键操作。其他执行命令因为设置不成功,所以就可以认为是未获得到锁。
SETEX则用于为键设置值和过期时间。这在需要临时存储数据或限制数据有效期的场景中非常有用。例如,可以使用SETEX命令存储会话信息或缓存数据,并为其设置适当的过期时间以自动删除过期的数据。