网站做等报定级工作要多久,建设科技期刊官网,php电子商务网站源码,课程网站如何建设【进阶篇】Redis缓存穿击, 穿透, 雪崩, 污染详解 文章目录 【进阶篇】Redis缓存穿击, 穿透, 雪崩, 污染详解0. 前言大纲缓存穿击缓存穿透缓存雪崩缓存污染 1. 什么是缓存穿透#xff1f;1.1. 发生原因1.2. 导致问题1.3. 解决方案 2. 什么是缓存击穿3.1. 发生原因3.1. 解决方案…【进阶篇】Redis缓存穿击, 穿透, 雪崩, 污染详解 文章目录 【进阶篇】Redis缓存穿击, 穿透, 雪崩, 污染详解0. 前言大纲缓存穿击缓存穿透缓存雪崩缓存污染 1. 什么是缓存穿透1.1. 发生原因1.2. 导致问题1.3. 解决方案 2. 什么是缓存击穿3.1. 发生原因3.1. 解决方案 3. 什么是缓存雪崩3.1. 缓存雪崩通常发生原因3.2. 缓存雪崩的解决方案 4. 什么是缓存污染4.1. 发生原因4.2. 导致问题4.3. 缓存污染的解决方案包括 5.参考资料 0. 前言 背景有个社群网友说面试的时候在Redis 缓存环节面试官抽风问了他一些缓存常见问题,瞬间懵逼关于Redis缓存穿击, 穿透, 雪崩, 污染导致的原因和预防措施本文从网络上搜接了一些概念和解释。希望大家能吊打八股文面试官。 大纲 缓存穿击 定义攻击者针对不存在的数据不断发送请求导致缓存层无法命中从而对数据库层造成压力。解决方案 在缓存中设置空值占位符避免频繁访问数据库。增加布隆过滤器判断请求的Key是否有效。 缓存穿透 定义攻击者针对不存在的数据发送请求绕过缓存直接访问数据库导致数据库压力过大。解决方案 在查询结果为空时也将结果缓存起来设置一个较短的过期时间避免频繁访问数据库。增加布隆过滤器判断请求的Key是否有效。 缓存雪崩 定义缓存层的大面积失效所有的请求都直接访问数据库导致数据库压力过大。解决方案 设置多级缓存避免单点故障。设置不同的缓存过期时间避免同一时间大量缓存失效。使用限流、熔断等机制控制访问量避免一次性大量请求击穿缓存。 缓存污染 定义缓存中出现了异常、非法或非预期的数据导致后续读取到的数据不正确。解决方案 增加数据校验机制比如使用CRC校验码。限制缓存写入只有满足一定条件如过滤非法字符的数据才能写入缓存。使用布隆过滤器判断数据是否有效。 1. 什么是缓存穿透
缓存穿透是指在缓存系统中大量的请求查询一个缓存中不存在的数据导致这些请求都绕过了缓存层直接查询数据库或其他存储系统。这种情况下缓存无法提供任何帮助而且频繁访问数据库可能会对系统的性能和稳定性产生负面影响。
1.1. 发生原因 查询一个不存在的数据用户查询一个在数据库中不存在的数据例如查询一个无效的用户ID或者非法的URL参数。 恶意攻击黑客或恶意用户故意发送大量的查询请求查询缓存中不存在的数据以达到对系统的拒绝服务攻击。
1.2. 导致问题
缓存穿透可能导致以下问题 增加系统负载缓存穿透会导致大量的请求直接访问数据库或其他存储系统而不经过缓存这会增加这些系统的负载降低系统的性能和响应速度。 数据库压力增大由于缓存穿透导致大量的请求直接访问数据库数据库的负载会大幅增加可能导致数据库性能下降甚至发生数据库宕机等故障。 数据不一致如果缓存穿透导致请求直接访问数据库而数据库中的数据发生了变化但缓存中的数据仍然是过期或无效的这会导致返回的数据与实际数据不一致可能引发业务逻辑错误或显示错误的信息。
1.3. 解决方案 空结果缓存对于查询结果为空的情况将空结果进行缓存并设置一个较短的过期时间。这样再次查询相同的数据时可以直接命中缓存避免绕过缓存直接查询数据库。 布隆过滤器使用布隆过滤器进行预先过滤将可能存在的数据的key进行判断如果布隆过滤器判断某个数据的key不存在可以直接返回空结果避免对数据库进行查询。 这是比较推荐的方法。所谓布隆过滤器就是一种数据结构它是由一个长度为m bit的位数组与n个hash函数组成的数据结构位数组中每个元素的初始值都是0。在初始化布隆过滤器时会先将所有key进行n次hash运算这样就可以得到n个位置然后将这n个位置上的元素改为1。这样就相当于把所有的key保存到了布隆过滤器中了。
举个例子比如我们一共有3个key我们对这3个key分别进行3次hash运算key1经过三次hash运算后的结果分别为2/6/10那么就把布隆过滤器中下标为2/6/10的元素值更新为1然后再分别对key2和key3做同样操作结果如下图
这样当客户端查询时也对查询的key做3次hash运算得到3个位置然后看布隆过滤器中对应位置元素的值是否为1如果所有对应位置元素的值都为1就证明key在库中存在则继续向下查询如果3个位置中有任意一个位置的值不为1那么就证明key在库中不存在直接返回客户端空即可。如下图
当客户端查询key4时key4的3次hash运算中有一个位置8的值为0就说明key4在库中不存在直接返回客户端空即可。
所以布隆过滤器就相当于一个位于客户端与缓存层中间的拦截器一样负责判断key是否在集合中存在。如下图 布隆过滤器的好处就是解决了第一种缓存空值的不足但布隆过滤器也存在缺陷首先它有误判的可能比如在上面客户端查询key4的图中假如key4经过3次hash运算得到的位置分别是2/4/6由于这3个位置的值都是1所以布隆过滤器就认为key4在库中存在进而继续向下查询了。所以布隆过滤器判断存在的key实际上可能是不存在的但布隆过滤器判断不存在的key是一定不存在的。它的第二个缺点就是删除元素比较难比如现在要删除key2这个元素那么需要将2/7/11三个位置的元素值改为0但这样就会影响到key1和key3的判断。
缓存穿透检测在查询数据之前先在缓存中检查该数据是否存在如果缓存中不存在该数据则直接返回空结果。这样可以避免频繁查询数据库减轻数据库的负载。
通过以上解决方案可以有效地防止缓存穿透问题提高系统的性能和稳定性。
2. 什么是缓存击穿 缓存击穿是指在缓存系统中一个热点数据过期或者被删除后恰好有大量的并发请求同时查询该数据导致这些请求都绕过了缓存层直接查询数据库或其他存储系统。这种情况下缓存无法提供任何帮助而且频繁访问数据库可能会对系统的性能和稳定性产生负面影响。
3.1. 发生原因
热点数据失效一个热点数据在缓存中的过期时间到期或被删除此时有大量并发请求同时查询该数
3.1. 解决方案 加锁机制在查询缓存失效后只允许一个请求访问数据库其他请求等待结果。当第一个请求查询到数据后将数据写入缓存并释放锁其他请求从缓存中获取数据。 异步更新缓存在查询缓存失效后第一个请求查询数据库并将查询到的数据异步更新到缓存其他请求等待缓存更新完成后再从缓存中获取数据。 提前加载热点数据在系统启动或者低峰期预先加载热点数据到缓存中避免在高峰期突然失效而引起缓存击穿。
3. 什么是缓存雪崩
缓存雪崩是指在缓存系统中大量的缓存数据同时失效或者被删除导致所有的请求都直接访问数据库或其他存储系统从而造成系统的瞬时压力过大甚至导致系统瘫痪。与缓存击穿不同的是缓存雪崩是指大规模的缓存失效而非单个热点数据失效。
3.1. 缓存雪崩通常发生原因 缓存过期时间设置不合理如果缓存中大量的数据同时设置了相同的过期时间那么当这些数据同时过期时会导致缓存雪崩。 缓存数据集中在同一台服务器或同一片区域如果缓存数据集中在同一台服务器或同一片区域当该服务器或该区域发生故障或网络异常时会导致缓存雪崩。 缓存服务器宕机或重启如果缓存服务器宕机或重启那么所有的缓存数据都会丢失导致缓存雪崩。
3.2. 缓存雪崩的解决方案 设置合理的缓存过期时间合理地设置缓存数据的过期时间避免大量的数据同时过期。 分散缓存失效时间将缓存数据的过期时间随机分布避免大量数据同时过期。 使用多级缓存在系统架构中引入多级缓存将缓存数据分散到不同的缓存服务器或缓存区域减少单一故障点。 引入热点数据预热在系统启动或者低峰期预先加载热点数据到缓存中避免在高峰期突然失效而引起缓存雪崩。
4. 什么是缓存污染
缓存污染是指在缓存系统中由于错误的缓存配置或缓存数据异常导致缓存中存储了无效或错误的数据进而影响系统的正常运行。
4.1. 发生原因 缓存键冲突不同的数据存储在缓存中使用了相同的缓存键导致缓存数据被覆盖或混淆。这可能是由于不同的数据模块使用了相同的缓存键或者在缓存键生成逻辑中存在错误。 缓存数据异常缓存数据在存储或读取过程中出现异常例如数据格式错误、数据丢失、数据损坏等。如果这些异常数据被存储到缓存中将导致后续的请求获取到错误的数据。 缓存穿透由于恶意攻击或异常情况大量的请求访问缓存系统中不存在的数据导致这些请求直接访问数据库或其他存储系统而不是从缓存中获取数据。
4.2. 导致问题 返回错误的数据当缓存中存储了错误的数据时后续的请求获取到的数据将是错误的可能导致系统的功能异常或显示错误的信息。 增加系统负载如果大量的请求绕过缓存直接访问数据库或其他存储系统将会增加这些系统的负载降低系统的性能和响应速度。
4.3. 缓存污染的解决方案包括 缓存键设计合理确保不同的数据模块使用不同的缓存键避免缓存键冲突。 数据校验和容错处理在缓存数据存储和读取过程中进行数据校验确保数据的完整性和准确性。对于异常数据可以进行容错处理例如删除或重新获取正确的数据。 缓存穿透防护使用布隆过滤器等技术对于不存在的数据进行预判避免无效请求直接访问存储系统。
5.参考资料
Redis官方文档https://redis.io/Redis实战书籍Redis设计与实现书籍https://www.toutiao.com/article/7088132873051488780/