怎么修改网站默认首页,wordpress位置,php实现网站消息推送,免费空间设立网站文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透
缓存穿透的概念
每一次查询的 key 都不在 redis 中#xff0c;数据库中也没有。
一般都是属于非法的请求#xff0c;比如 id0#xff0c;比如可以在 API 入口做一些参数校验。 大量访问不存… 文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透
缓存穿透的概念
每一次查询的 key 都不在 redis 中数据库中也没有。
一般都是属于非法的请求比如 id0比如可以在 API 入口做一些参数校验。 大量访问不存在的 key严重影响系统的性能。
两种解决方案:
第一种 查询不存在的数据时第一次查 db没有查到结果直接返回 value 为 null将这个 key 记录到 redis 中去。
使用空对象解决缓存击穿但是如果数据库中新增了该空对象也就是不是空对象了这个时候怎么办呢
1.value 为 null 的 key 设定一个过期时间比如 30s如果这个请求在过期时间之后进来那么就没事。
2.在添加请求的时候更新缓存的内容。
第二种 构建一个布隆过滤器记录全量数据.
布隆过滤器也是重点内容,借助位图的数据结构,设计的很巧妙.
布隆过滤器Bloom Filter是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多缺点是有一定的误识别率和删除困难。 这个地方也可以引导面试官深挖布隆过滤器的内容比如布隆过滤器的误判等情况。 缓存雪崩
大量的存储数据同时过期了用户的请求全部打到 mysql 上面去了。或者 Redis 故障宕机的时候请求同样都是打到 Redis 上面。
对用缓存雪崩的解决方案
设置均匀的过期时间避免将大量的数据设置成同一个过期时间设置缓存数据过期的时候给数据加上一个随机数保证数据不会在同一个时间过期。
2 互斥锁如果发现访问的数据不在 redis 中加一个互斥锁保证同一时间内只有一个请求构建缓存。当缓存构建完成之后在释放锁对于未能获取锁的请求设置等待锁释放后重新读取缓存,要么就返回空值或者默认值。
3.让缓存一直有效业务线程不在更新缓存也不设置有效期而是将缓存的更新工作交给后台线程定时更新。
业务线程不负责更新缓存缓存也不设置过期时间让缓存永久有效,将缓存的更新工作交给后台线程定时更新。
业务线程发现缓存消息失效后通过消息队列发送一条消息通知后台进程更新缓存后台线程接收消息进行更新缓存。
缓存击穿
业务中通常有一些数据会被频繁的访问比如秒杀活动秒杀的商品信息这个肯定要存在 Redis 中的被频繁访问的数据被称为热点数据如果缓存中这个数据过期了大量的请求直接到数据库中那么数据库就很容易被请求冲垮掉这就是缓存击穿存在的问题。 缓存击穿可以任务是缓存雪崩的子集同样可以采取互斥锁或者不给热点数据设置过期时间。
这个可以认为是热 key。