一. 底层数据结构
数据类型 | 实现数据结构 |
---|---|
String | SDS(动态字符串) |
List | LinkedList(双向链表)/ZipList(压缩列表)/QuickList(快速列表) |
Hash | Dict、ZipList |
Set | Dict、Intset(整数集合) |
Zset | ZipList、SkipList(跳表) |
数据类型与使用场景
1. String
1.1 类型说明
1.2 常用命令
1.3 基本演示
1.4 使用场景
- 缓存,热点数据
- 分布式数据共享(多个应用之间共享)
- 分布式锁(setnx方法,只有不存在时才能添加成功)
- 全局ID
- 全局ID
- 计数器
- 计数器
- 限流(int类型)INCR方法
2. Hash
2.1 类型说明
2.2 常用命令
2.3 基本演示
2.4 使用场景
- 涉及多个key的话,可以考虑hash存储,如用户信息,购物车信息
- string可以做的,hash都可以做
3. Set
3.1 类型说明
3.2 常用命令
3.3 基本演示
3.4 使用场景
- 抽奖(随机获取元素)
- 抽奖(随机获取元素)
- 点赞、签到、打卡
- 点赞、签到、打卡
- 商品标签
- 商品标签
- 商品筛选
4. List
4.1 类型说明
4.2 常用命令
4.3 基本演示
4.4 使用场景
- 消息列表(公告列表,活动列表,评论列表等)
- 消息列表(公告列表,活动列表,评论列表等)
- 队列/栈
5. ZSet
5.1 类型说明
5.2 常用命令
5.3 基本演示
5.4 使用场景
6. Bitmap(位图)
6.1 类型说明
- Bitmap 不是 Redis 中的实际数据类型,而是在 String 类型上定义的一组面向位的操作,将其视为位向量。由于字符串是二进制安全的块,且最大长度为 512 MB,它们适合用于设置最多 2^32 个不同的位。
6.2 常用命令
常用命令 | 备注 |
---|---|
SETBIT key offset value | 设置指定 offset 位置的值 |
GETBIT key offset | 获取指定 offset 位置的值 |
BITCOUNT key start end | 获取 start 和 end 之间值为 1 的元素个数 |
BITOP operation destkey key1 key2 ... | 对一个或多个 Bitmap 进行运算,可用运算符有 AND, OR, XOR 以及 NOT |
6.3 基本演示
6.4 使用场景
- 对一个或多个key 求逻辑或/逻辑并/逻辑异或/逻辑非
-
- 需要保存状态信息(0/1 即可表示)的场景
- 如 用户签到,活跃用户,用户行为统计(是否点击)
7. HyperLogLog
7.1 类型说明
- HyperLogLog 是一种有名的基数计数概率算法 ,基于 LogLog Counting(LLC)优化改进得来,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。Redis 提供的 HyperLogLog 占用空间非常非常小,只需要 12k 的空间就能存储接近2^64个不同元素。并且,Redis 对 HyperLogLog 的存储结构做了优化,采用两种方式计数:
- 稀疏矩阵:计数较少的时候,占用空间很小。
- 稠密矩阵:计数达到某个阈值的时候,占用 12k 的空间。
- 基数结果并不精确,存在一定的误差(标准误差为0.81%)
7.2 常用命令
常用命令 | 备注 |
---|---|
PFADD key element1 element2 ... | 添加一个或多个元素到 HyperLogLog 中 |
PFCOUNT key1 key2 | 获取一个或者多个 HyperLogLog 的唯一计数 |
PFMERGE destkey sourcekey1 sourcekey2 ... | 将多个 HyperLogLog 合并到 destkey 中,destkey 会结合多个源,算出对应的唯一计数 |
7.3 基本演示
7.4 使用场景
- 数量量巨大(百万、千万级别以上)的计数场景(热门网站每日/每周/每月访问 ip 数统计、热门帖子 uv 统计)
8. GEO
8.1 类型说明
- Geospatial index(地理空间索引,简称 GEO) 主要用于存储地理位置信息,基于 Sorted Set 实现。
8.2 常用命令
常用命令 | 备注 |
---|
8.3 基本演示
8.4 使用场景
- 附近的人
9. Sreams
9.1 类型说明
- 大于等于5.0版本才有的数据类型
9.2 常用命令
常用命令 | 备注 |
---|
9.3 基本演示
9.4 使用场景
- 支持多播的可持久化消息队列,用户实现发布订阅功能,参考kafka设计