中国十大门户网站,数据分析网站开发,网站名称写什么,wordpress响应式网站模板项目场景#xff1a; 一般情况下#xff0c;Redis 用来实现应用和数据库之间读操作的缓存层#xff0c;主要目的是减少数据库 IO#xff0c;还可以提升数据的 IO 性能。 如下图所示#xff0c;这是它的整体架构。 当应用程序需要去读取某个数据的时候#xff0c;首先会先…项目场景 一般情况下Redis 用来实现应用和数据库之间读操作的缓存层主要目的是减少数据库 IO还可以提升数据的 IO 性能。 如下图所示这是它的整体架构。 当应用程序需要去读取某个数据的时候首先会先尝试去 Redis 里面加载如果命中就直接返回。如果没有命中就从数据库查询查询到数据后再把这个数据缓存到 Redis 里面。 如下图在这样一个架构中会出现一个问题就是一份数据同时保存在数据库和 Redis 里面当数据发生变化的时候需要同时更新 Redis 和 Mysql由于更新是有先 后顺序的并且它不像 Mysql 中的多表事务操作可以满足 ACID 特性。所以就会出 现数据一致性问题。 ACID是指数据库管理系统DBMS在写入或更新资料的过程中为保证事务transaction是正确可靠的所必须具备的四个特性原子性atomicity或称不可分割性、一致性consistency、隔离性isolation又称独立性、持久性durability。 解决方案 1. 先更新数据库再更新缓存 2. 先删除缓存再更新数据库 如果先更新数据库再更新缓存如果缓存更新失败就会导致数据库和 Redis 中的数据不一致。如下图所示。 如果是先删除缓存再更新数据库理想情况是应用下次访问 Redis 的时候发现 Redis 里面的数据是空的就从数据库加载保存到 Redis 里面那么数据是一致的。 但是在极端情况下由于删除 Redis 和更新数据库这两个操作并不是原子的所以这个过程如果有其他线程来访问还是会存在数据不一致问题。 所以如果需要在极端情况下仍然保证 Redis 和 Mysql 的数据一致性就只能采用最终一致性方案。 1、比如基于 RocketMQ 的可靠性消息通信来实现最终一致性。如下图。 2、还可以直接通过 Canal 组件监控 Mysql 中 binlog 的日志把更新后的数据 同步到 Redis。如下图 因为这里是基于最终一致性来实现的如果业务场景不能接受数据的短期不一致性那就不能使用这个方案来做。 也会有人说“你这个最终一致性方案”还是会存在数据不一致的问题啊那怎么解决 先不用慌技术是为业务服务的所以不同的业务场景对于技术的选择和方案的设计 是不同的所以这个时候可以反问面试官具体的业务场景是什么 一定要知道的是一个技术方案不可能 cover 住所有的场景明白了吗