目录
- Redis提供的原子性命令
- 主要类别的原子性命令:
- 1. 字符串(String)原子操作
- 2. 列表(List)原子操作
- 3. 集合(Set)原子操作
- 4. 哈希(Hash)原子操作
- 5. 有序集合(Sorted Set)原子操作
- 6. 位图(Bitmap)原子操作
- 7. HyperLogLog 原子操作
- 8. 地理空间(Geospatial)原子操作
- 高级原子操作
- 1. 事务(Transaction)
- 2. Lua 脚本
- 3. 条件操作
- 4. 流(Stream)原子操作
- 原子性使用示例:
- 示例1:分布式锁
- 示例2:原子计数器+过期时间
- 示例3:原子列表操作
- 重要注意事项:
- 主要类别的原子性命令:
Redis提供的原子性命令
主要类别的原子性命令:
1. 字符串(String)原子操作
INCR/DECR:原子递增/递减整数INCRBY/DECRBY:原子增加/减少指定数值INCRBYFLOAT:原子增加浮点数值SETNX:仅当键不存在时设置(用于分布式锁基础)GETSET:设置新值并返回旧值(原子替换)
2. 列表(List)原子操作
LPUSH/RPUSH:从左/右原子插入元素LPOP/RPOP:从左/右原子弹出元素BRPOP/BLPOP:阻塞式原子弹出(常用于消息队列)
3. 集合(Set)原子操作
SADD/SREM:原子添加/移除元素SINTER/SUNION/SDIFF:原子求交集、并集、差集SPOP:原子随机移除并返回元素
4. 哈希(Hash)原子操作
HSET/HGET:原子设置/获取字段值HINCRBY:原子递增哈希字段值HMSET/HMGET:原子批量操作
5. 有序集合(Sorted Set)原子操作
ZADD/ZREM:原子添加/移除成员ZINCRBY:原子增加成员分数ZINTERSTORE/ZUNIONSTORE:原子计算交集/并集
6. 位图(Bitmap)原子操作
SETBIT/GETBIT:原子位操作BITOP:原子位运算(AND/OR/XOR/NOT)BITCOUNT:原子统计位数
7. HyperLogLog 原子操作
PFADD/PFCOUNT/PFMERGE:基数估计的原子操作
8. 地理空间(Geospatial)原子操作
GEOADD/GEODIST/GEORADIUS:原子地理操作
高级原子操作
1. 事务(Transaction)
虽然 MULTI/EXEC 是事务,但 Redis 事务保证的是顺序执行而非原子回滚(中途出错不会回滚已执行命令)。
2. Lua 脚本
通过 EVAL 或 EVALSHA 执行 Lua 脚本是真正的原子操作:
- 脚本在执行期间不会被其他命令中断
- 适合复杂逻辑的原子执行
EVAL "local current = redis.call('GET', KEYS[1]); if current == ARGV[1] then return redis.call('SET', KEYS[1], ARGV[2]) else return nil end" 1 mykey oldvalue newvalue
3. 条件操作
SET key value NX:等同于SETNX(键不存在时设置)SET key value XX:键存在时设置SET key value EX seconds NX:原子实现带过期时间的分布式锁
4. 流(Stream)原子操作
XADD:原子添加消息到流XREADGROUP:消费者组原子读取
原子性使用示例:
示例1:分布式锁
# 获取锁(原子操作)
SET lock:resource unique_id NX EX 30# 释放锁(Lua脚本保证原子性)
EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 lock:resource unique_id
示例2:原子计数器+过期时间
# 原子递增并设置过期时间
MULTI
INCR mycounter
EXPIRE mycounter 60
EXEC
示例3:原子列表操作
# 原子地从列表获取并处理
RPOP myqueue
# 或者阻塞版本
BRPOP myqueue 30
重要注意事项:
- 网络分区:原子性只在单个 Redis 实例上保证,集群环境下需注意
- Lua 脚本:是复杂原子操作的最佳选择,但应避免长时间运行的脚本
- WATCH/MULTI/EXEC:乐观锁机制,适用于需要读取-修改-写入的场景
Redis 通过这些原子命令,使得在无需外部锁的情况下,就能安全地处理并发场景,这是它高性能的重要原因之一。