Redis相关

分布式锁:

为了防止分布式系统多线程对Redis共享数据同时操作产生干扰,需要使用分布式锁来实现操作有序进行。

Redis中分布式锁可以使用setnx+setex来实现。

setnx指令仅在对应key不存在时对其赋值,因此可以为锁设置一个key,利用setnx的返回值来验证锁是否获得。释放锁可del对应锁key

为了防止获得锁后客户端或服务端宕机而产生死锁,可使用expire设置过期时间(Redis2.8以前),但这又会留下问题,即客户端或服务端在setnx之后,expire之前宕机。

set在Redis2.8之后提供了扩展参数,允许同时设置过期时间,即 set [key] [value] ex [timeout] nx 

使用分布式锁时需考虑其开销和粒度,粒度不宜过大,否则会导致任务还没执行完锁已过期(可以使用Lua脚本解决)。

Redis中所有指令都是原子性的,因为Redis本身是单线程的,因此当Redis执行Lua脚本时,Redis会把Lua脚本作为一个整体并把它当作一个任务加入到一个队列中,然后单线程按照队列的顺序依次执行这些任务,在执行过程中Lua脚本是不会被其他命令或请求打断,因此可以保证每个任务的执行都是原子性的。

 

 

参考文章 https://blog.csdn.net/weixin_39908462/article/details/111616779?spm=1001.2014.3001.5506

posted @ 2023-07-26 17:13  _Explosion!  阅读(11)  评论(0编辑  收藏  举报