长春免费建站模板,网站建设与网页制作基础入门教程,如何把图片放到网站后台,wordpress 区块编辑器缓存一致性产生背景如果每次频繁的访问数据库的时候#xff0c;虽然查询底层使用B树索引 但还会做磁盘的IO操作#xff0c;可能会对数据库的压力非常大。所以为了能够减轻数据库的访问压力#xff0c;会使用一些缓存实现减轻数据库的压力。比如 Redis、es、ehcache、oscache…缓存一致性产生背景如果每次频繁的访问数据库的时候虽然查询底层使用B树索引 但还会做磁盘的IO操作可能会对数据库的压力非常大。所以为了能够减轻数据库的访问压力会使用一些缓存实现减轻数据库的压力。比如 Redis、es、ehcache、oscache等。多级缓存架构设计首先在jvm内置缓存ehcache、oscache底层基于HashMap实现 ,如果服务集群的情况下数据同步采用rmi实现性能可能不是很好。补充rmi就是 jvm与jvm之间通讯设计模式采用装饰模式。Mysql与Redis缓存一致性原理Mysql与nosql之间数据一致性问题Mysql与redis/es/mongdb 都是相同的。(相同key)第一次查询1. 查询二级缓存Redisredis如果没有该缓存数据则开始查询mysql2. 在查询mysql如果mysql中存在数据的情况下就将该数据缓存到Redis中第二次查询1. 查询到redis中如果存在该数据的情况下则不会查询mysql。能够减轻数据库访问压力。重点解决方案1. 对mysql增量做写的操作的时候都会同步到Redis。如果insetdb insetredis如果update 将redis中该key删除。---懒加载。如果update 直接修改redis。---增量同步。如果delete 将redis中该key删除。---增量同步。如果数据库数据发生变化如何同步给Redis1. 直接清除Redis缓存(适合于小项目)基于接口形式实现同步2. 基于MQ形式异步同步 (适合于中小项目)基于接口形式实现同步3. 基于canalmq异步同步 (推荐)基于源头binlog二进制文件实现同步。基于canal同步的原理1. Canal服务器端伪装成一个mysql从节点订阅mysql主节点的binlog二进制文件2. Canal服务器端收到binlog文件就会转换成json的格式发送给Canal客户端。3. Canal客户端会将该数据同步给nosql缓存 redis流程第一次请求流程1. 先请求查询redis缓存如果redis缓存没有数据则查询mysql数据库如果mysql数据库存在数据则将该数据缓存到Redis中。第一次请求流程2. 先请求查询Redis缓存如果redis缓存存在数据的话则不会查询mysql数据从而实现减轻数据库访问压力。优化Canal接收到mysqlbinlog文件将该消息缓存到kafka中再开启多个消费者异步地获取消息同步到Redis中能够提高同步的效率。如果数据库数据发生变化如何同步给Redis方案1直接删除Redis缓存方案2: 基于MQ异步同步更新方案3 基于canal订阅binlog同步http://127.0.0.1:8081/insert?namemayiktage22http://127.0.0.1:8081/getUser?id6http://127.0.0.1:8081/updateUser?userId9namemeite6666基于canal订阅binlog同步 实现原理1. canal服务器模拟伪装成mysql从节点订阅mysql 主节点的binlog文件2. 当mysql主节点binlog文件发生变化的时候会通知给canal服务器端3. Canal服务器端在将该binlog文件转换为json格式数据发送给canal客户端监听者。4. canal客户端在将该数据异步写入到redis中