🔥 后端/测试/运维必看!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)
三、学习小贴士
- 记底层结构不用死记!重点看“为什么选这个结构”——都是平衡内存和性能的选择
- 场景题是面试高频!把“数据类型+场景”对应起来,比如看到排行榜就想ZSet,看到去重就想Set
- 实际开发优先用高级用法!比如阻塞队列、原子操作,能避免很多坑
- 收藏这篇,遇到Redis问题直接查,不用再翻厚重的文档啦~