Redis 之 简单分布式锁

为什么需要锁?

锁限制独立的进程同时占用同一资源, 资源可以是数据库记录, (行级锁对应一条记录, 表级锁对应一类记录.)。

我们通常是出于两种目的, 希望进行这种限制:

  • 安全性(safety)
    通过锁的限制, 对资源的并发操作被解除了, 不同的进程只能顺序操作资源. 非常实际的例子是数据库事务
  • 效率(effectiveness)
    锁限制不同的进程挤占计算资源.

Redis提供了一个命令,可以达到锁的目的

set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:设置失效时长,单位秒
PX milliseconds:设置失效时长,单位毫秒
NX:key不存在时设置value,成功返回OK,失败返回(nil)
XX:key存在时设置value,成功返回OK,失败返回(nil)

案例:设置name=p7+,失效时长100s,不存在时设置
1.1.1.1:6379> set name p7+ ex 100 nx
OK
1.1.1.1:6379> get name
"p7+"
1.1.1.1:6379> ttl name
(integer) 94

说明
这个只是简单的分布式锁,只会在比较极端的情况下出错, 所以如果你处在一个仅仅需要保证数据大部分时候可靠, 万一有问题也无所谓的情况下, 那么放心的使用单节点redis或主从集群来加锁吧.
如果你对数据可靠性要求高,那么请了解下其它方案实现分布式锁。比如基于ZK, etcd的“复杂”分布式锁。

发布了200 篇原创文章 · 获赞 13 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013919153/article/details/105617128