Redis提供的原子性命令

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 脚本

通过 EVALEVALSHA 执行 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

重要注意事项:

  1. 网络分区:原子性只在单个 Redis 实例上保证,集群环境下需注意
  2. Lua 脚本:是复杂原子操作的最佳选择,但应避免长时间运行的脚本
  3. WATCH/MULTI/EXEC:乐观锁机制,适用于需要读取-修改-写入的场景

Redis 通过这些原子命令,使得在无需外部锁的情况下,就能安全地处理并发场景,这是它高性能的重要原因之一。

posted @ 2025-12-09 20:15  deyang  阅读(4)  评论(0)    收藏  举报