网站建设在未来的发展趋势,大连工业大学研究生院官网,苏州网站建设优化,seo是搜索引擎营销文章目录 缓存雪崩、击穿、穿透1.缓存雪崩造成缓存雪崩解决缓存雪崩 2. 缓存击穿造成缓存击穿解决缓存击穿 3.缓存穿透造成缓存穿透解决缓存穿透 缓存雪崩、击穿、穿透
一般用户数据存储于磁盘#xff0c;读写速度慢。
使用redis作为缓存#xff0c;相当于数据缓存在内存读写速度慢。
使用redis作为缓存相当于数据缓存在内存大大提高系统性能
redis作为缓存就会有缓存异常的三个问题
1.缓存雪崩 缓存都设置了过期时间
造成缓存雪崩 大量缓存数据在同一时间过期 redis故障宕机 若此时有大量用户请求无法在redis处理都直接访问数据库 数据库压力骤增严重造成数据库宕机 形成一系列连锁反应 整个系统崩溃
解决缓存雪崩 大量缓存数据在同一时间过期时 均匀设置过期时间对缓存数据的过期时间加上随机数保证数据不会在同一时间过期 互斥锁当业务线程在处理用户请求时如果发现访问的数据不在redis里加互斥锁保证同一时间内只有一个请求来构建缓存从数据库读取数据再将数据更新到redis当缓存构建完成后再释放锁。 注互斥锁设置超时时间否则若出现请求发生意外阻塞导致其他请求也一直拿不到锁 后台更新缓存让缓存“永久有效”将更新缓存的工作交由后台线程定时更新 当系统内存紧张时有些缓存数据被“淘汰”在“淘汰”和下次更新时间内业务线程读取失败就以为是数据丢失解决方法 后台线程负责定时更新缓存同时频繁地检测缓存是否失效若失效可进行构建缓存 检测时间间隔不能太长太长导致用户获取的数据是空值而不是真正的数据检测时间间隔最好是毫秒级用户体验一般 业务线程发现缓存数据失效后通过消息队列发送一条消息通知后台线程更新缓存。后台线程收到消息后更新前判断缓存是否存在不存在则进行构建缓存。 缓存更新及时用户体验好 **注**后台更新缓存机制适合进行缓存预热业务刚上线时提前缓存数据不是等待用户访问才来触发缓存构建 Redis故障宕机时 服务熔断或请求限流机制 服务熔断暂停业务应用对缓存服务的访问直接返回错误不再继续访问数据库直到redis恢复正常。 请求限流机制只将少部分请求发送到数据库进行处理再多的请求就在入口直接拒绝服务等到Redis恢复正常 并把缓存预热完后。 构建redis缓存高可靠集群 通过主从节点的方式构建若redis缓存的主节点宕机从节点可以切换成为主节点继续提供缓存服务
2. 缓存击穿
造成缓存击穿
被频繁访问的热点数据过期此时大量的请求访问该热点数据直接访问数据库数据库很容易被高并发的请求冲垮
缓存击穿可以认为是缓存雪崩的一个子集对应于大量缓存数据在同一时间过期
解决缓存击穿
互斥锁不给热点数据设置过期时间由后台异步更新缓存 / 在热点数据准备过期前提前通知后台线程更新缓存以及重新设置过期时间
3.缓存穿透
对于缓存雪崩、击穿数据仍然在数据库一旦缓存恢复相应的数据就可以减轻数据库的压力
而对于缓存穿透
用户访问的数据既不在缓存中也不在数据库中导致请求在访问缓存时发现缓存缺失再去访问数据库发现数据库也没有要访问的数据没办法构建缓存来服务后续请求。当有大量的这样的请求时数据库的压力骤增
造成缓存穿透
业务误操作缓存中数据和数据库数据都被误删除黑客恶意攻击故意大量访问某些读取不存在数据的业务
解决缓存穿透 非法请求的限制 判断请求参数是否含有非法值请求字段是否存在 缓存空值或默认值 当线上业务发现缓存穿透时针对查询的数据在缓存中设置一个空值或默认值后续请求可以从缓存中读取到数据而不会继续查询数据库 使用布隆过滤器快速判断数据是否存在避免通过查询数据库来判断数据是否存在。 写入数据库数据时使用布隆过滤器做标记当业务线程确认缓存失效后可以通过查询布隆过滤器判断数据是否存在。大量请求只会查询布隆过滤器和redis而不会查询数据库
注布隆过滤器的实现 设此时有3个哈希函数位图数组长度为8数据库写入数据x
将该数据x得到的三个哈希值 % 位图数据长度得到三个数组下标填入1。
当业务线程查询数据是否存在于数据库时查询 1、4、6下标的值是否为1若有一个为0则说明不存在
存在哈希冲突故若查询布隆过滤器说数据存在于数据库此时数据不一定在数据库但是查询到数据不存在时数据一定不存在 小林coding图解Redis — 七