wordpress demo data,seo排名点击器,怎样建设门户网站,设计师兼职平台文章目录 1 文章概述2 缓存穿透2.1 什么是缓存穿透#xff1f;2.2 缓存穿透的解决方法2.2.1 做好参数校验2.2.2 缓存无效Key2.2.3 使用布隆过滤器2.2.4 接口限流 3 缓存击穿3.1 什么是缓存击穿#xff1f;3.2 缓存击穿的解决方法3.2.1 调整热点数据过期时间3.2.2 热点数据预热… 文章目录 1 文章概述2 缓存穿透2.1 什么是缓存穿透2.2 缓存穿透的解决方法2.2.1 做好参数校验2.2.2 缓存无效Key2.2.3 使用布隆过滤器2.2.4 接口限流 3 缓存击穿3.1 什么是缓存击穿3.2 缓存击穿的解决方法3.2.1 调整热点数据过期时间3.2.2 热点数据预热3.2.3 控制数据库并发 4 缓存雪崩4.1 什么是缓存雪崩4.2 缓存雪崩的解决方法4.2.1 针对缓存服务不可用的情况4.2.2 针对缓存大面积过期的情况 1 文章概述
在使用 Redis 作为缓存时缓存穿透、缓存击穿和缓存雪崩是常见的问题可能会影响系统性能和稳定性。本文将深入探讨这些问题的概念、产生原因、以及可能带来的影响并针对这些问题提供的解决方案以帮助读者更好地理解并解决这些挑战。
2 缓存穿透
2.1 什么是缓存穿透
缓存穿透问题 大量且频繁地请求缓存和数据库中都不存在的数据由于缓存无法命中这些请求都穿透缓存直接访问数据库导致数据库压力暴增影响系统性能。 缓存穿透可能发生的原因包括查询参数异常、恶意攻击、业务逻辑错误等。如果恶意用户或者攻击者发送大量不存在于缓存中的请求系统会不断地去查询数据库导致数据库负载增加甚至可能引起数据库宕机。缓存穿透不仅影响系统性能还可能暴露后端数据给未经授权的用户造成安全隐患。
2.2 缓存穿透的解决方法
要解决缓存穿透问题本质就是要避免出现请求直接访问数据库的情况。
2.2.1 做好参数校验
解决缓存穿透最基本的就是首先做好参数校验从系统入口处就拒绝掉非法的请求一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。 2.2.2 缓存无效Key
做好参数校验只能拒绝掉不符合基本参数校验规则的请求对于那些符合参数校验规则的无效请求则无能为力。
缓存无效Key方法指的是在缓存和数据库都查询不到数据的时候向缓存中插入一个空的数据并设置过期时间。这样当下一次接收到相同请求时就可以直接从缓存中获取到空数据而不需要查询数据库。 这种方式可以解决请求的 key 变化不频繁的情况如果黑客每次构建不同的请求 key不仅不能解决缓存穿透问题还会导致 Redis 中缓存大量无效的 key 。很明显这种方案并不能从根本上解决此问题。如果非要用这种方式来解决穿透问题的话尽量将无效的 key 的过期时间设置短一点。
2.2.3 使用布隆过滤器
布隆过滤器是一个非常神奇的数据结构通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们可以把它看作由二进制向量或者说位数组和一系列随机映射函数哈希函数两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构它占用空间更少并且效率更高但是缺点是其返回的结果是概率性的而不是非常准确的。理论情况下添加到集合中的元素越多误报的可能性就越大。并且存放在布隆过滤器的数据不容易删除。
关于布隆过滤器的更多内容可以参考文章布隆过滤器有什么用什么原理如何使用
使用布隆过滤器解决缓存穿透问题的方法是将所有可能存在的请求的值都存放在布隆过滤器中当用户请求过来先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话直接返回请求参数错误信息给客户端存在的话才会走后续流程。
2.2.4 接口限流
根据用户或者 IP 对接口进行限流对于异常频繁的访问行为还可以采取黑名单机制例如将异常 IP 列入黑名单。
3 缓存击穿
3.1 什么是缓存击穿
缓存击穿问题 缓存击穿是指缓存中的某个热点数据突然失效或过期此时有大量并发请求同时访问该数据导致这些请求无法从缓存中获取数据而直接访问数据库造成数据库压力剧增甚至可能导致数据库宕机。缓存击穿通常发生在具有高并发读取请求的热点数据上。
3.2 缓存击穿的解决方法
3.2.1 调整热点数据过期时间
设置热点数据永不过期或设置较长过期时间避免热点数据突然过期的情况从根源上解决缓存击穿问题 应该没人会去随便删除热点数据缓存吧 3.2.2 热点数据预热
针对热点数据提前预热将其存入缓存中并设置合理的过期时间。这也能从根源上解决缓存击穿问题
比如在秒杀场景中可以在秒杀活动开始之前将热点数据加载到缓存中并设置其过期时间在秒杀结束之后。
3.2.3 控制数据库并发
在缓存失效时使用互斥锁Mutex或者分布式锁来保护数据库查询过程只允许一个线程进行数据库查询其他线程等待查询结果。
4 缓存雪崩
4.1 什么是缓存雪崩
缓存雪崩问题 缓存雪崩是指在缓存中存储的大量数据同时失效或者过期导致大量请求直接访问数据库获取数据从而造成数据库负载剧增甚至引发系统崩溃的现象。 注意缓存服务器宕机导致的缓存失效也算哦 4.2 缓存雪崩的解决方法
4.2.1 针对缓存服务不可用的情况
采用 Redis 集群避免单机出现问题整个缓存服务都没办法使用。限流避免同时处理大量的请求。采用多级缓存例如本地缓存Redis 缓存的组合当 Redis 缓存出现问题时还可以从本地缓存中获取到部分数据。
4.2.2 针对缓存大面积过期的情况
设置缓存数据的过期时间随机性避免大量数据同时失效。缓存永不失效不太推荐实用性太差。缓存预热也就是在程序启动后或运行过程中主动将热点数据加载到缓存中。