redis zset (排行榜)多字段排序

681 阅读1分钟

业务背景

  • 对用户的积分进行排序
  • 积分相同按照参与活动时间先后进行排序

问题

  • redis zset 只能按照score一个字段进行排序

问题解决方案

  • 第一种解决方案 在score 数值上做文章,score 拆分为两个/多个部分

score的组成为 ( 【积分】连接【报名截止时间戳 - 报名时间戳】 ) 作为score值,这样在排序上没有问题,并且获取到排序数据后 因为时间戳是固定长度,也可以解出来真是积分,这种方式适合榜单为top N,N的值比较大,需要分页查询。另外这种方式对于真实score 相同的概率没有要求。

  • 第二种解决方案 score为真实积分值,将其他的排序字段放在 value 上,之后通过内存再进行二次排序

score为真实score,value设置为 user_id:timestamp,这中方案的前提是score 相同的概率极小且top N N很小,没有分页查询的需求。这样才能在二次排序的时候 取N+M条数据 再在内存中进行解析并进行二次排序。

涉及的命令

  • zincrby 设置积分,如果key不存在则创建key及对应的value和score,如果存在则进行增加score
  • zcard 查询zset总的members
  • zrangebyscore key min max [withscores] [limit offset count]
  • zrevrangebyscore key min max [withscores] [limit offset count]