为了实时性和效率,第一次使用 Redis 做每天积分排行榜,使用 ZINCRBY rank:20200217 5 1
插入数据。网上很多教程都没有提到 MySQL,总感觉不踏实:
- 积分只保存在 Redis 里会不会丢失?(感觉不能太依赖持久化 aof)
- 积分都是按天保存的,怎么统计某个用户的总积分?
- 某个用户的积分记录怎么保存?
没有相关经验,百度也没找到答案。请教一下业界常规的做法是怎样的,在使用 Redis 的同时是否需要 MySQL 也保存一份数据?
存入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 就好了