缓存击穿、缓存穿透及其解决方案

缓存击穿、缓存穿透及其解决方案

缓存击穿

  • 简介
    缓存击穿是某一时间大量请求并发访问某一个key,而正好这个key并没有在缓存层中,从而全都跑到数据库查询,导致数据库压力过大甚至崩溃的情况。而它引起的原因一般是热点key过期导致的。
  • 解决办法
    1.为了避免缓存击穿,那么最好就是设置热点key为永不过期的,这样就不会有缓存击穿的情况了。
    2.使用hystrix进行限流,熔断器,资源隔离等操作,即使发生了缓存击穿等操作,那也没有关系,我能够使用hystrix来保证服务的高可用性,其实我觉得有这点也差不多不会有什么问题了。
    3.。。。网上一直在提的一个加互斥锁的方式,既有那种加完锁相当于每个请求还是会排队去访问数据库的,也有那种使用tryLock的,只让部分请求去访问数据库的方案,我是不太认同的。。。个人感觉,既然是高并发的访问过来了,那你想想你这样做的话,这个接口的响应时间就会很长,明明就是高并发访问还得一直阻塞在这里,不用hystrix的话,那不就是等着让系统崩溃么,用了hystrix,那也用不着去使用锁,大部分请求直接fallback就行了,也用不着你那把锁去限流。。唯一好的一点就是查的时候只有一个线程能访问数据库,可以比只使用hystrix少查点数据库,但是hystrix本身也有限流的功能,只不过是锁的限制更厉害而已,所以这里引入锁还有必要吗?不知道我理解的对不对,可以一起讨论一下。

缓存穿透

  • 简介
    缓存穿透指的是大量的发起对数据库和缓存中都不存在的key的查询请求,导致请求查完redis查不到,又去查询数据库,从而造成数据库压力过大的情况,缓存穿透可能是由于恶意攻击引起的。
  • 解决办法
    1.当查询到为空时,将这个key设置一个空值,加上过期时间
    这种办法感觉不是很好,首先每有一个不存在的key都要加入到redis中去,对redis的内存空间造成了很大的浪费,然后就是说这只对高并发请求同一个key有效,如果是大量不同的也不存在的key,那么这样做没有改善,依然会对数据库造成很大的压力。
    2.布隆过滤器
    我们可以使用布隆过滤器来过滤大部分不存在的key,这样就不会向redis或者数据库发起大量的查请求了。

布隆过滤器

  • 布隆过滤器维护了一个很大的位数组
  • 在初始化的时候,需要将所有存在数据的key都写入布隆过滤器,通过k个哈希函数生成为k个哈希值,然后再将k个哈希值映射到位数组上的k个点,映射到的点则置为1。在添加新的数据的时候,也需要往布隆过滤器里面写入key。
  • 这样的话,下次有个key要来查询是否存在集合中的时候,只需要再次映射到k个点上,然后看映射到的点是不是为1,如果有不为1的点话,那么就代表它一定不存在于集合中。
  • 不足之处:
    1.有可能会造成不存在的key当成存在的误判,尤其是数据量越大,误判率越高,因为查询的key的几个点可能正好落在别的很多个key所置1的点位上,但是实际上这些点位不是由该key所置1的。
    2.还有一个不足的地方就在于布隆过滤器不能删除某个key,因为如果按照插入时的点位去删除的话,可能会有别的key所映射的在这同一个点,因此是不能去删除的
  • 其优点也很明显:
    1.只维护了一个位数组,不会随着数据量增加而导致内存增加
    2.插入和查询都只是一些hash映射的操作,也不会随着数据量增大而导致时间复杂度增加
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值