随着Redis越来越火,除了基本提供的五种基本数据类型,也提供了其他数据结构和特性。另外,其独特的Module加载机制也带来了极大的可扩展性。
漏斗限流
在业务中我们可能对一些调用、执行进行限流。而redis就为我们提供了一种方式。
限流涉及的指标有
-
容量
-
流出速率
管道
管道不是Redis独有的。本质上redis 客户端通过对管道中的指令列表改变读写顺序来节省IO。
服务器依旧是收到一条消息,执行一条消息,回复一条消息。
Geo
我们知道,地球是一个球体,并对其进行了位置划分,经度(-180, 180],纬度(-90, 90)。
Rax
Rax 是 Redis 内部比较特殊的一个数据结构,它是一个有序字典树 (基数树 Radix Tree),按照 key 的字典序排列,支持快速地定位、插入和删除操作。Redis 五大基础数据结 构里面,能作为字典使用的有 hash 和 zset。hash 不具备排序功能,zset 则是按照 score 进 行排序的。rax 跟 zset 的不同在于它是按照 key 进行排序的
HyperLogLog
可用版本: >= 2.8.9 时间复杂度: 当命令作用于单个 HyperLogLog 时, 复杂度为 O(1) , 并且具有非常低的平均常数时间。 当命令作用于 N 个 HyperLogLog 时, 复杂度为 O(N) , 常数时间也比处理单个 HyperLogLog 时要大得多。 当 PFCOUNT key [key …] 命令作用于单个键时, 返回储存在给定键的 HyperLogLog 的近似基数, 如果键不存在, 那么返回 0 。
当 PFCOUNT key [key …] 命令作用于多个键时, 返回所有给定 HyperLogLog 的并集的近似基数, 这个近似基数是通过将所有给定 HyperLogLog 合并至一个临时 HyperLogLog 来计算得出的。
通过 HyperLogLog 数据结构, 用户可以使用少量固定大小的内存, 来储存集合中的唯一元素 (每个 HyperLogLog 只需使用 12k 字节内存,以及几个字节的内存来储存键本身)。
命令返回的可见集合(observed set)基数并不是精确值, 而是一个带有 0.81% 标准错误(standard error)的近似值。
Stream
我们知道,利用redis实现一个消息队列,比如:
1、采用list:一端 rpush/lpush 入队,另一端lpop 和 rpop 出队。不过它存在空闲连接的问题,服务器自动会断开空闲的连接。
2、使用 PUB/SUB,订阅/发布模式
3、利用 Sorted-Set 来实现,将时间戳作为 score。这样也做消息延迟。
不过上述方式均存在一个问题:消息可靠性问题。三种方式在服务器宕机时,存在丢消息的可能。
Stream是 Redis 5增加,消息链表,持久化。