词条有哪些网站可以做,wordpress百度主动,网站开发的有哪些好的软件,返利网站建设服务redis 缓存穿透 缓存击穿 缓存雪崩
1.缓存穿透
前提#xff1a;应用服务器压力过大 导致redis命中率过低#xff08;查询不到缓存#xff09; 一直查询数据库
描述#xff1a;1.redis查询不到数据 2.出现很多非正常url访问#xff08;一般出现这些问题都是恶意…redis 缓存穿透 缓存击穿 缓存雪崩
1.缓存穿透
前提应用服务器压力过大 导致redis命中率过低查询不到缓存 一直查询数据库
描述1.redis查询不到数据 2.出现很多非正常url访问一般出现这些问题都是恶意攻击网站造成
解决方案 方案1: 对于数据库中不存在的数据, 也对其在缓存中设置默认值Null为避免占用资源一般过期时间会比较短; 方案2: 可以设置一些过滤规则, 如布隆过滤器
目前主流的一种的载体就是布隆过滤器. 布隆过滤器是一种概率型数据结构特点是高效地插入和查询可以用来告诉你 “某样东西一定不存在或者可能存在”.
相比于传统的 List、Set、Map 等数据结构布隆过滤器是一个bit数组, 它更高效、占用空间更少但是缺点是其返回的结果是概率性的而不是确切的。
方案3进行实时监控对一直恶意访问的人设置黑名单
2.缓存击穿
前提 1.数据库访问压力瞬时增加 2.redis里面没有出现大量key过期 3.redis正常运行
描述某一个热点 key在缓存过期的一瞬间同时有大量的请求打进来由于此时缓存过期了所以请求最终都会走到数据库造成瞬时数据库请求量大、压力骤增甚至可能打垮数据库。
解决方案 方案1预先设置热门数据在redis高峰访问之前把一些热门数据提前存入到redis里面加大这些热门数据key的时长 方案2实时调整现场监控那些数据热门实时调整key的过期时长 方案3使用锁并发的多个请求中只有第一个请求线程能拿到锁并执行数据库查询操作其他的线程拿不到锁就阻塞等着等到第一个线程将数据写入缓存后直接走缓存。
3.缓存雪崩
前提数据库压力变大服务器崩溃
描述大量的热点 key 设置了相同的过期时间导在缓存在同一时刻全部失效造成瞬时数据库请求量大、压力骤增引起雪崩甚至导致数据库被打挂。
解决方案
1、过期时间打散。既然是大量缓存集中失效那最容易想到就是让他们不集中生效。可以给缓存的过期时间时加上一个随机值时间使得每个 key 的过期时间分布开来不会集中在同一时刻失效。
2、设置过期标志更新缓存。记录缓存数据是否过期设置提前量。如果过期会触发通知另外的线程在后台去更新实际key的缓存
3、加互斥锁。该方式和缓存击穿一样按 key 维度加锁对于同一个 key只允许一个线程去计算其他线程原地阻塞等待第一个线程的计算结果然后直接走缓存即可。
4、构建多级缓存架构。nginx缓存 redis缓存 其它缓存ehcache等
5、限流降级
6、缓存预热在实际开发中我们可以利用大数据统计用户访问的热点数据在项目启动时将这些热点数据提前查询并保存到Redis中。