redis 多维度排行思路

问题描述

  1. 众所周知redis zset 经常用于排行榜,可以做到开箱即用,但是有一个缺点,就是只支持单维度的排行。
  2. 而实际项目中单维度的排行确很不实用,一个简单的示例,健步走排行,产品的需求是根据步数、完成时间、人名做排行,排序优先度是从左到右。
  3. 我的解决思路是把所有维度都转换成数字,然后这些维度的数字相加,这样就可以解决多维度的排行。

具体解决思路

  1. 步数:原本就是数字可以忽略
  2. 完成时间: 完成时间一般存储的是时间戳,而时间戳是越晚完成值就越大,要做到完成时间越早排名越靠前就需要,越早完成的值就越大。我们可以用一个较大的时间戳减去用户完成时间的时间戳,这样就能做到越早完成值越大。
  3. 人名:人名一般由汉字或字母组成,汉字和字母都是字符串,我们要做排序,第一步就是要把字符串转换成数字,这个过程推荐用php的原生函数mb_ord
  4. 例如一个用户的步数是10000步,完成时间(计算后的)是100000(随意写的一个时间戳),人名是500(计算后)是张三(随意写的),我们就能得到一个值10000.100500(步数.完成时间和人名相加)。
  5. 实际取值的过程中我们可以把小数点后面的去掉,小数点后面的数只用于做排行。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

好办法,确实能提高多条件排序的效率。

有点想法参考下

  1. 尽量用整型记录,浮点在Redis中存储为字符串;
  2. 统一每个指标转换后的长度(最高位可不处理),拼接后最好不超过long存储范围,否则也转换为字符串。
1年前 评论
LXK (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!