一、缓存预热
缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。 问题排查 1. 请求数量较高 2. 主从之间数据吞吐量较大,数据同步操作频度较高 , 因为刚刚启动时,缓存中没有任何数据 解决方案 准备工作: 1. 日常例行统计数据访问记录,统计访问频度较高的热点数据 2. 将统计结果中的数据分类,根据级别, redis 优先加载级别较高的热点数据 实施: 1. 使用脚本程序固定触发数据预热过程 2. 如果条件允许,使用了 CDN(内容分发网络),效果会更好CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度
二、缓存雪崩
缓存雪崩是指在同一时段大量的缓存key 同时失效或者 Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决方案: 1.给不同的Key 的 TTL 添加随机值 2.利用Redis 集群提高服务的可用性 3.给缓存业务添加降级限流策略 4.给业务添加多级缓存 图一三、缓存击穿
缓存击穿问题也叫热点Key 问题,就是一个被高并发访问并且缓存重建业务较复杂的 key 突然失效了,无 数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种: 1.互斥锁 2.逻辑过期 逻辑分析:假设线程 1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程 1 走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程 1没有走完的时候,后续的线程 2 ,线程 3 ,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大。如图二所示。 图二四、缓存穿透
缓存穿透是指查询一个不存在的数据,由于缓存和数据库都没有命中,导致每次请求都需要从数据库中读取数据,增加了数据库的负担。
常见的解决方案有两种: 1.缓存空对象 优点:实现简单,维护方便 缺点: 额外的内存消耗,可能造成短期的不一致 2.布隆过滤 优点:内存占用较少,没有多余 key 缺点:实现复杂,存在误判可能 缓存空对象思路分析: 当我们客户端访问不存在的数据时,先请求 redis ,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如 redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在 redis中也能找到这个数据就不会进入到缓存了。 布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis ,哪怕此时 redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,假设布隆过滤器判断这个数据不存在,则直接返回这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突。图三
标签:缓存,redis,数据库,Redis,访问,预热,线程,数据 From: https://blog.csdn.net/indiansummer_/article/details/142770629