hash:如果没有值则默认为0进行增加
list:leftPush头插入、leftPop头移出;rightPush尾插入,rightPop尾移出
redis v4-v5-v6对比请参考:https://blog.csdn.net/sinat_14840559/article/details/108326178
Redis 5
Stream类型
Stream与Redis现有数据结构比较:
Stream | List, Pub/Sub, Zset |
---|---|
获取元素高效,复杂度为O(logN) | List获取元素的复杂度为O(N) |
支持offset,每个消息元素有唯一id。不会因为新元素加入或者其他元素淘汰而改变id。 | List没有offset概念,如果有元素被逐出,无法确定最新的元素 |
支持消息元素持久化,可以保存到AOF和RDB中 | Pub/Sub不支持持久化消息 |
支持消费分组 | Pub/Sub不支持消费分组 |
支持ACK(消费确认) | Pub/Sub不支持 |
Stream性能与消费者数量无明显关系 | Pub/Sub性能与客户端数量负相关 |
允许按时间线逐出历史数据,支持block,给予radix tree和listpack,内存开销少 | Zset不能重复添加相同元素,不支持逐出和block,内存开销大 |
不能从中间删除消息元素 | Zet支持删除任意元素 |
Redis 6
多线程IO
SSL支持
ACL支持
RESP3
RESP(Redis Serialization Protocol)是 Redis 服务端与客户端之间通信的协议。Redis 6之前使用的是 RESP2,而Redis 6开始在兼容RESP2的基础上,开始支持RESP3。在Redis 6中我们可以使用HELLO命令在RESP2和RESP3协议之间进行切换
客户端缓存
基于 RESP3 协议实现的客户端缓存功能。
使用
数据类型 | 聚合统计 | 排序统计 | 二值状态统计 | 基数统计 |
---|---|---|---|---|
Set | 交、并、差 | 不支持 | 不支持 | 精确统计,大数据内存消耗大,统计慢 |
Sorted Set | 交、并、差 | 支持 | 不支持 | |
Hash | 不支持 | 不支持 | 不支持 | |
List | 不支持 | 支持,分页不灵活 | 不支持 | 不支持,不能去重 |
Bitmap | 与、异或、或计算 | 不支持 | 支持,效率高,节省内存 | 精确统计,内存开销大于HLL |
HyperLogLog | 不支持 | 不支持 | 不支持 | 概率统计,存在误差,但节省内存 |
- Set和Sorted Set支持交集、并集的聚合运算,但是Sorted Set不支差集运算。Set集合的交差并的计算复杂度很高,如果数据量很大的情况下,可能会造成Redis的阻塞,这时可以通过从库进行计算或交由客户端计算。
- Bitmap也能对多个Bitmap做与、异或、或的聚合运算。
- List和SortedSet都支持排序统计,但是List是根据元素先后插入顺序排序,Sorted Set支持权重,相对于List排序来说更加灵活。
- 对于二值状态统计,判断某个元素是否存在等场景,建议使用Bitmap,节省的内存空间(1亿位约12MB)。
- 对于基数统计,在大数据量、不要求精准的情况建议使用HyperLogLog(误差概率约0.81%),节省内存空间(计算2^64个元素大概只需要12KB的内存空间);对于精准的基数统计,最好还是使用Set集合。