浅聊如何通过redis去做一个排行榜
Redis排行榜
redis
基于内存实现的,查询效率极高,且支持多种数据类型,其中
zset
是本次实现功能的关键。
什么是
zset
:
ZSet
(有序集合)是
Redis
数据库中的一种数据类型,它是一种无序的集合,每个元素都与一个浮点数
分数相关联,使得集合中的元素可以根据分数进行排序。
ZSet
也常被称为
Sorted Set
。
特点:
1.
元素唯一性
:
ZSet
中的元素是唯一的,不允许重复元素存在。
2.
有序性
:与普通集合不同,
ZSet
中的元素是有序排列的,根据元素的分数从小到大排序。
3.
分数与元素关联
:每个元素都与一个分数相关联,分数用于确定元素的位置。
Redis
的有序集合(
Sorted Set
)是基于跳跃表(
Skip List
)实现的。跳跃表是一种高效的数据结构,其
插入、删除和查找操作的平均时间复杂度都是
O(log n)
,相对于平衡树(如红黑树)的实现要简单很
多。
skiplist
本质上是一个
list,
它其实是由
有序链表
发展而来
以下是有序链表的图
![](https://i-blog.csdnimg.cn/direct/8bd8d47f6fd24490924b7e20968f5e92.png)
在这个新的三层链表结构上,如果我们还是查找
23
,那么沿着最上层链表首先要比较的是
19
,发现
23
比
19
大,接下来我们就知道只需要到
19
的后面去继续查找,从而一下子跳过了
19
前面的所有节点。可以想
象,当链表足够长的时候,这种多层链表的查找方式能让我们跳过很多下层节点,大大加快查找的速
度。
skiplist正是受这种多层链表的想法的启发而设计出来的。
代码实现以及为什么需要排行榜:
代码实现以及为什么需要排行榜:
![](https://i-blog.csdnimg.cn/direct/75edd8cb64d54564aa6ac2dccfa4bf26.png)
排行榜能够让用户看到自己在所有用户中的排名,激发用户的竞争心理,增加用户黏性
实现排行榜的方法还有哪些
1.
通过数据库实现。实时更新数据到数据库中,用户访问排行榜时,通过实时查询数据库获取数
据。这种方式性能较低,适用于数据量和用户量较少的情况。
2.
通过一些
Java
算法,比如快速排序,冒泡排序等,但是这样的方式比较消耗性能,对数据库压
力也很大;
3.
使用
Memcache
等其他非关系型数据库实现;但是排行榜数据量很小,使用
Redis
进行操作
时,它的性能要比
Memcache
更高;另外
Redis
的操作要比
Memcache
更加简便;最后
Redis
支持集群,持久化等功能,可以显著提高系统的可用性,而
Memcache
不支持持久化等
功能;综上所述,我们选择使用
Redis
去实现这个功能;