Redis 操作命令文档

Redis 是一个高性能的键值存储数据库,支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set),以及位图(Bitmap)、HyperLogLog 和地理空间索引(Geospatial)等扩展数据结构。本文档将详细列出这些数据结构的常用命令,并探讨它们在生产环境中的典型应用场景。


1. 字符串(String)

字符串是 Redis 最基本的数据类型,可以存储文本、数字或二进制数据。常用于缓存、计数器、分布式锁等场景。

命令描述示例生产应用场景
SET key value设置键值对SET name "Alice"缓存用户信息、配置项
GET key获取键的值GET name读取缓存数据
APPEND key value追加值到键的末尾APPEND name " Smith"日志记录、消息拼接
INCR key将键的值加 1(适用于整数)INCR counter计数器(如页面访问量)
DECR key将键的值减 1DECR counter库存扣减
INCRBY key increment增加指定增量INCRBY counter 10批量增加计数
DECRBY key decrement减少指定减量DECRBY counter 5批量减少计数
GETRANGE key start end获取子字符串GETRANGE name 0 4提取部分数据
SETNX key value仅在键不存在时设置值SETNX name "Bob"分布式锁
MSET key1 value1 ...批量设置键值对MSET k1 "v1" k2 "v2"批量缓存数据
MGET key1 key2 ...批量获取键的值MGET k1 k2批量读取缓存
STRLEN key获取值的长度STRLEN name验证数据完整性

生产应用场景

  • 缓存:存储数据库查询结果、API 响应等,减少数据库压力。
  • 分布式锁:使用 SETNX 实现互斥锁,防止并发冲突。
  • 计数器:如网站访问量、点赞数,Redis 的原子操作保证计数的准确性。

2. 哈希(Hash)

哈希适合存储对象,键值对形式类似于字段和值的映射。常用于用户信息、配置信息等。

命令描述示例生产应用场景
HSET key field value设置哈希字段的值HSET user:1 name "Alice"存储用户对象
HGET key field获取哈希字段的值HGET user:1 name读取用户属性
HMSET key field1 value1 ...批量设置字段值HMSET user:1 name "Alice" age "25"批量更新对象
HMGET key field1 field2 ...批量获取字段值HMGET user:1 name age批量读取属性
HGETALL key获取哈希所有字段和值HGETALL user:1获取完整对象
HDEL key field1 ...删除指定字段HDEL user:1 age删除对象属性
HEXISTS key field检查字段是否存在HEXISTS user:1 name验证属性存在
HKEYS key获取哈希所有字段名HKEYS user:1列出对象字段
HVALS key获取哈希所有值HVALS user:1列出对象值
HLEN key获取哈希字段数量HLEN user:1获取对象字段数

生产应用场景

  • 用户 Session:存储用户会话数据,支持快速访问和更新。
  • 配置管理:存储应用的配置项,支持动态修改。
  • 购物车:字段为商品 ID,值为数量,便于管理。

3. 列表(List)

列表是一个有序的字符串集合,支持从两端操作(双端队列)。常用于消息队列、任务队列等。

命令描述示例生产应用场景
LPUSH key value1 ...从左侧插入元素LPUSH list "a" "b"消息队列入队
RPUSH key value1 ...从右侧插入元素RPUSH list "c" "d"任务队列入队
LPOP key从左侧弹出元素LPOP list消息队列出队
RPOP key从右侧弹出元素RPOP list任务队列出队
LRANGE key start end获取指定范围的元素LRANGE list 0 -1获取队列内容
LLEN key获取列表长度LLEN list检查队列长度
LINDEX key index获取指定索引的元素LINDEX list 1访问特定元素
LREM key count value删除指定值的元素LREM list 1 "a"移除重复消息
LSET key index value设置指定索引的值LSET list 0 "x"更新队列元素
LTRIM key start end修剪列表到指定范围LTRIM list 1 2保留最新 N 条记录

生产应用场景

  • 消息队列:使用 LPUSHRPOP 实现 FIFO 队列。
  • 任务队列:存储待处理任务,工作者从队列中取任务。
  • 最新列表:如最新评论,保持固定长度,移除旧数据。

4. 集合(Set)

集合是无序、不重复的字符串集合。常用于去重、关系运算、随机抽取等。

命令描述示例生产应用场景
SADD key member1 ...添加元素到集合SADD set "a" "b"添加用户标签
SREM key member1 ...删除集合中的元素SREM set "a"移除用户标签
SMEMBERS key获取集合所有元素SMEMBERS set列出用户标签
SISMEMBER key member检查元素是否在集合中SISMEMBER set "b"检查用户标签
SCARD key获取集合元素数量SCARD set统计标签数量
SINTER key1 key2 ...求多个集合的交集SINTER set1 set2共同好友
SUNION key1 key2 ...求多个集合的并集SUNION set1 set2合并标签
SDIFF key1 key2 ...求多个集合的差集SDIFF set1 set2独有标签
SPOP key随机弹出一个元素SPOP set随机抽奖
SRANDMEMBER key [count]随机获取元素SRANDMEMBER set 2随机推荐

生产应用场景

  • 去重:存储用户 ID,防止重复操作。
  • 关系运算:计算共同关注、共同好友等。
  • 随机抽取:用于抽奖系统或随机推荐。

5. 有序集合(Sorted Set)

有序集合是有序、不重复的字符串集合,每个元素关联一个分数(score)。常用于排行榜、延迟任务等。

命令描述示例生产应用场景
ZADD key score1 member1 ...添加元素及分数ZADD zset 1 "a" 2 "b"添加用户分数
ZRANGE key start end [WITHSCORES]按分数升序获取元素ZRANGE zset 0 -1 WITHSCORES获取排行榜
ZREVRANGE key start end [WITHSCORES]按分数降序获取元素ZREVRANGE zset 0 -1获取倒序排行
ZREM key member1 ...删除元素ZREM zset "a"移除用户
ZCARD key获取元素数量ZCARD zset统计用户数
ZSCORE key member获取元素的分数ZSCORE zset "b"查询用户分数
ZINCRBY key increment member增加元素的分数ZINCRBY zset 1.5 "b"更新用户分数
ZRANK key member获取元素升序排名ZRANK zset "b"查询用户排名
ZREVRANK key member获取元素降序排名ZREVRANK zset "b"查询倒序排名
ZRANGEBYSCORE key min max [WITHSCORES]按分数范围获取元素ZRANGEBYSCORE zset 1 5范围查询

生产应用场景

  • 排行榜:如游戏积分榜、商品销量榜。
  • 延迟任务:score 为执行时间,定时轮询。
  • 范围查询:按时间或分数段查询数据。

6. 位图(Bitmap)

位图通过字符串的位操作实现,适合存储大量布尔值,节省空间。常用于在线状态、签到记录等。

命令描述示例生产应用场景
SETBIT key offset value设置指定偏移量的位值SETBIT bitmap 7 1设置用户在线状态
GETBIT key offset获取指定偏移量的位值GETBIT bitmap 7检查用户在线状态
BITCOUNT key [start end]统计值为 1 的位数BITCOUNT bitmap统计在线用户数
BITOP operation destkey key1 ...位运算(如 AND、OR)BITOP AND result k1 k2用户行为分析

生产应用场景

  • 在线状态:offset 为用户 ID,记录在线状态。
  • 签到记录:offset 为天数,记录签到情况。
  • 布隆过滤器:实现布隆过滤器,快速判断元素是否存在。

7. HyperLogLog

HyperLogLog 用于基数统计(近似去重计数),占用固定空间,适合大数据量去重。

命令描述示例生产应用场景
PFADD key element1 ...添加元素PFADD hll "a" "b"记录用户访问
PFCOUNT key1 key2 ...获取基数估计值PFCOUNT hll统计独立用户数
PFMERGE destkey key1 ...合并多个 HyperLogLogPFMERGE hll3 hll1 hll2合并统计数据

生产应用场景

  • UV 统计:统计网站独立访客数。
  • 去重计数:如独立 IP 数、设备数。
  • 大数据去重:在内存受限时进行大规模去重。

8. 地理空间索引(Geospatial)

用于存储地理位置并计算距离,适合 LBS(基于位置的服务)应用。

命令描述示例生产应用场景
GEOADD key longitude latitude member添加地理位置GEOADD cities 13.36 52.52 "Berlin"添加城市位置
GEOPOS key member1 ...获取坐标GEOPOS cities "Berlin"查询城市坐标
GEODIST key member1 member2 [unit]计算两点距离GEODIST cities "Berlin" "Paris" km计算城市间距离
GEORADIUS key longitude latitude radius unit查找范围内的位置GEORADIUS cities 13.36 52.52 100 km查找附近城市

生产应用场景

  • 附近的人:查找附近的用户。
  • 门店推荐:根据位置推荐附近门店。
  • 路径规划:计算两点距离,辅助规划。

9. 通用命令(适用于所有数据结构)

这些命令用于管理 Redis 键的生命周期和基本操作。

命令描述示例生产应用场景
DEL key1 key2 ...删除键DEL name清理缓存
EXISTS key检查键是否存在EXISTS name验证数据存在
TYPE key获取键的数据类型TYPE name调试和监控
EXPIRE key seconds设置键的过期时间EXPIRE name 60设置缓存过期
TTL key获取键的剩余生存时间TTL name检查缓存有效期
PERSIST key移除键的过期时间PERSIST name取消过期设置
RENAME key newkey重命名键RENAME name new_name更新键名
KEYS pattern查找匹配模式的键KEYS user:*批量操作键

生产应用场景

  • 缓存管理:设置过期时间,自动清理数据。
  • 数据清理:定期删除无用数据。
  • 监控:检查键的状态和类型。

生产中的高级需求和解决方案

以下是 Redis 在生产环境中常见的高级需求及其解决方案:

1. 缓存穿透

  • 问题:恶意请求查询不存在的键,导致数据库压力过大。
  • 解决方案:使用布隆过滤器(基于位图实现)预先过滤不存在的键。

2. 缓存雪崩

  • 问题:大量缓存同时过期,导致数据库压力剧增。
  • 解决方案:设置随机过期时间,避免同时失效;使用多级缓存。

3. 分布式锁

  • 问题:分布式系统中需要互斥访问资源。
  • 解决方案:使用 SETNX 实现锁,结合 EXPIRE 设置超时。

4. 消息队列

  • 问题:需要异步处理任务或消息。
  • 解决方案:使用列表实现队列,支持阻塞操作(如 BLPOP)。

5. 排行榜

  • 问题:需要实时更新和查询排行榜。
  • 解决方案:使用有序集合,score 作为排名依据。

6. 限流

  • 问题:限制接口访问频率,防止攻击。
  • 解决方案:使用计数器或滑动窗口算法实现。

7. 会话管理

  • 问题:分布式系统中管理用户会话。
  • 解决方案:将 session 存储在 Redis 中,支持过期管理。