缓存分布式一致性问题

缓存一致性问题发生的原因,是在更新数据时数据库和缓存数据的不一致。我们要做到保证缓存的最终一致性。如果数据需要强一致性建议直接查询数据库。

双写模式

双写模式为先写数据库,在写缓存。

进来两个请求,先执行"请求1"的操作写入数据1,这时可能由于各种原因,"请求1"卡顿。这时候我们的"请求2"执行写数据库为2,更新缓存为2。"请求1"卡顿结束继续写缓存为1。现在出现问题,我们的缓存本该为2,现在却是1,出现了脏数据。

脏数据问题:

暂时性脏数据 ,但是数据是稳定的,缓存过期后,又能得到最新的正确数据。

保证的是最终一致性。

失效模式

写数据库后删除缓存,当有用户查询时缓存为空,更新添加缓存。

"请求1"在写完数据1后删除缓存。"请求2"在写缓存时如果出现比较慢的情况,这是进来"请求3"的查询操作,读取缓存为空,然后读取数据库为1。

这时候执行有一个情况,"请求2"写完数据库,执行删除缓存。"请求3"更新缓存,那么这时候更新缓存数据为1,与数据库中最新的2不一致,出现一致性问题。

脏数据问题:

暂时性脏数据 ,但是数据是稳定的,缓存过期后,又能得到最新的正确数据。

缓存数据一致性解决方案

双写模式 或者失效模式都会导致缓存不一致问题的出现。那么怎么处理?

1.如果是用户纬度的数据,并发几率小,可以不用考虑大并发出现的一致性问题,缓存加上过期时间,每隔一段时间触发读的主动更新即可解决。

2.如果是菜单、商品介绍等基础数据,可以使用cannal订阅数据库binlog方式进行个性化处理。

3.缓存数据+过期时间可以足够解决大部分业务对缓存的要求。

4.通过加锁保证并发读写,可以使用读写锁。

总结:

我们能放入缓存的数据就不应该是实时性、一致性要求超高的数据。

不应该过度设计,增加系统的复杂度。过度设计会增加大量的开发工作以及维护工作。

缓存一致性解决-Canal

更新缓存

Canal是阿里开源的中间件,可以模拟成数据库的从服务器,直接订阅数据库的binlog日志 ,然后拿到变化后更新redis

优点:改数据库就可以了,不用关心任何的缓存操作,数据修改完成自动同步更新。

缺点:增加了中间件,需要额外开发。

解决数据异构问题

我们去浏览淘宝京东,每个人推荐的商品都是不一样的,基于爱好进行推荐,可以使用Canal进行操作,简单逻辑:

总结

一致性解决方案:

1.缓存所有数据都要有过期时间,保证数据过期后的下一次查询触发主动更新缓存。

2.读写数据的时候,加上分布式的读写锁(读相当于无锁状态)。

相关推荐
莫晓燚33 分钟前
搭建Redis 主从复制---实战
数据库·redis·缓存
李纲明2 小时前
微信小程序真机预览白屏或 request 失败:先核 request 合法域名与 TLS,再查体验版与本地缓存
缓存·微信小程序·小程序·小程序开发·devdiy·真机预览·合法域名
一条泥憨鱼4 小时前
【Kafka】零基础学习教程
java·分布式·学习·kafka
雾时之林5 小时前
Nginx反向代理与proxy_cache缓存搭建CDN服务器
服务器·nginx·缓存
鬼手点金5 小时前
提示注入:上下文安全的核心威胁
人工智能·安全·microsoft·机器学习·缓存·prompt
贾伟康6 小时前
【共创稿事节】HarmonyOS 7.0 HiTraceChain分布式调用链:从接入到生产验证
分布式·harmonyos·可观测性·调用链·hitracechain
是程序喵呀6 小时前
Redis实现持久化
数据库·redis·缓存
用AI来创业吧1 天前
企业官网上线前性能清单:首屏、图片、字体与缓存
缓存·能源·安全威胁分析
hweiyu001 天前
Redis命令:SUNIONSTORE
redis·缓存
NiceZack1 天前
Hadoop 部署全流程教程:从新装 CentOS 到伪分布式与完全分布式
hadoop·分布式·centos