题外话: 一些Redis的可视化工具
用过一下Redis Client的GUI,如 Medis / rdm / Another Redis DeskTop Manager/Keylord等,始终没有形成使用偏好。直到Redis官方的可视化工具RedisInsight问世
相关使用,及配置Grafana监控可参考这篇
Sorted Set 为何简称ZSet?
可见有序集合的英文原称是Sorted Set,为何会简称为ZSet呢?
有人在github问了这个问题,Redis之父亲自解答
另外,如果称为SSet,则发音无法同Set区分,且ss在欧洲可能特指纳粹党卫军…于是叫ZSet。参考stackoverflow上的这个问题
ZSet的使用场景及底层实现
zset使用了压缩列表、跳表的数据结构,并且使用哈希表来保存value:score键值对。
range命令得益于底层使用了跳表,复杂度并不高,但是会随着返回元素的数量而增加
跳跃表(Skip List)是一种用于快速搜索和插入的数据结构,它基于有序链表的设计思想,并添加了一些额外的指针来提高搜索效率。跳跃表通过在底层链表中创建多个”跳跃”层来实现快速的搜索操作,使得平均搜索时间复杂度为 O(log n),其中 n 是跳跃表中元素的数量。
跳跃表的基本结构是一个带有多层的有序链表,其中每一层都是底层链表的一个子集。每一层都通过指针连接到下一层,并且每一层都以不同的速率“跳过”一些元素。最底层是原始的有序链表,而最顶层只包含两个元素,即表头和表尾。通过这种方式,跳跃表可以在快速查找元素时跳过大部分无关的节点,从而提高搜索效率。
在跳跃表中,每个节点包含一个键值对(key-value pair),其中键(key)是用于排序和查找的关键字,而值(value)则是与该键相关联的数据。每个节点还包含一个指向同一层下一个节点的指针,以及一个指向下一层相同节点的指针。通过这些指针,可以在不同层级之间快速移动和搜索。
插入一个新的节点到跳跃表中的过程也是非常简单的。首先,在底层链表中找到插入位置,并将新节点插入其中。然后,通过一定的概率随机选择节点,将该节点连接到更高层的链表中。这个概率通常是 0.5,所以每一层的节点数量大约是下一层的一半。通过这种方式,插入操作具有较好的平均时间复杂度。
虽然跳跃表在搜索和插入操作上具有良好的性能,但它的实现相对简单,相比于平衡二叉树等数据结构更容易理解和实现。然而,需要注意的是,跳跃表的删除操作相对复杂,并且需要保持各层之间的平衡性。
总之,跳跃表是一种高效的数据结构,适用于需要频繁搜索和插入的场景。它结合了有序链表和概率性的跳跃操作,通过多层次的索引加速查找,提供了快速的平均搜索时间复杂度。
原文链接: https://dashen.tech/2017/04/29/Redis-ZSet类型/
版权声明: 转载请注明出处.