江西省城乡建设培训网 官方网站,龙岩好工作人才网最新招聘信息,做游戏交易网站,学好网站建设的步骤一般情况下#xff0c;Redis是用来实现应用和数据库之间读操作得缓存层#xff0c;主要目的是减少数据库IO#xff0c;还可以提升数据的IO性能。
当应用程序需要去读取某个数据时#xff0c;会首先尝试去Redis里面加载#xff0c;如果命中就直接返回#xff0c;如果没有…一般情况下Redis是用来实现应用和数据库之间读操作得缓存层主要目的是减少数据库IO还可以提升数据的IO性能。
当应用程序需要去读取某个数据时会首先尝试去Redis里面加载如果命中就直接返回如果没有命中就去从数据库中查询查询到数据之后再把这个数据缓存到Redis里。 如果一份数据同时保存在数据库和Redis里面当数据发生变化时需要同时去更新Redis和Mysql由于更新是有先后顺序的并且他不像Mysql中多表事务操作可以满足ACID特性和会出现数据一致性的问题 这种情况下只有两种方法
1.先更新数据库在更新缓存
2.先删除缓存在更新数据库
如果先更新数据库在更新缓存如果缓存更新失败会导致数据不一致 如果是先删除缓存在更新数据库理想是应用下次访问Redis时发现Redis里面是空的就从数据库中加载保存到Redis那么数据是一致的。但是会有极端情况由于删除Redis和更新数据库这两个操作不是原子的所以这个过程如果有其他线程来访问还是会存在数据不一致的情况。 所以在极端情况下如果依旧想保持数据一致性就需要采用最终一致性方案。
比如基于RocketMQ的可靠性消息通信来实现最终一致性。
还可以直接通过Canal组件监控Mysql中binlog日志把更新后的数据同步到Redis里面。 因为这里是基于最终一致性来实现的如果业务场景不能接受数据的短期不一致性那就不能使用这个 方案来做。 以上就是我对这个问题的理解。谢谢大家