目录
Redis 常见数据类型与应用场景总结
1. String(字符串)
特点
- 最基本键值结构,值最大512MB
- 支持文本/二进制数据,可存储数字
- 底层结构:int/SDS(简单动态字符串)
- 编码方式:int/embstr(短字符串)/raw(长字符串)
常用命令
SET key value
GET key
INCR key
DECR key
SETNX key value
MSET key1 val1 key2 val2
应用场景
- 缓存对象(JSON格式/字段分离存储)
- 计数器(阅读量/点赞量)
- 分布式锁(SETNX + Lua脚本)
- 共享Session存储
2. List(列表)
特点
- 有序元素集合,支持双向操作
- 底层结构:quicklist(3.2+版本)
- 最大长度 2^32-1
常用命令
LPUSH/RPUSH
LPOP/RPOP
# 返回列表key中指定区间内的元素,区间以偏移量start和stop指定,从0开始
LRANGE key start stop
# 从key列表表头弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞
BLPOP key [key ...] timeout
# 从key列表表尾弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞
BRPOP key [key ...] timeout
应用场景
- 消息队列(LPUSH+BRPOP)
- 最新消息排行(LTRIM保持固定长度)
- 阻塞队列实现
局限性:不支持消费组,消息需自行实现ID
3. Hash(哈希)
特点
- 字段值映射表,适合存储对象
- 底层结构:listpack(7.0+)或哈希表
常用命令
HSET key field value
HGETALL key
HINCRBY key field increment
HDEL key field
应用场景
- 对象存储(用户信息等)
- 购物车系统(用户ID+商品ID+数量)
- 频繁修改的字段存储
4. Set(集合)
特点
- 无序唯一元素集合
- 底层结构:整数集合/哈希表
- 支持交并差运算
常用命令
SADD key member
SINTER key1 key2
SISMEMBER key member
SPOP key
应用场景
- 点赞/签到统计
- 共同关注(交集)
- 随机抽奖(SRANDMEMBER/SPOP)
- 数据去重
5. Zset(有序集合)
特点
- 带score排序的集合
- 底层结构:listpack(7.0+)或跳表
- 元素唯一,score可重复
常用命令
ZADD key score member
ZRANGE key start stop
ZREVRANK key member
ZRANGEBYSCORE
应用场景
- 排行榜(文章热度排序)
- 电话/姓名排序(ZRANGEBYLEX)
- 延迟队列(score存时间戳)
6. BitMap(位图)
特点
- 二进制位操作,极致空间利用
- 底层基于String实现
常用命令
SETBIT key offset 1
GETBIT key offset
BITCOUNT key
BITOP AND/OR/XOR
应用场景
- 用户签到统计
- 活跃用户分析
- 布隆过滤器实现
7. HyperLogLog
特点
- 基数统计(0.81%误差率)
- 固定12KB存储空间
- 支持2^64元素统计
常用命令
PFADD key element
PFCOUNT key
PFMERGE destkey sourcekey
应用场景
- 百万级UV统计
- 大规模独立IP计数
- 搜索词热度估算
8. GEO(地理位置)
特点
- 基于Sorted Set实现
- 使用GeoHash编码存储坐标
- 支持半径查询
常用命令
GEOADD key lon lat member
GEOSEARCH key FROMLONLAT lon lat radius
GEODIST key member1 member2
应用场景
- 附近的人/店铺查询
- 打车服务位置匹配
- 物流轨迹记录
9. Stream(流)
特点
- 消息队列专用类型(5.0+)
- 支持消息持久化/消费组
- 自动生成全局唯一ID
常用命令
XADD key * field value
XREADGROUP GROUP group consumer
XACK key group id
应用场景
- 消息队列(支持ACK确认)
- 事件溯源系统
- 日志收集管道
与专业MQ对比:内存限制,无磁盘持久化
总结对比表
数据类型 | 特性 | 典型场景 | 版本 |
---|---|---|---|
String | 简单键值 | 缓存/计数器/锁 | 1.0 |
List | 有序可重复 | 消息队列/最新列表 | 1.0 |
Hash | 字段映射 | 对象存储/购物车 | 2.0 |
Set | 无序唯一 | 标签/社交关系 | 1.0 |
Zset | 有序唯一 | 排行榜/优先级队列 | 1.2 |
BitMap | 位操作 | 二值状态统计 | 2.2 |
HyperLogLog | 基数估算 | 大数据量UV统计 | 2.8 |
GEO | 地理位置 | LBS服务 | 3.2 |
Stream | 消息持久化/消费组 | 消息队列 | 5.0 |
使用建议
- String:简单键值场景首选,注意大value的内存消耗
- List:简单消息队列使用,注意消息可靠性处理
- Hash:字段频繁修改的对象存储,避免大hash问题
- Zset:排序场景必选,注意score设计
- Stream:需要消费组的复杂消息队列场景
- BitMap:二值状态统计时替代Set节省内存
- HyperLogLog:允许误差的大数据量统计场景
- GEO:地理位置相关服务直接使用内置API
注意:消息队列场景中,当消息量超过百万级或需要严格持久化时,建议使用专业MQ(如Kafka/RabbitMQ)