论Redis 7种加锁方式的优缺点
本文参考文章《论Redis分布式锁的正确使用姿势》总结一下文中提到的7种加锁方式的优缺点。方案一:SETNX + EXPIRE优点:实现简单,通过修改过期时间可以支持锁重入,锁超时自动释放;缺点:因为上述命令是分两步执行,如果第二步执行失败,将造成无法解锁。方案二:SETNX + value值是(系统时间+过期时间)优点:加锁是原子操作,解决了方案一的缺点。缺点:实现复杂,每个机器的时间必须保持同
本文参考文章《论Redis分布式锁的正确使用姿势》总结一下文中提到的7种加锁方式的优缺点。
方案一:SETNX + EXPIRE
优点:实现简单,通过修改过期时间可以支持锁重入,锁超时自动释放;
缺点:因为上述命令是分两步执行,如果第二步执行失败,将造成无法解锁。
方案二:SETNX + value值是(系统时间+过期时间)
优点:加锁是原子操作,解决了方案一的缺点。
缺点:实现复杂,每个机器的时间必须保持同步,其他加锁线程会修改过期时间,锁有可能被其他线程错误释放。
方案三:使用Lua脚本(包含SETNX + EXPIRE两条指令)
优点:保证加锁和解锁的原子性。
缺点:无法支持锁的重入,主从模式可能造成锁丢失,锁无法自动续期。
方案四:SET的扩展命令(SET EX PX NX)
优点:保证加锁和解锁的原子性。
缺点:锁有可能被其他线程错误释放,锁没有自动续期机制,锁无法支持重入。
方案五:SET EX PX NX + 校验唯一随机值,再释放锁
优点:保证加锁的原子性,使用LUA释放锁的话,锁不会被其他线程错误释放。
缺点:锁没有自动续期机制,锁无法支持重入。
方案六: 开源框架:Redisson
优点:锁支持自动续期。
缺点:主从模式可能造成锁丢失。
方案七:多机实现的分布式锁Redlock
优点:锁支持自动续期,解决了方案六的缺点。
缺点:需要部署多台redis机器,极端情况下,会造成两个线程同时获得锁。为了避免该种情况发生,要求宕机的redis在超过锁超时时间后再重启。使用锁的时间要小于锁超时时间。
更多推荐
所有评论(0)