多配色创意metro风格企业网站织梦模板整,浏览器禁止网站怎么做,湖滨区建设局网站,番禺南浦文章目录 1.缓存基础2.缓存异步场景1.缓存穿透2.缓存击穿3.缓存雪崩总结 3.缓存一致性 1.缓存基础
Redis由于性能高效#xff0c;通常可以做数据库存储的缓存。一般而言#xff0c;缓存分为服务端缓存和客户端缓存。缓存有以下三种模式#xff1a;
Cache Aside#xff08… 文章目录 1.缓存基础2.缓存异步场景1.缓存穿透2.缓存击穿3.缓存雪崩总结 3.缓存一致性 1.缓存基础
Redis由于性能高效通常可以做数据库存储的缓存。一般而言缓存分为服务端缓存和客户端缓存。缓存有以下三种模式
Cache Aside旁路缓存模式Read Write Through Cache读写穿透模式Write Behind异步缓存写入模式
2.缓存异步场景
1.缓存穿透
缓存穿透是指缓存和数据库中都没有的数据而用户不断发起请求。由于缓存时不命中后查询DB时被动写入的并且在DB查不到数据则不写入缓存这就会导致这个请求每次都要到存储层查询缓存毫无意义了。在流量大时DB也可能会挂掉。
解决方案
接口增加校验鉴权ID直接拦截。缓存空值key-null给这个key设置一个有效时间在这个时间内这个key的请求直接拦截。布隆过滤器。
2.缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据由于并发用户过多同时读缓存又没有读到数据去到DB读取数据引起DB压力过大。一般是缓存时间到期没来得及重新产生
解决方案
热点数据增加过期时间避免因为过期失效而被穿透。重建缓存加互斥锁线程争抢锁拿到锁的线程查询数据库然后重建缓存争抢失败的加一个睡眠然后循环重试。重建的这个缓存之后的请求就可以直接查询这个缓存
3.缓存雪崩
缓存雪崩是指大量的应用请求因为异常无法在Redis缓存中进行处理而是直接打到数据库引起数据库压力过大甚至宕机。
解决方案
缓存数据的过期时间设置随机防止同一时间大量数据过期现象发生。重建缓存加互斥锁线程争抢锁拿到锁的线程查询数据库然后重建缓存争抢失败的加一个睡眠然后循环重试。
总结
1、缓存击穿和缓存穿透有什么区别 缓存击穿是指key在数据库中存在而不在缓存中被一波大流量击垮的场景。 缓存穿透是指key不在缓存和数据库而被大波流量打击的场景。 主要就是前者是由数据的只是未来得及加载到缓存另一个是完全没有。
2、缓存雪崩和缓存击穿有什么区别 都是由key缓存过期导致的不同点是缓存击穿是某个热点key过期就被大波流量访问雪崩是一群key同时过期又一起访问并击垮了数据库。
3.缓存一致性
缓存不一致是指在分布式系统中由于缓存和后端存储的数据之间不同步导致缓存中的数据和真实数据不一致的问题。主要在缓存的读写过程中尤其高并发和分布式环境。 要怎么解决缓存不一致呢以下是大致的方向 确认业务对延迟性的要求如果要求高且数据可能变化别用缓存因为用缓存需要接收一定程序的延迟。通常使用过期时间兜底也是最普遍的方式如果希望减少缓存不一致的时间可以增加个删除逻辑提升一致性。订阅binlog来更新适合场景是不需要过期直接同步数据。 接下来根据以上的几个方向来谈一谈怎么保存一致性。 方向一 使用Redis的过期时间MySQL更新时Redis不做处理等待缓存过期失效再从mySQL拉取到缓存。 这种方式的优点就是开发成本低、易于实现、出问题概率小。但是完全依赖于过期时间如果时间过短会导致缓存频繁失效过长会导致长时间数据不一致。 方向二 不仅仅通过key的过期时间兜底还在MySQL更新时同时尝试操作Redis1.更新Redis2.删除Redis。更新Redis容易造成时序性问题所以更多的是使用删除Redis等待下次访问再加载回来。 上面所说的删除也可能会删除失败那么就忽略它有过期时间兜底。 方向三 订阅MySQL的binlog日志解析日志内容再更新到Redis。比如阿里巴巴的开源组件canalhttps://github.com/alibaba/canal。也就是说另起一个服务slave订阅binlog日志更新任务通过这个服务自动完成。无时序性问题和业务完全解耦但是引入了消息队列这种重量级组件。
Redis做旁路缓存mySQL更新了此时何去何从使用过期时间来兜底并且在更新DB后删除缓存来提升一致性的方式。 ps那么什么情况适合使用订阅binlog 这种模式更像是同步数据其实比较适合缓存很长时间过期、或者不过期的场景。