0%

redis乐观锁

我们知道在 redis 中,有一个排他锁,set ... nx,但是这个锁有一个问题是,有可能造成所有请求阻塞在等待这个锁上。

如果是允许同时执行的,比如秒杀,是可以有多个请求成功的,那么可以尝试一下 redis 的乐观锁。

如何使用

  1. 利用 redis 的 watch 功能,监控这个 redis key 的状态值。
  2. 获取 redis key 的值
  3. 创建 redis 事务
  4. 修改这个 key 的值
  5. 执行这个事务,如果 key 的值被修改过则回滚,key 不修改。(如果没修改过,则执行成功)

示例

事务执行

1
2
3
4
5
6
7
8
9
10
➜  ~ redis-cli
127.0.0.1:6379> watch a
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set a 12
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
127.0.0.1:6379>

如果事务执行成功,exec 会返回 OK,如果执行失败,则会返回 nil。我们可以根据这个返回值来判断事务是否执行成功。