Redis 常见数据类型
数据类型 | 特点 | 典型命令 | 应用场景 | 底层实现 | 内存优化建议 |
---|---|---|---|---|---|
字符串 (String) |
– 最基础类型 – 二进制安全(可存储图片、JSON 等) – 最大支持 512MB |
SET key value GET key INCR key MSET k1 v1 k2 v2 |
– 缓存(如用户信息) – 计数器(点赞数、访问量) – 分布式锁( SETNX ) |
– 短字符串:embstr 编码(一次内存分配) – 长字符串:raw 编码(两次内存分配) |
– 避免大字符串(>10KB) – 批量操作使用 MSET /MGET |
哈希 (Hash) |
– 键值对集合(field→value) – 类似 Java 的 HashMap |
HSET hash field value HGET hash field HGETALL hash HINCRBY |
– 存储对象(如用户详情) – 存储配置项(如应用配置) |
– 小哈希:压缩列表(ziplist) – 大哈希:哈希表(hashtable) |
– 控制元素数量(默认 < 512) – 值长度 < 64 字节(触发压缩列表) |
列表 (List) |
– 有序可重复 – 支持双向插入 / 删除 – 底层为双向链表 |
LPUSH list value1 value2 RPOP list LRANGE list 0 -1 BLPOP |
– 消息队列(FIFO/LIFO) – 最新动态列表(如微博时间线) |
– 小列表:压缩列表(ziplist) – 大列表:快速列表(quicklist) |
– 避免一次性获取全量数据(LRANGE 0 -1 )– 使用 BLPOP 实现阻塞队列 |
集合 (Set) |
– 无序唯一 – 支持交集 / 并集 / 差集运算 |
SADD set member1 member2 SMEMBERS set SINTER set1 set2 SCARD |
– 去重(如用户标签) – 社交关系(共同好友) – 抽奖系统(随机取元素) |
– 整数集合(intset):全整数元素 – 哈希表(hashtable):含字符串元素 |
– 控制元素数量(>512 自动转为哈希表) – 批量操作使用 SUNIONSTORE |
有序集合 (Sorted Set) |
– 每个元素关联分数(score) – 按分数排序(支持范围查询) |
ZADD zset score1 member1 score2 member2 ZRANGE zset 0 -1 WITHSCORES ZINCRBY |
– 排行榜(如游戏积分) – 时间线(按时间戳排序) – 带权重的任务调度 |
– 跳表(skiplist)+ 哈希表 – 小数据:压缩列表(ziplist) |
– 避免大范围查询(ZRANGE 参数过大)– 定期清理过期数据 |
位图 (Bitmap) |
– 基于位操作的字符串 – 每个位存储 0/1 |
SETBIT key offset value GETBIT key offset BITCOUNT key |
– 签到统计(每日 1 位) – 用户活跃状态(亿级用户仅需 12.5MB) – 布隆过滤器 |
– 基于字符串实现(本质是二进制数组) | – 按位操作,避免整键读取 – 大位图可分段存储 |
补充说明
-
数据类型选择原则
- 简单键值对:字符串(String)
- 对象存储:哈希(Hash)
- 有序列表:列表(List)或有序集合(Sorted Set)
- 去重与集合运算:集合(Set)
- 统计基数:HyperLogLog
- 位操作:位图(Bitmap)
- 地理位置:地理空间(Geospatial)
-
内存优化关键
- 压缩列表(ziplist):当哈希、列表元素较少且值较小时自动触发,内存占用更低。
- 批量操作:使用
MSET
/MGET
、HMSET
/HMGET
减少网络开销。 - 过期策略:合理设置
EXPIRE
时间,避免冷数据长期占用内存。
-
性能注意事项
- O (N) 命令:如
KEYS *
、LRANGE list 0 -1
、SMEMBERS
,可能阻塞主线程,生产环境慎用。 - 大对象:单个键值超过 10KB 时需谨慎,可能导致内存碎片或网络传输瓶颈。
- O (N) 命令:如
-
底层编码转换
Redis 会根据数据量和类型自动转换编码(如小哈希从 ziplist 转为 hashtable),可通过OBJECT ENCODING key
查看。