Redis 模拟实现多字段排序的小手段

Redis 模拟实现多字段排序的小手段

author: he xiaodong date: 2019-10-11

基础场景: 一般做活动都会有一个积分排序功能,比较基础的情况下是按积分倒序,最基础的 zrevrangebyscore xxx min max WITHSCORES 命令就可以完成排序,可以参考 zrevrangebyscore 命令详解。

复杂场景: 参与人数较多,运营要求:按积分倒序,积分一样的,按注册时间升序,注册时间一样的,按登录次数倒序,这种稍微复杂的情况, redis 暂时没有方法直接排序了,直接数据库的话,需要提前有一个这次活动中总积分的统计表,进行多字段排序。为解决这个问题,需要一个巧妙点的处理。

  分数是高位,注册时间在中间,登录次数是最低位,组合成一个大的数字,因为注册时间是升序,需要用一个大数减去注册时间,转换一下,登录次数根据最大的结果来补全一下,例如有大佬登录了100次,有人只有3次,将3的转成 003,连接起来,则最终结果是倒序的。例如:

用户名 积分 注册时间 累计签到天数
A 85 1569921388 50
B 85 1570094188 6

  数据计算为: 85(2000000000 - 1570094188)003, 存储的时候为 zdd xxx 85429905812006 B, 执行 zrevrangebyscore xxx 1 100 WITHSCORES LIMIT 1,10 直接倒序筛选 10 个结果。

这个只是思维方法很机智的技巧,不方便在此基础上扩展需求。

© 方法是梦康群友 我要割麦子 提供的。