Redis8大数据类型全解析|底层结构+适用场景+高级用法

51 阅读5分钟

🔥 后端/测试/运维必看!Redis作为高频面试考点+实际开发核心组件,搞懂这8种数据类型的底层逻辑和用法,效率直接翻倍!整理了超全干货,收藏慢慢看~

一、基础数据类型(5种核心)

📝 String(字符串)

底层结构:简单动态字符串(SDS),类似Java的ArrayList,预分配冗余空间减少内存碎片

适用场景

  • 缓存热点数据(如商品详情、用户信息)
  • 计数器(点赞数、访问量、秒杀库存)
  • 分布式锁(setnx命令)
  • Session共享(存储用户登录状态)

高级用法

  • 位操作(GETBIT/SETBIT):统计用户在线状态、判断用户是否签到
  • INCR/DECR原子操作:秒杀场景防超卖
  • APPEND字符串拼接:日志追加存储

📋 List(列表)

底层结构:双向链表(3.2版本前)、压缩列表(ziplist)+快速列表(quicklist,3.2版本后),平衡内存和性能

适用场景

  • 消息队列(简单FIFO队列,lpush+rpop)
  • 排行榜(最新评论、最新订单,lrange取前N)
  • 用户关注列表/消息列表

高级用法

  • 阻塞队列(brpop/blpop):处理消息消费,避免轮询浪费资源
  • ltrim修剪列表:只保留指定范围元素,控制内存占用
  • rpoplpush:消息消费备份,防止消息丢失

🗂️ Hash(哈希)

底层结构:压缩列表(ziplist)+哈希表(dict),元素少用ziplist节省内存,元素多用dict提升查询效率

适用场景

  • 存储对象(用户信息、商品属性,field对应属性名,value对应属性值)
  • 购物车(key为用户ID,field为商品ID,value为数量)
  • 配置信息存储(分字段存储,便于单独修改)

高级用法

  • hincrby:购物车商品数量增减
  • hmget/hmset:批量获取/设置对象属性,减少网络交互
  • hscan:遍历大哈希表,避免keys命令阻塞

🔍 Set(集合)

底层结构:整数集合(intset)+哈希表(dict),元素为整数且少时用intset,否则用dict(value为null)

适用场景

  • 去重(如用户历史浏览记录去重)
  • 社交场景(共同好友、好友推荐, sinter求交集)
  • 抽奖活动(srandmember随机取元素、spop随机删除元素)

高级用法

  • 集合运算(sinter交集、sunion并集、sdiff差集):实现好友匹配、标签筛选
  • scard统计元素个数:快速获取去重后数据量
  • smove:元素在集合间转移,实现权限变更等场景

🏆 ZSet(有序集合)

底层结构:压缩列表(ziplist)+跳表(skiplist)+哈希表(dict),元素少用ziplist,元素多用跳表+dict(跳表存排序,dict存value-score映射)

适用场景

  • 排行榜(销量榜、积分榜、热度榜,zrange/zrevrange)
  • 延迟队列(score为时间戳,zrangebyscore取到期任务)
  • 范围查询(如查询积分100-200的用户)

高级用法

  • zincrby:积分增减,实时更新排行榜
  • zrank/zrevrank:获取元素排名,展示用户名次
  • zremrangebyscore:删除指定分数范围元素,清理过期任务

二、高级数据类型(3种拓展)

🔢 Bitmap(位图)

底层结构:基于String实现,本质是二进制位数组,每个位对应0/1状态

适用场景

  • 用户签到(1位代表1天,365天仅需46字节)
  • 在线状态统计(0离线/1在线,快速统计在线人数)
  • 布隆过滤器底层(判断元素是否存在,减少缓存穿透)

高级用法

  • BITOP:多位图运算(与/或/异或),统计共同签到用户
  • BITCOUNT:统计指定范围1的个数,即签到天数
  • BITPOS:查找第一个0/1的位置,找到第一个未签到的日期

🗺️ 地理信息索引(GEO)

底层结构:基于ZSet实现,将经纬度转换为geohash编码作为score,利用ZSet有序性实现距离排序

适用场景

  • 附近的人/店铺(LBS应用,georadius/georadiusbymember)
  • 距离计算(两地距离、用户与店铺距离)
  • 区域筛选(查找指定范围内的POI)

高级用法

  • geohash:获取元素的geohash编码,用于精准定位
  • geodist:计算两个位置的距离,支持m/km/mi/ft单位

georem:删除指定地理信息元素

📊 HyperLogLog

底层结构:基于String实现,核心是概率算法,通过存储多个哈希值的前导零个数来估算基数,内部由多个桶(bucket)组成,每个桶记录对应哈希值的最大前导零位数

适用场景

  • 海量数据基数统计(如网站UV、APP日活/月活统计)
  • 用户行为统计(如点击量、浏览量的去重计数)
  • 低精度去重统计场景(允许极小误差,追求内存高效)

高级用法

  • PFADD:向HyperLogLog添加元素,支持批量添加多个元素
  • PFCOUNT:统计HyperLogLog的基数(估算值),支持同时统计多个HyperLogLog的合并基数
  • PFMERGE:合并多个HyperLogLog,得到合并后的基数统计结果(如合并多天UV得到周UV)

三、学习小贴士

  1. 记底层结构不用死记!重点看“为什么选这个结构”——都是平衡内存和性能的选择
  2. 场景题是面试高频!把“数据类型+场景”对应起来,比如看到排行榜就想ZSet,看到去重就想Set
  3. 实际开发优先用高级用法!比如阻塞队列、原子操作,能避免很多坑
  4. 收藏这篇,遇到Redis问题直接查,不用再翻厚重的文档啦~