本篇文章给大家带来了关于redis的相关知识,其中主要跟大家分享redis 多维度排行思路,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。
问题描述
众所周知redis zset 经常用于排行榜,可以做到开箱即用,但是有一个缺点,就是只支持单维度的排行。
而实际项目中单维度的排行确很不实用,一个简单的示例,健步走排行,产品的需求是根据步数、完成时间、人名做排行,排序优先度是从左到右。
- 我的解决思路是把所有维度都转换成数字,然后这些维度的数字相加,这样就可以解决多维度的排行。
具体解决思路
步数:原本就是数字可以忽略
- 完成时间: 完成时间一般存储的是时间戳,而时间戳是越晚完成值就越大,要做到完成时间越早排名越靠前就需要,越早完成的值就越大。我们可以用一个较大的时间戳减去用户完成时间的时间戳,这样就能做到越早完成值越大。
人名:人名一般由汉字或字母组成,汉字和字母都是字符串,我们要做排序,第一步就是要把字符串转换成数字,这个过程推荐用php的原生函数mb_ord。
- 例如一个用户的步数是10000步,完成时间(计算后的)是100000(随意写的一个时间戳),人名是500(计算后)是张三(随意写的),我们就能得到一个值10000.100500(步数.完成时间和人名相加)。
实际取值的过程中我们可以把小数点后面的去掉,小数点后面的数只用于做排行。
以上就是分享redis多维度排行思路的详细内容,转载自php中文网
发表评论 取消回复