| 类型 | 描述 | 常用命令 | 典型应用场景 |
|---|---|---|---|
| String | 最基本的类型,二进制安全 | SET / GET / INCR / APPEND | 缓存对象、计数器、限流标记、Token、验证码等 |
| Hash | 类似于 Java 的 Map | HSET / HGET / HGETALL / HMSET | 缓存对象属性(如用户信息、商品详情) |
| List | 有序列表,支持两端操作 | LPUSH / RPUSH / LPOP / LRANGE | 消息队列、任务列表、时间线、评论流 |
| Set | 无序唯一集合 | SADD / SREM / SMEMBERS / SINTER | 标签系统、共同好友、抽奖去重、黑名单系统 |
| ZSet | 有序集合,元素有分数 score | ZADD / ZRANGE / ZREM / ZREVRANK | 排行榜、权重排序、延迟任务、热度排行 |
| Bitmap | 位数组(0/1)操作 | SETBIT / GETBIT / BITCOUNT | 活跃用户统计、签到打卡、唯一用户分析 |
| HyperLogLog | 基数统计(近似去重计数) | PFADD / PFCOUNT | UV统计、活动参与人数估计 |
| Geo | 地理位置数据(经纬度)支持 | GEOADD / GEODIST / GEORADIUS | 附近的人、地图选点、打车/外卖业务定位 |
| Stream | 消息队列(类似 Kafka) | XADD / XREADGROUP / XACK | 日志收集、异步消息流、延迟队列 |
✳️ 每种数据类型的适配项目场景详解
1️⃣ String:最常用类型
SET user:token:123 abcXYZ
GET user:token:123
INCR page:view:home
-
✅ 适合缓存单个值,比如 token、用户信息快照、秒杀库存、验证码等
-
✅ 也可以序列化整个对象为 JSON 存入(fastjson/jackson)
2️⃣ Hash:结构化对象缓存
HMSET user:1001 name "张三" age 25
HGETALL user:1001
-
✅ 用于缓存用户、商品、订单等对象字段
-
✅ 节省空间,支持字段级别读取与更新
3️⃣ List:有序、支持队列操作
LPUSH queue:order 1001
RPOP queue:order
-
✅ 常用于消息队列、任务队列、聊天记录
-
✅ 左进右出:先进先出;支持分页读取(
LRANGE)
4️⃣ Set:无序唯一集合
SADD tag:article:123 java redis
SISMEMBER tag:article:123 java
-
✅ 标签系统、共同好友、黑名单、点赞用户集合
-
✅ 支持集合操作:交集、并集、差集
5️⃣ ZSet:有序集合,按分数排序
ZADD rank:score 100 user1
ZADD rank:score 200 user2
ZRANGE rank:score 0 1
-
✅ 实现排行榜、热度值、评论排序、任务延时调度(分数=时间戳)
6️⃣ Bitmap:位图结构,节省空间
SETBIT signin:20240619 12345 1
GETBIT signin:20240619 12345
BITCOUNT signin:20240619
-
✅ 活跃用户、每日签到、布尔状态标识(0/1)
-
✅ 能高效存储亿级用户维度的数据
7️⃣ HyperLogLog:近似去重计数
PFADD uv:20240619 user1 user2 user3
PFCOUNT uv:20240619
-
✅ 大量唯一元素去重统计,误差 <1%
-
✅ 适合 UV/活跃用户去重统计,内存占用极低(12KB)
8️⃣ Geo:地理位置服务
GEOADD shop:geo 116.40 39.90 shop_beijing
GEORADIUS shop:geo 116.40 39.90 10 km
-
✅ 附近的人/店,LBS场景
-
✅ 可查询距离、范围、排序
9️⃣ Stream:消息队列型数据结构
XADD log:order * orderId 123 status CREATED
XREADGROUP GROUP g1 c1 STREAMS log:order >
-
✅ 类似 Kafka,支持持久化、ACK、消费者组
-
✅ 适用于日志系统、消息流、下单异步处理
✅ 总结表:你可以在面试时引用 👇
| 类型 | 关键特性 | 高频应用场景 |
|---|---|---|
| String | 最简单、灵活 | 缓存、计数、限流、验证码、配置 |
| Hash | 多字段对象缓存 | 用户信息、商品详情、配置项缓存 |
| List | 有序、可作队列 | 消息队列、聊天记录、订单列表 |
| Set | 无序唯一集合 | 标签系统、点赞、去重、黑名单 |
| ZSet | 有序+权重 | 排行榜、热度榜、延迟任务 |
| Bitmap | 位操作、布尔值 | 签到、活跃用户、权限位图 |
| HyperLogLog | 基数估算 | UV 去重、访问人数统计 |
| Geo | 经纬度存储查询 | 附近的人、附近店、地图服务 |
| Stream | 消息流/队列 | 日志收集、异步处理、事件驱动 |
🧠 面试答法推荐:
Redis 提供了丰富的数据结构:
最常用的是
String,支持计数、缓存、状态标记;
Hash可以结构化存储用户或商品数据;
List/Set/ZSet对应队列、集合、排行榜场景;Bitmap 和 HyperLogLog 是高性能空间压缩结构,用于活跃统计;
Stream 则适用于复杂的消息队列处理;
实际开发中我们会根据业务场景选用最合适的数据结构,以减少内存占用和提高读写效率。

485

被折叠的 条评论
为什么被折叠?



