Redis 操作命令文档及需求
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 |
将键的值减 1 | DECR 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 条记录 |
生产应用场景:
- 消息队列:使用
LPUSH
和RPOP
实现 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 ... |
合并多个 HyperLogLog | PFMERGE 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 中,支持过期管理。