Redis数据缓存可能遇到的问题

Redis

第一章 Redis之缓存可能遇到的问题


前言


数据批量导入,这一批数据的过期时间可能一样,如果这时候有大量请求访问,该如何解决?如果别人知道缓存中的key某个生成规则,专门发送一些攻击请求,又该怎么办?

一、我们为什么使用缓存?

使用缓存的目的就是为了减少请求直接访问数据库,使用更高性能的缓存中间件来加快查询数据,同时保护数据库不被大量请求所打垮。

二、使用缓存可能会带来哪些问题?

  1. 多引入一个中间件,就会导致系统变得更复杂,一旦中间件挂了,可能会导致系统的不可用。
  2. 像使用redis来作为缓存中间件,正常情况下可以抵御高并发情况下对数据库的冲击,但是一旦某些黑客知道了系统的一些规则,专门来攻击,还是有可能导致系统的不可能用。

1.缓存雪崩

缓存雪崩是指由于大量热点key同时过期,导致大量请求直接访问数据库,导致数据库承受不住这样的压力,可能导致数据的宕机,最终导致服务的不可用。

如何解决这样的问题呢?以下有解决几方案:

  1. 保证缓存层服务的高可用,比如redis sentinel或redis cluster;
  2. 依赖隔离组件为后端限流、熔断或者服务降级,比如使用sentinel、Hystrix限流组件。
  3. 上线前提前做好演练;
  4. 在代码层面就是给这些热点key的过期时间上增加一些随机性,避免这些热点key同时过期。

2.缓存穿透

缓存穿透的意思是查询一个根本不存在的数据,缓存层和数据库层都不命中,通常处于容错考虑,如果从数据库层查询不到的数据则不写入缓存层。

出现这种情况有可能像淘宝管理员把货物数据删除,但是此刻有大量请求访问或者黑客攻击一些专门不存在的数据,导致数据库层和缓存层都查询不到。

解决办法:

  1. 布隆过滤器,布隆过滤器的特点是,如果在布隆过滤中查询不到,那么缓存中就一定不存在,如果布隆过滤器可以查询到,那么缓存中可能存在。缺点就是需要在服务启动的时候把数据加载进去,一点缓存中某些key被删除了,布隆过滤器中的数据无法被删除,数据会越来越多。
  2. 前端负载均衡,限流。
  3. 当查询数据库为空时,在缓存中设置一个空缓存,再次查询的时候,就可以返回一个空对象了。为了防止缓存中存储过多的无效数据,可以给这些缓存设置一个过期时间。

3、缓存击穿

缓存击穿的意思是查询一个数据在缓存中没有,但是在数据库中有,但是一旦有大量请求访问,由于在缓存中查询不到,会直接请求数据库层,数据库压力过大。

出现这种情况有可能像直播带货,宣传一种平时不热销的商品,但是在宣传完之后,会有大量的人进行访问购物,此刻对于后端来说,缓存中是没有这样的商品信息的。

解决办法:

  1. 不给这些商品设置过期时间,缺点就是缓存中会缓存过多无用数据。
  2. 使用类似单例模式中DCL方式,双重检测。先查询缓存,如果查询不到,则进行加锁,再次进行查询缓存,如果还是查询不到,则查询数据库。大部分情况下,只有在一开始有大量请求获取不到数据,由于加锁,所有线程都需要获取锁,线程被阻塞住了,一旦第一个线程获取数据成功,锁被释放,后续都可以获取数据成功。
  3. 另一个方案在方案2的基础上,可以在锁的时间上增加一个过期时间,但部分情况下,等待一个很短时间内数据就已经被加载到了缓存中,这样就避免了线程需要一个一个进行排队获取锁,提高了并发量。
  4. 另一个就是使用读写锁,在修改和新增数据的时候,使用写锁,查询数据的时候使用读锁,在控制粒度上就比方案2中好很多,并发量可以大量提高,推荐使用Redission这个jar包。

总结

`以上就是我个人对使用redis中可能会出现的问题中的一部分总结,如果有不一样的见解或者有疑问,可以在评论区见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值