Redis 核心数据类型与命令参考手册
一、 Redis 数据类型概览
| 数据类型 | 核心特性 | 适用场景 |
|---|
| 字符串 (String) | 二进制安全,最大512MB,支持原子计数操作。 | 缓存用户信息、计数器(访问量、点赞)、分布式锁、会话存储。 |
| 哈希 (Hash) | 键值对集合,适合存储对象,节省内存。每个哈希可存 2^32 - 1 个字段。 | 存储用户/商品信息、配置管理、购物车数据。 |
| 列表 (List) | 有序字符串列表,支持双端操作,最多可存 2^32 - 1 个元素。 | 消息队列、最新动态列表、任务队列、历史记录。 |
| 集合 (Set) | 无序且唯一的字符串集合,支持集合运算(交、并、差)。 | 标签系统、好友关系、权限管理、去重处理。 |
| 有序集合 (Sorted Set) | 元素唯一,按分数(Score)排序,支持范围查询。 | 排行榜、优先级队列、时间线、价格区间查询。 |
二、 通用命令与规范
1. 命令语法规范
- 大小写:命令名称不区分大小写(建议大写)。
- 分隔符:参数之间用空格分隔。
- 参数表示:
[ ] 表示可选参数,| 表示多选一。
2. 键(Key)的命名规范
- 风格:使用冒号
: 作为分隔符,采用层次化结构。 - 示例:
user:1001:profile、cache:article:1001、lock:order:1001。 - 原则:使用有意义的名称,保持一致的命名风格,避免过长的键名。
3. 键的通用操作命令
| 命令 | 描述 | 示例 |
|---|
EXISTS key | 检查键是否存在 | EXISTS user:1001 |
TYPE key | 返回键的数据类型 | TYPE user:1001 |
DEL key [key ...] | 删除一个或多个键 | DEL user:1001 user:1002 |
RENAME key newkey | 重命名键 | RENAME oldname newname |
EXPIRE key seconds | 设置键的过期时间(秒) | EXPIRE session:abc123 3600 |
TTL key | 查看键的剩余生存时间(秒) | TTL session:abc123 |
PERSIST key | 移除键的过期时间 | PERSIST session:abc123 |
KEYS pattern | 查找匹配模式的键 (生产环境慎用,会阻塞) | KEYS user:* |
SCAN cursor [MATCH pattern] | 非阻塞式迭代数据库中的键 | SCAN 0 MATCH user:* COUNT 10 |
DBSIZE | 返回当前数据库的键数量 | DBSIZE |
三、 数据类型详解与命令参考
1. 字符串 (String)
基本操作
| 命令 | 描述 | 示例 |
|---|
SET key value | 设置字符串值 | SET name "Redis" |
GET key | 获取字符串值 | GET name |
APPEND key value | 追加字符串到末尾 | APPEND name " Database" |
STRLEN key | 获取字符串长度 | STRLEN name |
数值操作(原子性)
| 命令 | 描述 | 示例 |
|---|
INCR key | 将数值递增 1 | INCR page:views |
INCRBY key increment | 将数值增加指定值 | INCRBY user:1001:points 100 |
DECR key | 将数值递减 1 | DECR counter |
DECRBY key decrement | 将数值减少指定值 | DECRBY user:1001:points 50 |
批量与条件操作
| 命令 | 描述 | 示例 |
|---|
MSET k1 v1 k2 v2 | 批量设置多个键值对 | MSET k1 v1 k2 v2 |
MGET k1 k2 | 批量获取多个键的值 | MGET k1 k2 |
SETNX key value | 仅当键不存在时设置 (常用于分布式锁) | SETNX lock:order "locked" |
SETEX key seconds value | 设置值并指定过期时间 | SETEX session:abc 3600 "data" |
SET key value EX seconds NX | 组合命令:带过期时间的锁 | SET lock:key "val" EX 30 NX |
2. 哈希 (Hash)
基本操作
| 命令 | 描述 | 示例 |
|---|
HSET key field value | 设置哈希字段的值 | HSET user:1001 name "张三" |
HGET key field | 获取哈希字段的值 | HGET user:1001 name |
HDEL key field | 删除哈希字段 | HDEL user:1001 temp_field |
HLEN key | 获取哈希字段数量 | HLEN user:1001 |
HKEYS key | 获取所有字段名 | HKEYS user:1001 |
HVALS key | 获取所有字段值 | HVALS user:1001 |
HGETALL key | 获取所有字段和值 (慎用,大哈希会阻塞) | HGETALL user:1001 |
批量与数值操作
| 命令 | 描述 | 示例 |
|---|
HMSET key f1 v1 f2 v2 | 批量设置多个字段 | HMSET user:1002 name "李四" age 30 |
HMGET key f1 f2 | 批量获取多个字段的值 | HMGET user:1002 name age |
HINCRBY key field increment | 将字段值增加指定整数 | HINCRBY user:1001 login_count 1 |
HSCAN key cursor MATCH pattern | 迭代哈希中的字段 | HSCAN user:1001 0 MATCH "*count*" |
3. 列表 (List)
| 命令 | 描述 | 示例 |
|---|
LPUSH key value [value ...] | 从左侧(头部)插入元素 | LPUSH mylist "world" "hello" |
RPUSH key value [value ...] | 从右侧(尾部)插入元素 | RPUSH mylist "redis" |
LPOP key | 从左侧弹出元素 | LPOP mylist |
RPOP key | 从右侧弹出元素 | RPOP mylist |
LLEN key | 获取列表长度 | LLEN mylist |
LRANGE key start stop | 获取指定范围元素 | LRANGE mylist 0 2 |
LTRIM key start stop | 保留指定范围的元素(修剪列表) | LTRIM mylist 0 99 |
BLPOP key timeout | 阻塞式左端弹出(队列用) | BLPOP queue1 30 |
BRPOP key timeout | 阻塞式右端弹出 | BRPOP queue1 30 |
4. 集合 (Set)
| 命令 | 描述 | 示例 |
|---|
SADD key member [member ...] | 添加元素到集合 | SADD tags "tech" "redis" |
SREM key member | 从集合中删除元素 | SREM tags "tech" |
SISMEMBER key member | 检查元素是否存在 | SISMEMBER tags "redis" |
SMEMBERS key | 获取集合所有元素 (慎用,大集合会阻塞) | SMEMBERS tags |
SCARD key | 获取集合元素数量 | SCARD tags |
SINTER key1 key2 | 计算集合交集 | SINTER set1 set2 |
SUNION key1 key2 | 计算集合并集 | SUNION set1 set2 |
SDIFF key1 key2 | 计算集合差集 (key1 - key2) | SDIFF set1 set2 |
SSCAN key cursor MATCH pattern | 迭代集合中的元素 | SSCAN tags 0 MATCH "user:*" |
5. 有序集合 (Sorted Set)
| 命令 | 描述 | 示例 |
|---|
ZADD key score member [score member ...] | 添加元素及分数 | ZADD leaderboard 100 "player1" |
ZREM key member | 删除元素 | ZREM leaderboard "player1" |
ZSCORE key member | 获取元素的分数 | ZSCORE leaderboard "player1" |
ZINCRBY key increment member | 增加元素的分数 | ZINCRBY leaderboard 10 "player1" |
ZCARD key | 获取集合元素总数 | ZCARD leaderboard |
| 范围查询 | | |
ZRANGE key start stop [WITHSCORES] | 按排名升序获取 (0为第1名) | ZRANGE leaderboard 0 2 WITHSCORES |
ZREVRANGE key start stop [WITHSCORES] | 按排名降序获取 | ZREVRANGE leaderboard 0 2 |
ZRANGEBYSCORE key min max | 按分数范围升序获取 | ZRANGEBYSCORE leaderboard 80 100 |
ZRANK key member | 获取元素升序排名 (从0开始) | ZRANK leaderboard "player1" |
ZREVRANK key member | 获取元素降序排名 | ZREVRANK leaderboard "player1" |
| 删除与运算 | | |
ZREMRANGEBYRANK key start stop | 按排名范围删除元素 | ZREMRANGEBYRANK leaderboard 0 2 |
ZREMRANGEBYSCORE key min max | 按分数范围删除元素 | ZREMRANGEBYSCORE leaderboard 0 60 |
ZUNIONSTORE dest numkeys key [key ...] | 计算并集并存储 | ZUNIONSTORE result 2 set1 set2 |
ZINTERSTORE dest numkeys key [key ...] | 计算交集并存储 | ZINTERSTORE result 2 set1 set2 |
四、 补充:HyperLogLog (基数估算)
一种概率性数据结构,用于在极小的内存(12KB)下估算海量数据的去重元素数量(基数),误差率约 0.81%。
| 命令 | 描述 |
|---|
PFADD key element [element ...] | 添加元素 |
PFCOUNT key | 返回估算的基数 |
PFMERGE destkey sourcekey [sourcekey ...] | 合并多个 HyperLogLog |
五、 性能与选择建议
- 键管理:生产环境严禁使用
KEYS,改用 SCAN;大集合遍历用 SSCAN/HSCAN/ZSCAN。 - 批量操作:优先使用
MSET/MGET、HMSET/HMGET 减少网络开销。 - 过期时间:缓存数据务必设置
EXPIRE,防止内存无限增长。 数据类型选型:
- 需要去重且无序:Set。
- 需要排序且唯一:Sorted Set。
- 需要有序但允许重复:List。
- 存储对象且需单独更新字段:Hash。
- 简单缓存/计数器:String。
评论