LRU算法与缓存更新

https://zhuanlan.zhihu.com/p/78537245

最近在做一个游戏论坛类的小程序,在缓存与数据库一致性方面遇到了问题:

文章浏览量、评论数、点赞数存放在redis里面

原方案1:

玩家激活缓存:玩家查询文章列表时,检测无缓存,查库再更新缓存。文章浏览时,文章浏览量+1,更新数据库,不更新缓存,等缓存失效后,由玩家再次访问激活。

遇到问题:浏览量不及时更新,同理评论数和点赞数也不是实时的。

改进方案2:

更新数据库时同时更新缓存。

遇到问题:玩家数量不多的情况,该方案并未出现问题。但并没有预估到玩家数量增加过快,浏览量或点赞数并发更新、导致玩家响应过慢。

最终方案3:

缓存才用LRU,不设置过期时间,设置LRU的容量,超出容量时出列,出列后进入rabbitmq等待更新数据库脚本的消化。

优点:热点文章一直存在于redis中,减少数据库更新,使用rabbitmq的ack保证redis出列的数据能被正确的更新。

缺点:

冷门数据干扰热门数据,一旦容量设置不合理,热门数据容易出列,可以适当调大容量,或者使用二次LRU。

高度依赖于redis,redis要做好灾备和集群,保证数据安全。

缓存冷启动的问题,可以先手动加载部分热点数据,防止冷启动时大量访问导致mysql崩盘。

posted @ 2019-10-01 19:50  luckc#  阅读(217)  评论(0)    收藏  举报