基础场景: 一般做活动都会有一个积分排序功能,比较基础的情况下是按积分倒序,最基础的 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 个结果。
这个只是思维方法很机智的技巧,不方便在此基础上扩展需求。
© 方法是梦康群友 我要割麦子 提供的。