Redis缓存三大问题

1. 前言

使用redis做缓存一般使用如下方式:

  1. 后台接受到请求
  2. 查询redis看是否存在,存在则直接返回
  3. 查询数据库,如果查询到则插入redis后返回, 否则返回null

但是, 在大数据量请求的情况下往往存在以下问题

2. 缓存穿透

查询一条不存在的数据

举例: 黑客攻击

黑客以一个不存在的订单号不停的对数据进行查询, 这会造成我们查询redis后查询不到结果,然后不停的查询数据库

2.1. 规则校验

订单号中添加几位用于校验的值,在请求过来后先进性校验, 如果不存在则直接返回

摸到规律后非常容易破解

2.2. 设置返回空对象

在查询数据库后, 如果数据不存在, 则插入一条过期时间为2秒的空对象, 这样2秒内过来的请求就不会进行数据查询

  1. 如果黑客进行了并发查询呢? 这会造成同一毫秒内大批量数据进行查询数据库
  2. 如果黑客每次查询的时候将订单号+1 呢?

2.3. 设置返回空对象+redis锁

  1. 查询redis 存在则返回
  2. 加锁, 没有获取锁则等待
  3. 查询redis 存在则返回
  4. 查询数据库
    1. 存在则加入redis并返回
    2. 不存在则加入空对象,时间2s
  5. 解锁

说明:

  1. 逻辑2 中使用的是redis锁, 而不是声明一个ReentrantLock, ReentrantLock需要放在成员变量中, 这会导致锁的颗粒度过大, 会影响到正常的业务逻辑
  2. 逻辑4.1 中再次查询了一次redis是因为当第一个线程获取锁后, 后续线程处于等待状态 , 当第一个线程释放锁时, 数据已经被放在redis中了

黑客每次查询的时候将订单号+1 这种情况仍然没有解决

2.4. 使用布隆过滤器

布隆过滤器

360度无死角

3. 缓存击穿

一条数据redis中没有, 数据库中有. 并发情况下瞬间所有的请求都去查询了数据库

举例:

商品设置了过期时间为2秒, 在失效的瞬间, 大量请求过来, 查询redis没有,全部查询了数据量

3.1. 设置热点数据永不过期

会给redis造成一定压力

3.2. redis锁

具体实现和缓存穿透-设置返回空对象+redis锁差不多

线程等待可能会比较多, 可能会出现问题

3.3. 查询时刷新时间

每次进行查询时刷新下时间, 保证该数据为热点数据

4. 缓存雪崩

添加缓存时设置了相同的过期时间,导致大批量数据缓存在某一时刻同时失效,全部请求数据库.造成数据库压力过大雪崩

4.1. 随机数过期时间

在添加缓存时使用一个范围内的随机数的过期时间

4.2. 高可用集群

没有什么事情不是加一台服务器不能解决的, 如果不能,就加两台!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值