博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怎样用redis实现分布式锁
阅读量:5745 次
发布时间:2019-06-18

本文共 1206 字,大约阅读时间需要 4 分钟。

引子

redis作为一个强大的key/value数据库。事实上还能够用来实现轻量级的分布式锁。

1.实现方案1

最早官方在命令页给了一个实现:

acquire lock: SETNX lock.foo 
release lock: DEL lock.foo
acquire lock when time expired: GETSET lock.foo 

只是这个方法有漏洞。就是release lock用的DEL命令不支持cas删除(delete if current value equals old value)。这样忽略race condition将会出现故障:

A client will try to release the lock after the expire time deleting the key created by another client that acquired the lock later.

2.实现方案2

官方在命令页介绍了新的方案:SET command + Lua script:

Starting with Redis 2.6.12 it is possible to create a much simpler locking primitive using the  command to acquire the lock, and a simple Lua script to release the lock. The pattern is documented in the  command page.

The old  based pattern is documented below for historical reasons.

该方案有2个优化:

(1)SET 命令能够设置key过期时间:SET key value [EX seconds] [PX milliseconds] [NX|XX]

The lock will be auto-released after the expire time is reached.

(2)使用Lua脚本实现cas删除(详见命令页)

It is possible to make this system more robust modifying the unlock schema as follows:

  • Instead of setting a fixed string, set a non-guessable large random string, called token.
  • Instead of releasing the lock with , send a script that only removes the key if the value matches.

转载地址:http://soxzx.baihongyu.com/

你可能感兴趣的文章
whereis、find、which、locate的区别
查看>>
一点不懂到小白的linux系统运维经历分享
查看>>
桌面支持--打不开网页上的pdf附件解决办法(ie-tools-compatibility)
查看>>
nagios监控windows 改了NSclient++默认端口 注意事项
查看>>
干货 | JAVA代码引起的NATIVE野指针问题(上)
查看>>
POI getDataFormat() 格式对照
查看>>
Python 中的进程、线程、协程、同步、异步、回调
查看>>
好的产品原型具有哪些特点?
查看>>
实现java导出文件弹出下载框让用户选择路径
查看>>
刨根问底--技术--jsoup登陆网站
查看>>
OSChina 五一劳动节乱弹 ——女孩子晚上不要出门,发生了这样的事情
查看>>
Spring--通过注解来配置bean
查看>>
pandas 十分钟入门
查看>>
nginx rewrite
查看>>
前端安全系列(一):如何防止XSS攻击?
查看>>
查看Linux并发连接数
查看>>
你是谁不重要,关键是你跟谁!
查看>>
CSS中规则@media的用法
查看>>
pychecker:分析你的python代码
查看>>
我的友情链接
查看>>