使用 Redis 做积分排行榜,用户积分是否需要在 MySQL 里也保存一份?
发布于 4 年前 作者 xuxu7 6400 次浏览 来自 问答

为了实时性和效率,第一次使用 Redis 做每天积分排行榜,使用 ZINCRBY rank:20200217 5 1插入数据。网上很多教程都没有提到 MySQL,总感觉不踏实:

  1. 积分只保存在 Redis 里会不会丢失?(感觉不能太依赖持久化 aof)
  2. 积分都是按天保存的,怎么统计某个用户的总积分?
  3. 某个用户的积分记录怎么保存?

没有相关经验,百度也没找到答案。请教一下业界常规的做法是怎样的,在使用 Redis 的同时是否需要 MySQL 也保存一份数据?

7 回复

存入redis,积分榜数据是实时了的,所以2里面提到的(积分都是按天保存的,怎么统计某个用户的总积分)有点不明白,按天存???

之前我们写游戏后台,大量用到redis做实时的排行榜,高效且简单,redis集群会保证数据不丢失,如果你担心丢失,丢消息队列,某个服务消费这个积分数据存入mysql , 可是按照你的担心,消息队列挂了怎么办呢?mysql挂了怎么办呢?这些都应该由集群服务保证,你再怎么担心也没有用(除非你用的不是云服务,而是自己搭建的,那你就需要对这些中间件服务特别熟悉怎么配置怎么保证高可用了)…

如果存mysql仅是为了存档,方便某些数据分析服务提数,那么异步存mysql也没什么不可以的。

@fantasticsoul 按天保存指: 统计每天的积分排行榜,ZINCRBY 的 KEY 为 rank:<当天日期>,比如“今日排行榜(2020年04月24日)”的 KEY:rank:20200424。 这样的话,通过 ZSCORE rank:20200424 user1 能得到用户 user1 在今天的新增积分。那怎么获取用户的总积分

以前我们就遇到一个为了解决自己缓存问题使用了FLUSHALL

FLUSHALL 清空数据,是因为缓存太多了吗?

@xuxu7 那就再来个 rank:all 的key 啊

mq => redis mq => db

别非跟我说那个环节挂了,

定时任务缓存更新,从db读一次,db就是用来做统计的,基本数据全都在redis,什么积分榜,直接从db + redis incr或者sort list 就好了

回到顶部