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
查看。