redis 多维度排行思路
问题描述
- 众所周知redis zset 经常用于排行榜,可以做到开箱即用,但是有一个缺点,就是只支持单维度的排行。
- 而实际项目中单维度的排行确很不实用,一个简单的示例,健步走排行,产品的需求是根据步数、完成时间、人名做排行,排序优先度是从左到右。
- 我的解决思路是把所有维度都转换成数字,然后这些维度的数字相加,这样就可以解决多维度的排行。
具体解决思路
- 步数:原本就是数字可以忽略
- 完成时间: 完成时间一般存储的是时间戳,而时间戳是越晚完成值就越大,要做到完成时间越早排名越靠前就需要,越早完成的值就越大。我们可以用一个较大的时间戳减去用户完成时间的时间戳,这样就能做到越早完成值越大。
- 人名:人名一般由汉字或字母组成,汉字和字母都是字符串,我们要做排序,第一步就是要把字符串转换成数字,这个过程推荐用php的原生函数mb_ord。
- 例如一个用户的步数是10000步,完成时间(计算后的)是100000(随意写的一个时间戳),人名是500(计算后)是张三(随意写的),我们就能得到一个值10000.100500(步数.完成时间和人名相加)。
- 实际取值的过程中我们可以把小数点后面的去掉,小数点后面的数只用于做排行。
好办法,确实能提高多条件排序的效率。
有点想法参考下
挺好的思路