
Redis 8 大数据类型完整实战场景看完不再只会 get/setRedis 不是一个简单的 key-value 缓存。它有 8 种数据类型每种类型都对应一套完整的业务场景。大多数人只会SET和GET等于开着法拉利在小区里遛弯。今天把这 8 种类型的底层原理 实战场景一次性讲透。一、String —— 万能型选手但别只当字符串用底层结构简单动态字符串SDS预分配冗余空间内存连续杜绝碎片。别被名字骗了value 可以存数字、JSON 甚至二进制。 实战场景场景命令要点缓存商品详情SET product:1001 {name:手表,price:899} EX 1800EX 控制过期防缓存雪崩秒杀库存扣减SET inventory:sku NX Lua 脚本DECRNX 防重复初始化Lua 保证原子性分布式锁SET lock:task uuid123 NX EX 30EX 自动释放防死锁Lua 脚本安全删除短信验证码SET sms:13800138000 884716 EX 60GETDELGETDEL 保证一次性使用防重复当日操作计数SET user:1001:20260622_click 0 EX 86400INCR键名带日期自动归档INCR 原子计数错误次数限流INCR error:13800138000 EX 3600独立计数器每小时最多 5 次关键认知String 是原子操作最多的类型。INCR/DECR/GETSET全部是单线程原子执行高并发计数场景的首选。性能提示超过 10KB 的数据考虑拆分存储数值型数据直接SET key 42Redis 会自动用 int 编码比存字符串省 3 倍空间。二、Hash —— 存储对象的天然容器底层结构ziplist元素少、值短时 hashtable元素多时自动切换。Hash的结构是key → field → value和对象的id → 属性 → 值完全同构。 实战场景场景命令要点缓存用户信息HSET user:1001 name Alice age 30 email ax.com独立更新某个字段无需读写整个对象电商购物车HSET cart:1001 product:558 2 product:889 1用户 ID 为 key商品 ID 为 field数量为 value文章互动计数HINCRBY article:998 likes 1点赞/评论/分享聚合在一个 key 下会话数据HSET session:abc token xyz expire 1700000000比存 JSON 串省带宽更新字段不用全量重写核心优势相比把整个对象序列化为 JSON 存 StringHash 可以只修改一个字段网络开销和并发冲突都大幅降低。坑点HGETALL/HKEYS/HVALS在元素过多时会阻塞 Redis生产环境请用HSCAN渐进式遍历。三、List —— 被低估的消息队列底层结构3.2 之前是双向链表之后是 quicklistziplist 链表节点兼顾内存和性能。 实战场景场景命令要点消息队列FIFOLPUSH queue:order msgBRPOP queue:order 0BRPOP 阻塞等待避免空转轮询最新 N 条记录LPUSH timeline:user1 post_idLTRIM timeline:user1 0 99只保留最新 100 条自动淘汰旧数据消息消费备份RPOPLPUSH queue:main queue:backup消费后自动备份防消息丢失关键认知Redis 的 List 就是一个轻量级消息队列。虽然不如 RabbitMQ/Kafka 专业但对于日志采集、异步通知、简单任务队列性能足够且部署成本极低。四、Set —— 去重 集合运算的利器底层结构intset全整数且 ≤512 个元素 hashtable。Set 的杀手锏不是存数据而是集合运算交集、并集、差集。 实战场景场景命令要点用户标签系统SADD user:1:tag 数码 运动自动去重无需判断是否已存在共同好友SINTER user:1:friends user:2:friends一条命令求交集O(N) 复杂度抽奖随机抽SPOP lottery:20260622 1随机弹出且自动删除天然公平推荐系统共同兴趣SINTER tag1:users tag2:users找同时喜欢两个标签的用户黑白名单SISMEMBER blacklist:ip 1.2.3.4O(1) 判断是否在名单中核心优势SINTER/SUNION/SDIFF三个命令把原来需要多表 JOIN 的逻辑压缩成一条 Redis 命令性能提升不是一个量级。五、ZSet有序集合—— 排行榜的唯一答案底层结构跳表skiplist hashtableZADD时间复杂度 O(log N)。元素不重复但每个元素关联一个score按分数排序。 实战场景场景命令要点商品销量榜ZADD rank:sales 1000 product:001销量即 scoreZREVRANGE取 Top N游戏排行榜ZADD rank:game 9527 player:abc分数可增减ZINCRBY rank:game 10 player:abc延迟队列ZADD delay:queue 1719072000 task_id用时间戳作 scoreZRANGEBYSCORE取出到期任务热搜榜ZADD hotsearch:20260622 884716 关键词实时更新热度分数ZREVRANGE 0 9 WITHSCORES高级选项Redis 6.2ZADD key NX member score— 只添加新成员ZADD key XX member score— 只更新已有成员ZADD key GT member score— 仅当新分数更高时才更新ZADD key LT member score— 仅当新分数更低时才更新这些选项让排行榜逻辑不再需要先查后写一条命令搞定。六、Geospatial —— 地理位置计算Redis 3.2 推出底层用 zset 存储经纬度。 实战场景场景命令要点附近的人GEOADD cities:taiyuan 112.55 37.87 user:001经度在前纬度在后计算距离GEODIST cities:taiyuan user:001 user:002 m返回米数底层是 Haversine 公式附近商户GEORADIUS cities:taiyuan 112.55 37.87 5000 m5 公里范围内的所有点适用范围外卖、打车、社交附近的人。需要先下载城市数据通过程序一次性导入。七、HyperLogLog —— 统计 UV 的神器底层原理基数统计算法固定占用12KB内存可统计 2^64 个不同元素。 实战场景场景对比要点网站 UV 统计PFADD uv:20260622 user_id传统用 Set 存所有 user_id1 亿 UV 占用几 GBPFCOUNT uv:20260622HyperLogLog 只要 12KB误差仅 0.81%核心认知HyperLogLog 的目的是计数不是存储。它不保存具体数据只告诉你大概有多少个不同的人来过。对于 UV、日活这类指标它是最优解。八、Bitmap —— 位运算统治状态统计底层结构最小单位是 bit每个 bit 只有 0 或 1。 实战场景场景命令要点用户签到统计SETBIT sign:202606 user_id 11 亿用户签到状态只需 ~12MB在线状态SETBIT online:20260622 user_id 1BITCOUNT online:20260622即时在线人数每日活跃BITCOUNT active:20260622一条命令统计 DAU用户行为分析SETBIT feature:a user_id 1记录用户是否使用过某功能核心优势1 亿个用户的在线状态用 String 存要 1 亿字节用 Bitmap 只要 ~12MB。BITOP AND/OR/XOR还能做用户群体交叉分析。总结一张表选对类型数据类型一句话定位最佳场景String万能原子操作基座缓存、计数、分布式锁、限流Hash对象存储专用容器用户信息、购物车、会话List轻量级消息队列最新列表、任务队列、日志Set去重 集合运算标签、共同好友、抽奖ZSet按分数排序的集合排行榜、延迟队列、热搜Geospatial地理位置计算附近的人、周边商户HyperLogLog海量基数统计UV、DAU、独立访客Bitmap位级状态统计签到、在线状态、行为分析Redis 的 8 种数据类型不是面试考点是生产环境的武器库。选对类型性能差的不是一点半点——是一个量级。