使用关系型数据库做为Redis落地的思路

Redis的持久化方式主要有2种:RDB和AOF,但各有不足,同时Redis没有SQL支持,Redis自己提供的命令不足以实现大多数SQL查询需求,对后期运营的分析需求支撑不足。此外,对于游戏来讲,活跃玩家只占总玩家的不多一部分,因此冷热数据分离也颇有必要。所以我以为Redis最好的持久化方案是备份到MySql之类的关系型数据库中,Redis自己只做为一个内存缓存系统使用。数据库

  • 启动过程:从数据库里面把修改时间在过时时间内的记录(热数据)所有读取写入到Redis中,并设置过时时间。
  • 读取过程:先读Redis,若是存在,则直接返回并更新过时时间(若是不存在过时时间则不更新),不然再去读数据库,读取结果写入到Redis中。若是数据库中不存在,则也用记录的key在Redis作一个不存在的标记,以免以后再次查询还须要去读数据库,拖慢速度。
  • 写入过程:直接写入Redis(同时去掉过时时间),同时把key以当前时间为score写入一个特定的sorted set(dirtylist)中。
  • 持久化过程:持久化程序跟随系统启动,每隔一段时间获取Redis的dirtylist中是否有元素,若是有元素则pop出来,经过key获取记录写入数据库,再把Redis中的key设置过时时间。

风险:缓存

  • 额外多了关系型数据库这一个单点。若是数据库发生了故障,则短期内没法读取冷数据,读取热数据和写入都没有问题。只要监控到位,反应及时,风险影响不大。
  • 数据丢失的风险。若是Redis发生了故障,则会丢失写入到Redis但还未持久化的记录(dirtylist里面的记录)。这一点没法避免,但单从游戏的角度来讲,只要保证以事务为单位的持久化(好比说dirtylist同一时间的key,做为一个事务写入到数据库),出现问题能够经过短期的回挡+补偿解决问题。

这里只是记录下一个思路,具体的问题和解决方案,等具体实践了以后,再来补充。游戏

相关文章
相关标签/搜索