Skip to content

redis lock

command

在 redis 命令中 set 和 setnx(set if not exists) 是原子操作,可以作为分布式锁来使用, 而 setex是 set 命令和 expire 命令的组合,不属于原子操作

  • set key value [NX XX] [EX seconds | PX millionseconds]

其中 set key value 表示设置 value 给到 key
NX, if not exists, 如果不存在才进行设置, 通常使用 NX 做分布式锁, 如果存在返回 nil, XX if exists 才进行更新, 否则不处理, 如果不填写则不论是否存在都设置
EX 后面跟随秒,PX 后面跟随毫秒

set myKey "hello world"

#  设置 myKey="hello world", 过期时间是 10s
set myKey "hello world" NX PX 10000
  • setnx key value

设置 value 给到 key, 不能设置过期时间

  • setex key seconds value

setex 这种做法有点反人类,key 的下一个参数不是 value,而是 seconds

在 node 中的应用

这里使用 ioredis 为例,来说明 node 中如何使用 redis 的分布式锁

js
const Redis = require("ioredis");
const redis = new Redis();

// 设置 myKey="Hello world", 10s后自动消失, 如果已经存在不做任何操作并且返回 null,  不存在则设置字段并且返回成功
const result = await redis.set("myKey", "Hello world", "EX", 10, "NX"); // OK