Redis数据结构实际应用场景之排行榜

Redis是非常好用的NOSQL数据库之一,能处理非常多的实际应用场景。下面介绍下我在实际场景中使用的一个例子

概述

概述就简单概括一下,懂的人一看就明白,不明白的在看下面介绍,免得浪费时间

  1. 排行榜
  2. 相同票数情况先来后到的顺序
  3. redis有序集合
  4. score分割,整数位做票数,小数位作距离时间结束的时间差
  5. 高性能排行榜

需求说明

项目需要做一个投票排行榜,用户对自己喜欢的主播进行投票,主播的排名是按照票数降序排序,相同票数情况下按照先后顺序排序。

技术分析

需求很简单,实现起来也没什么难度,如果使用Mysql也能轻松实现,每次票数增1并且将更新最后投票时间就能轻松实现排序。

但是互联网使用场景往往对性能要求很高,对用户请求要及时相应,而频繁的读写对数据库造成的压力是非常大的,且有可能导致无法正常工作的情况。

而使用NOSQL这种内存型数据库就可以非常好的应对这种业务场景,在这里Redis中的有序集合非常适合这种场景

实现思路

Redis的有序集合中包含三部分,有序集合的项是以键值对的形式存储,每个项都有一个分值{item=>score}。

我们就利用这种特性实现排行榜。

score是数字类型,可以是整形也可以是浮点型。前面说了同分值情况下需要按照先来后到的顺序排序,而Redis分值相同的情况下是按照项的ascii码进行排序的,这明显达不到我们要的效果。

所以我们可以对score分值进行改造下,将分值分为两部分,一部分记录分值,一部分记录时间信息,时间戳是越来越大的,如果直接用时间戳的就会导致后来者居上,并且score长度也是有限的。所以我们得取一个时间差,最好是距离活动结束的时间差,这样长度也合适,且满足我们先来后到的原则。

实现方式有两种

  1. 使用定长整型,例如前x位作为分值,后x位作时间差值,不足部分补0处理。
  2. 使用浮点型,整数部分作为分值,小数部分作为时间差值

我采用的是第二种,因为可以省去我对整数分割的麻烦,我直接将浮点型强转int,这样就会丢弃小数部分,这样就可以直接得到分值了。

实现代码

代码就不贴了,没什么技术含量,就做个思路记录吧

    原文作者:罗志强
    原文地址: https://zhuanlan.zhihu.com/p/25729411
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞