基于Redis 千万级用户排行榜最佳实践

前言

Redis 是一个开源的,内存中的数据结构存储系统,可以用作数据库、缓存和消息队列中间件。它支持多种类型的数据结构,如 字符串(string), Hash, 列表(List), 集合(Set), 有序集合(Sorted Set) 。 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(Transactions) 和不同级别的 磁盘持久化(Persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性

根据Redis支持的几大数据结构, 我们可以在多个场景加以应用, 目前应用最广泛的场景主要用于以下几大类:

基于Web服务的分布式会话Session存储

消息队列

排行榜

计数器

发布/订阅

此文主要讲解个人是如何处理千万级别用户排行榜并持久化用户排行榜用户数据

排行榜种类

由于排行榜的不同业务需求, 需要从不同角度去考虑排行榜的榜单生成规则. 目前我们主要研究实时榜和历史榜单

排行榜Redis数据结构选择

在这里, 我们采用Redis Sorted Set数据结构来处理排行榜数据, 根据官方文档定义:

Redis Sorted sets —
Sorted sets are a data type which is similar to a mix between a Set and a Hash. Like sets, sorted sets are composed of unique, non-repeating string elements, so in some sense a sorted set is a set as well.

However while elements inside sets are not ordered, every element in a sorted set is associated with a floating point value, called the score (this is why the type is also similar to a hash, since every element is mapped to a value).

然而,虽然Set中的元素没有被排序,但排序集中的每个元素都与一个浮点值相关联,这个值称为得分(这也是为什么该类型与哈希类似,因为每个元素都映射到一个值)。

Moreover, elements in a sorted sets are taken in order (so they are not ordered on request, order is a peculiarity of the data structure used to represent sorted sets). They are ordered according to the following rule:

此外,Sorted Set中的元素是按顺序排列的(而不是按加入的先后顺序排序的,并且这个顺序是用于表示排序集的数据结构的一个特性)。

在Sorted Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted Set中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。