Redis是非常好用的NOSQL数据库之一,能处理非常多的实际应用场景。下面介绍下我在实际场景中使用的一个例子
概述
概述就简单概括一下,懂的人一看就明白,不明白的在看下面介绍,免得浪费时间
- 排行榜
- 相同票数情况先来后到的顺序
- redis有序集合
- score分割,整数位做票数,小数位作距离时间结束的时间差
- 高性能排行榜
需求说明
项目需要做一个投票排行榜,用户对自己喜欢的主播进行投票,主播的排名是按照票数降序排序,相同票数情况下按照先后顺序排序。
技术分析
需求很简单,实现起来也没什么难度,如果使用Mysql也能轻松实现,每次票数增1并且将更新最后投票时间就能轻松实现排序。
但是互联网使用场景往往对性能要求很高,对用户请求要及时相应,而频繁的读写对数据库造成的压力是非常大的,且有可能导致无法正常工作的情况。
而使用NOSQL这种内存型数据库就可以非常好的应对这种业务场景,在这里Redis中的有序集合非常适合这种场景
实现思路
Redis的有序集合中包含三部分,有序集合的项是以键值对的形式存储,每个项都有一个分值{item=>score}。
我们就利用这种特性实现排行榜。
score是数字类型,可以是整形也可以是浮点型。前面说了同分值情况下需要按照先来后到的顺序排序,而Redis分值相同的情况下是按照项的ascii码进行排序的,这明显达不到我们要的效果。
所以我们可以对score分值进行改造下,将分值分为两部分,一部分记录分值,一部分记录时间信息,时间戳是越来越大的,如果直接用时间戳的就会导致后来者居上,并且score长度也是有限的。所以我们得取一个时间差,最好是距离活动结束的时间差,这样长度也合适,且满足我们先来后到的原则。
实现方式有两种
- 使用定长整型,例如前x位作为分值,后x位作时间差值,不足部分补0处理。
- 使用浮点型,整数部分作为分值,小数部分作为时间差值
我采用的是第二种,因为可以省去我对整数分割的麻烦,我直接将浮点型强转int,这样就会丢弃小数部分,这样就可以直接得到分值了。
实现代码
代码就不贴了,没什么技术含量,就做个思路记录吧