Appearance
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