Redis 常见的数据类型
一、五种基本数据类型
1、String
1.1 底层数据结构:SDS
与原生 C 语言字符串相比
(1)SDS 不仅可以存放文本数据还可以存放二进制数据,所以可以存放图片、视频、音频等数据;
(2)SDS 获取字符串长度的复杂度为O(1);
(3)SDS 不会造成缓存区溢出。
扩容机制
当字符串长度小于1M的时候扩容是加倍现有的空间;如果超过1M则每次扩容增加1M的空间;空间上限是512M。
1.2 应用场景
(1)缓存对象
(2)常规计数,如:点赞数、阅读量、转发数等
(3)分布式锁
(4)共享 session 信息
2、List
2.1 底层数据结构:双向链表或压缩列表
⚪如果列表的元素个数小于 512 个(默认值,可由 list-max-ziplist-entries 配置),列表每个元素的值都小于 64 字节(默认值,可由 list-max-ziplist-value 配置),Redis 会使用压缩列表作为 List 类型的底层数据结构;
⚪如果列表的元素不满足上面的条件,Redis 会使用双向链表作为 List 类型的底层数据结构;
但是在 Redis 3.2 版本之后,List 数据类型底层数据结构就只由 quicklist 实现了,替代了双向链表和压缩列表。
2.2 应用场景
(1)消息队列
存储信息时必须满足三个需求:消息保序、处理重复的消息、保证消息的可靠性。
3、Hash
3.1 底层数据结构:压缩列表或哈希表
⚪如果哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构;
⚪如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的底层数据结构。
在 Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。
3.2 应用场景
(1)缓存对象
在介绍 String 类型的应用场景时有所介绍,String + Json也是存储对象的一种方式,那么存储对象时,到底用 String + json 还是用 Hash 呢?
一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。
(2)购物车
4、Set
4.1 底层数据结构:哈希表或整数集合
⚪如果集合中的元素都是整数且元素个数小于 512 (默认值,set-maxintset-entries配置)个,Redis 会使用整数集合作为 Set 类型的底层数据结构;
⚪如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。
4.2 应用场景
(1)点赞(一个用户只能点赞一次)
(2)交并集(共同关注、共同好友)
(3)抽奖活动
5、ZSet
5.1 底层数据结构:压缩列表或跳表
⚪如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构;
⚪如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;
在 Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。
Zset 的实现原理是通过跳跃表提供有序性,使元素按照分数进行排序,而哈希表则用于维护元素的唯一性和快速检索。这种组合使得 Redis 能够高效地处理有序集合的操作,包括添加元素、删除元素、按分数范围获取元素等。
5.2 应用场景
(1)排行榜
(2)电话、姓名排序
二、三种特殊数据类型
1、BitMap
1.1 底层数据结构:String
Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。
String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态,你可以把 Bitmap 看作是一个 bit 数组。
1.2 应用场景(只需要一个bit位来表示某个元素对应的值或状态)
(1)用户的在线状态
(2)签到统计
(3)连续签到用户总数
2、GEO
2.1 底层数据结构:Sorted Set
2.2 应用场景
(1)对二维地图做区间划分
(2)对区间进行编码
(3)滴滴叫车
3、HyperLogLog
3.1 应用场景
(1)百万级网页UV计数