开发者社区> 问答> 正文

如何校验数据库和缓存之间数据的一致性?:报错

1.背景:数据库是MySQL,缓存是Redis,redis主要用来读缓存,现需要检测数据可和缓存之间的一致性,确保从缓存读取的数据是最新的。现阶段检验一致性的方法是迭代比较每条记录是否一致。

2.问题:目前检验的方法不宜扩展,容易受限。如果数据量越来越大、记录数越多,则检查一致性的时间会越来越长,这对运行的服务也是有影响的。

3.改进:设置了两个定时器

一个是定时(时间间隔短如10min)扫描检查数据的一些重要属性如库存价格。

二是定时(时间间隔长如1h)扫描所有数据的属性值。

请教大家在应用中是否有遇到该类问题及其解决方法?


展开
收起
kun坤 2020-06-07 16:34:58 641 0
1 条回答
写回答
取消 提交回答
  • 首先“ 确保从缓存读取的数据是最新的”这个想法就有点走入误区,既然是缓存,那么必然是有对实时性可以有一定的容忍度的数据,容忍度的时间可以是5分钟,也可以是5小时,取决于不同的数据类型。然后,一定要求是实时性的数据,就不应该从缓存里读取,比如 库存 。再比如价格,既可以选择直接从数据库读实时数据,也可以选择缓存较短时间,甚至做到一个网站里不同页面的价格读取采用不同的方案,以“京东商城”为例,京东的商品列表页面的价格是有5分钟的缓存时间的,而它的商品详情页的价格却是实时的(信息来源于刘强东早期的微博)。######受益匪浅!赞一个######

    这种writer-reader架构,一般思路是在缓存更新阶段由writer来解决一致性问题,当数据库数据变化时,同步更新redis并确保缓存更新成功。

    作为完整性判断,可以不检查全部的属性,而对数据使用一个自增的版本号(或时间戳)来判断是否最新。

    作为后置的检测,可以优化来降低扫描的代价,如只针对最近一个时间周期内(如10min)数据库中更新过的数据,这个集合应该比较小,去redis中进行检查的代价会比较低。


    ######以目前的情况,所提的解决方法是比较可行的!太感谢了~###### 这个必须赞。######

    更新Mysql的时候,将redis中对应的缓存干掉,将这两个绑定为一个事务。

    2020-06-08 11:17:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载