菜鸟笔记
提升您的技术认知

Redis 常见数据类型

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)
– 布隆过滤器
– 基于字符串实现(本质是二进制数组) – 按位操作,避免整键读取
– 大位图可分段存储

补充说明

  1. 数据类型选择原则

    • 简单键值对:字符串(String)
    • 对象存储:哈希(Hash)
    • 有序列表:列表(List)或有序集合(Sorted Set)
    • 去重与集合运算:集合(Set)
    • 统计基数:HyperLogLog
    • 位操作:位图(Bitmap)
    • 地理位置:地理空间(Geospatial)
  2. 内存优化关键

    • 压缩列表(ziplist):当哈希、列表元素较少且值较小时自动触发,内存占用更低。
    • 批量操作:使用MSET/MGETHMSET/HMGET减少网络开销。
    • 过期策略:合理设置EXPIRE时间,避免冷数据长期占用内存。
  3. 性能注意事项

    • O (N) 命令:如KEYS *LRANGE list 0 -1SMEMBERS,可能阻塞主线程,生产环境慎用。
    • 大对象:单个键值超过 10KB 时需谨慎,可能导致内存碎片或网络传输瓶颈。
  4. 底层编码转换
    Redis 会根据数据量和类型自动转换编码(如小哈希从 ziplist 转为 hashtable),可通过OBJECT ENCODING key查看。