网站备案多少天,拼团小程序制作平台,哪家做企业网站,重庆平台网站建设哪家有解决方案
那么我们这里列出来所有策略#xff0c;并且讨论他们优劣性。
先更新数据库#xff0c;后更新缓存先更新数据库#xff0c;后删除缓存先更新缓存#xff0c;后更新数据库先删除缓存#xff0c;后更新数据库
先更新数据库#xff0c;后更新缓存 这种方法是不推…解决方案
那么我们这里列出来所有策略并且讨论他们优劣性。
先更新数据库后更新缓存先更新数据库后删除缓存先更新缓存后更新数据库先删除缓存后更新数据库
先更新数据库后更新缓存 这种方法是不推荐使用的因为在更新缓存那一步有的业务需求缓存中的值并不是从数据库查而是需要一系列计算而拿到缓存值那这时候更新缓存的代价是非常大的。当有大量对数据库进行写的请求时读的并不多写一次请求就要更新一下缓存那性能损耗真的很大因为Redis是针对内存的。 比如当数据库有个值为100数值我们有十个请求是要对其每次减五这个期间完全没进行读的操作那么先更新数据库那会有十个请求对缓存更新从而产生大量的冷数据当不更新缓存而失去删除缓存那么有读请求时只会更新一次。
先更新缓存后更新数据库
这种方法不需要我们考虑了吧和第一种方法是一样的。
先删除缓存后更新数据库
该方法也会有问题具体出现的原因 这时来了两个请求请求 A更新 和请求 B查询
请求 A 会先删除 Redis 中的数据然后去数据库进行更新操作此时请求 B 看到 Redis 中的数据时空的会去数据库中查询该值补录到 Redis 中但是此时请求 A 并没有更新成功或者事务还未提交
那么这时候就会产生数据库和 Redis 数据不一致的问题。如何解决其实最简单的解决办法就是延时双删的策略。 上述的保证事务提交完以后再进行删除缓存还有一个问题就是如果你使用的是 Mysql 的读写分离的架构的话那么其实主从同步之间也会有时间差。 此时来了两个请求请求 A更新 和请求 B查询
请求 A 更新操作删除了 Redis请求主库进行更新操作主库与从库进行同步数据的操作请 B 查询操作发现 Redis 中没有数据去从库中拿去数据此时同步数据还未完成拿到的数据是旧数据
解决办法就是如果是对 Redis 进行填充数据的查询数据库操作就强制将其指向主库进行查询。 先更新数据库后删除缓存 这一种方法也会出现问题当更新数据库成功了但在删除缓存的阶段出错了没有删除成功那此时再读取缓存的时候每次都是错误的数据了。 解决方案就是利用消息队列进行删除的补偿。具体的业务逻辑如下
请求 A 先对数据库进行更新操作在对 Redis 进行删除操作的时候发现报错删除失败此时将Redis 的 key 作为消息体发送到消息队列中系统接收到消息队列发送的消息后再次对 Redis 进行删除操作
但是这个方案会有一个缺点就是会对业务代码造成大量的侵入深深的耦合在一起所以这时会有一个优化的方案我们知道对 Mysql 数据库更新操作后再 binlog 日志中我们都能够找到相应的操作那么我们可以订阅 Mysql 数据库的 binlog 日志对缓存进行操作。 总结 这些方法都有利弊如在第二种先删除缓存后更新数据库这个方法最后讨论了要更新 Redis 的时候强制走主库查询就能解决问题那么这样的操作会对业务代码进行大量的侵入但不需要增加的系统不需要增加整体的服务的复杂度。最后一种方法我们最后讨论了利用订阅 binlog 日志进行搭建独立系统操作 Redis这样的缺点其实就是增加了系统复杂度。 所有的选择都需要我们对业务处理的评估来进行选择没有一种技术是对所有业务通用的。没有最好的技术只有最适合我们的。