为什么需要锁?
锁限制独立的进程同时占用同一资源, 资源可以是数据库记录, (行级锁对应一条记录, 表级锁对应一类记录.)。
我们通常是出于两种目的, 希望进行这种限制:
- 安全性(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的“复杂”分布式锁。