Redis 中常见的数据类型有哪些?
Redis 中常见的数据类型有哪些?
回答重点
Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。
String
字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。
使用场景:
- 缓存:存储临时数据,如用户会话、页面缓存。
- 计数器:用于统计访问量、点赞数等,通过原子操作增加或减少。
Hash
哈希是一个键值对集合,适合存储对象的属性。Redis内部使用哈希表实现,适合小规模数据。
使用场景:
- 商品详情:存储商品的各个属性,方便快速检索。
List
列表是有序的字符串集合,支持从两端推入和弹出元素,底层实现为双向链表。
使用场景:
- 消息队列:用于简单任务调度、消息传递等场景,通过
LPUSH和RPOP操作实现生产者消费者模式。 - 历史记录:存储用户操作的历史记录,便于快速访问。
Set
集合是无序且不重复的字符串集合,使用哈希表实现,支持快速查找和去重操作。
使用场景:
- 标签系统:存储用户的兴趣标签,避免重复。
- 唯一用户集合:记录访问过某个页面的唯一用户,方便进行分析。
Sorted Set
有序集合类似于集合,但每个元素都有一个分数(score),用于排序。底层使用跳表实现,支持快速的范围查询。
使用场景:
- 排行榜:存储用户分数,实现实时排行榜。
- 任务调度:根据任务的优先级进行排序,方便调度执行。
扩展知识
四种高级数据类型
随着 Redis 版本的更新,后面又增加 BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
BitMap
BitMap 是一种以位为单位存储数据的高效方式,适合用来表示布尔值(如存在性、状态等)。每个 bit 可以表示一个状态(0 或 1),使用空间少且操作快速。
使用示例:假设要统计每天用户的在线状态,可以用 Bitmap 记录每个用户是否在线:
1 | SETBIT user:online:2024-09-27 12345 1 # 用户 ID 12345 在 2024-09-27 在线 |
HyperLogLog
HyperLogLog 是一种概率性数据结构,主要用于估算基数(不同元素的数量),内存占用固定,适合处理大规模数据的去重和计数。
使用示例:假设要估算访问网站的独立用户数量:
1 | PFADD unique:visitors user1 user2 user3 # 添加用户 ID |
GEO
GEO 是 Redis 提供的一种用于存储地理位置信息的数据结构,可以存储经纬度信息并支持空间查询,例如计算距离和获取范围内的坐标。
使用示例:假设要存储城市的位置并查找距离某个城市在一定范围内的其他城市:
1 | GEOADD cities 13.361389 38.115556 "Palermo" # 添加城市 |
Stream
Stream 是 Redis 提供的一种日志数据结构,适合于存储时间序列数据或消息流。支持高效的消息生产和消费模式,具有持久性和序列化特性。
使用示例:假设要存储传感器数据流,可以使用 Stream 进行数据插入和消费:
1 | XADD sensor:data * temperature 22.5 humidity 60 # 向 Stream 添加传感器数据 |
Redis 9 种常见的基本数据类型应用场景汇总
- String :缓存对象、计数器、分布式锁、分布式 session 等
- List:阻塞队列、消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等
- Hash:缓存对象、购物车等
- Set:集合聚合计算(并集、交集、差集)的场景,如点赞、共同关注、收藏等
- Zset:最典型的就是排行榜,这个也是面试中经常问到的点
- BitMap(2.2 版新增):主要有 0 和 1 两种状态,可以用于签到统计、用户登录态判断等
- HyperLogLog(2.8 版新增):海量数据基数统计的场景,有一定的误差,可以根据场景选择使用,常用于网页 PV、UV 的统计
- GEO(3.2 版新增):存储地理位置信息的场景,比如说百度地图、高德地图、附近的人等
- Stream(5.0 版新增):这个主要就是消息队列了,可以实现一个简单的消息,其相比 list 多了两个特性,分别是自动生成全局唯一消息ID以及支持以消费组形式消费数据(同一个消息可被分发给多个单消费者和消费者组),相比 pub/sub 它是可以被持久化。