系统架构设计:缓存的使用

系统使用缓存(如Redis 等Nosql时)时,不得不要考虑的问题就是:缓存穿透、缓存击穿、缓存雪崩。

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

示例: 查询商品的配件信息时,如若商品并未配置配件信息,则查数据库为空,且不会加入缓存,这就会导致,下次在查询同样商品的配件时,由于缓存未命中,则仍旧会查底层数据库,所以缓存就一直未起到应有的作用,当并发流量大时,会很容易把DB打垮;

影响:缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉

解决方案

    1 采用布隆过滤器

       将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

    布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

布隆过滤器的原理是:当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想

加入布隆过滤器后,查询数据的逻辑变得如下:

    1)先查询 布隆过滤器 中是否有结果,有则返回,无则进行下一步

    2)再查询 缓存 中是否有结果,有则返回,无则进行下一步

    3)再查询 DB 中是否有结果,有则返回

附注:一个百万级别的集合,通过布隆过滤器命中,则其耗时在0.2秒左右,性能极好。

 

    2 更为简单粗暴的方法,如果一个查询返回的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短。

缓存雪崩

      缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

示例:缓存中的10000条商品数据同时失效,批量并发的请求到来,在缓存未成功拉取回数据时,会造成批量的请求都转去请求DB

影响:缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。

解决方案:

    1 缓存数据的过期时间设置随机(如在30分钟的基础上再加上 1-10 的随机时间),防止同一时间大量数据过期现象发生。

    2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同得缓存数据库中。

    3 设置热点数据永远不过期。

 

缓存击穿

      缓存在某个时间点过期或者就没有来得及缓存的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案:

1、使用互斥锁

      该方法是比较普遍的做法,即,在根据key获得的value值为空时,先锁上,再从数据库加载,加载完毕,释放锁。若其他线程发现获取锁失败,则睡眠50ms后重试。

优点:思路简单、保证一致性

缺点:代码复杂度增大、存在死锁的风险

2、异步构建缓存

在这种方案下,构建缓存采取异步策略,会从线程池中取线程来异步构建缓存,从而不会让所有的请求直接去DB查询。该方案redis自己维护一个timeout,当timeout小于System.currentTimeMillis()时,则进行缓存更新,否则直接返回value值

优点:性价最佳,用户无需等待

缺点:无法保证缓存一致性

3、布隆过滤器

缺点:布隆过滤器不支持删值操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值