Redis 5分钟掌握数据结构 其它(六)

90 阅读4分钟

压缩列表 Ziplist

由于连锁更新可能带来的性能下降,在 7.0 被 Listpack 替代

对象 Object

在前面的数个章节里,我们陆续介绍了 Redis 用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合,等等。

Redis 并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。

通过这五种不同类型的对象,Redis 可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是,我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。

除此之外,Redis 的对象系统还实现了基于引用计数技术的内存回收机制:当程序不再使用某个对象的时候,这个对象所占用的内存就会被自动释放;另外,Redis 还通过引用计数技术实现了对象共享机制,这一机制可以在适当的条件下,通过让多个数据库键共享同一个对象来节约内存。

地理位置信息 Geo

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作。

127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556
(integer) 1

127.0.0.1:6379> GEOPOS Sicily Palermo
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"

发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

127.0.0.1:6379> SUBSCRIBE xxxx
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "xxxx"
3) (integer) 1

127.0.0.1:6379> PUBLISH xxxx 123
(integer) 1

Redis Stream 主要用于消息队列(MQ,Message Queue)。Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

创建消费者组
127.0.0.1:6379> XGROUP CREATE mystream mygroup 0-0 MKSTREAM
(error) BUSYGROUP Consumer Group name already exists

写入数据
127.0.0.1:6379> XADD mystream * name Sara surname OConnor
"1675492778814-0"

读取数据
XREADGROUP GROUP mygroup Alice  COUNT 10 STREAMS mystream >

数据确认
XACK mystream mygroup 1526569495631-0

hypeloglog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

bitmap

BitMap,即位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字。

布隆过滤器

布隆过滤器是一种空间效率很高的随机数据结构,专门用来检测集合中是否存在特定的元素。布隆过滤器由一个长度为m比特的位数组与k个独立的哈希函数组成的数据结构。位数组初始化均为0,所有的哈希函数都可以分别把输入数据尽量均匀地散列。当要向布隆过滤器中插入一个元素时,该元素经过k个哈希函数计算产生k个哈希值,以哈希值作为位数组中的下标,将所有k个对应的比特值由0置为1。当要查询一个元素时,同样将其经过哈希函数计算产生哈希值,然后检查对应的k个比特值:如果有任意一个比特为0,表明该元素一定不在集合中;如果所有比特均为1,表明该元素有可能性在集合中。

由于可能出现哈希碰撞,不同元素计算的哈希值有可能一样,导致一个不存在的元素有可能对应的比特位为1,这就是所谓“假阳性”(false positive)。相对地,“假阴性”(false negative)在BF中是绝不会出现的。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

所以,布隆过滤器认为不在的,一定不会在集合中;布隆过滤器认为在的,不一定存在集合中。

image.png