Redis(C语言实现)支持以下9种核心数据类型及其适用场景:
String(字符串)
SET user:1001 "John" EX 60
(缓存用户信息60秒)Hash(哈希表)
场景:存储对象属性、购物车数据
示例:HMSET product:1001 name "Phone" price 599 stock 50
HMSET product:1001 name “Phone” price 599 stock 50这条命令的意思是,在Redis数据库中为一个名为product:1001的key设置了一个hash结构的数据,这个hash结构中包含了三个字段(field):name、price和stock,它们对应的值(value)分别是"Phone"、599和50。
优势:字段级原子操作,节省网络流量
原子:单命令操作或Lua脚本,节省:按需取hash结构的返回内容,如果是string存json,需要返回所有json
存储结构:ziplist(元素≤512)或hashtable
快速查找:hashtable实现O(1)字段访问
List(列表)
LPUSH news "Breaking: Redis 7 released"
Set(集合)
SADD article:1234 tags "tech" "database"
5. Sorted Set(有序集合)
场景:排行榜、范围查询
Sorted Set非常适合用于实现排行榜功能,因为元素会根据分数自动排序。同时,它也支持范围查询,可以方便地获取指定分数范围内的元素。
示例:ZADD leaderboard 3500 “playerA” 2800 “playerB”
这条命令向名为leaderboard的Sorted Set中添加了两个元素,playerA的分数为3500,playerB的分数为2800。
优势:自动排序+范围查询
Sorted Set的最大优势在于它能够自动根据分数对元素进行排序,并且支持高效的范围查询。
存储结构:跳跃表+哈希表组合
Sorted Set的底层存储结构结合了跳跃表和哈希表。跳跃表用于维护元素的排序顺序,而哈希表则用于快速查找元素的分数。
快速查找:score范围查询O(logN),member查score O(1)
在Sorted Set中,进行分数范围查询的时间复杂度为O(logN),而根据元素查找其分数的时间复杂度为O(1)。
6. Bitmaps(位图)
场景:用户在线状态、特征标记
Bitmaps非常适合用于表示大量的布尔值数据,如用户的在线状态或某些特征的标记。
示例:SETBIT online_users 1001 1
这条命令将online_users位图的第1001位设置为1,通常用于表示某个用户(如用户ID为1001)的在线状态。
优势:极端内存优化(1bit/标记)
Bitmaps的最大优势在于其内存使用效率极高,每个标记只占用1bit。
存储结构:String类型扩展
在Redis中,Bitmaps实际上是基于String类型进行扩展实现的。
7. HyperLogLog
场景:UV统计
HyperLogLog是一种用于估算大数据集基数的概率算法,非常适合用于UV(独立访客)统计等场景。
示例:PFADD visitors 192.168.1.1 192.168.1.2
这条命令向名为visitors的HyperLogLog中添加了两个元素(通常是用户的IP地址)。
优势:固定12KB存储任意基数
HyperLogLog算法的最大优势在于其内存使用非常固定,无论数据集的大小如何,都只需要12KB的内存空间。
存储结构:密集寄存器数组
HyperLogLog的底层存储结构是基于密集寄存器数组实现的。
快速查找:仅支持基数估算
需要注意的是,HyperLogLog只支持基数的估算,而不支持精确计算。其查找操作实际上是估算操作,时间复杂度较低。
8. Geospatial(地理空间)
场景:附近的人
Geospatial数据类型非常适合用于实现“附近的人”等基于地理位置的查询功能。
示例:GEOADD cities 116.397128 39.916527 “Beijing”
这条命令向名为cities的地理空间数据集中添加了一个地理位置,经度为116.397128,纬度为39.916527,标记为"Beijing"。
优势:GeoHash编码优化
Geospatial数据类型使用了GeoHash编码对地理位置进行编码和优化,提高了查询效率。
存储结构:Sorted Set扩展
在Redis中,Geospatial数据类型实际上是基于Sorted Set进行扩展实现的。
快速查找:GEORADIUS使用跳表O(logN)
使用GEORADIUS命令进行地理位置范围查询时,其时间复杂度为O(logN),因为底层使用了跳表结构进行优化。
9. Stream(流)
- 示例:XADD orders * productID 1001 userID 5566
这条命令向名为orders的Stream中添加了一条消息,消息ID由Redis自动生成(*表示),消息体包含productID和userID两个字段。
优势:支持消费者组和ACK机制
Stream数据类型的最大优势在于其支持消费者组和ACK(确认)机制,可以方便地实现消息的分发和消费确认。
存储结构:基数树(Rax)
在Redis中,Stream数据类型的底层存储结构是基于基数树(Rax)实现的。
快速查找:ID范围查询O(logN)
使用Stream数据类型进行ID范围查询时,其时间复杂度为O(logN),因为底层使用了高效的数据结构进行优化。
设计哲学与限制原因:
扩展方式: