Redis常见问题

一、缓存穿透

现象:一些请求,在redis中没有缓存,同时数据库中也没有内容,导致redis和DB都没有查到数据,相当于这两层被请求打穿了。黑客会利用此漏洞,大量发送无效的请求,从而导致redis或db宕机。

解决:

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
  • 布隆过滤器

二、缓存击穿

现象:主要针对的是热点key,由于redis过期时间到了,大量请求直接打到了数据库去查数据。

解决:

  1. 设置热点数据永远不过期。
  2. 加互斥锁,互斥锁参考代码如下
  3. 设置两个不同key,但是相同value;两个key 过期时间不同,当第一个key失效时,去查询第二个key,避免请求打到数据库

三、缓存雪崩

现象:一批key设置了相同的过期时间,而这些key的访问量又很大的情况下,导致大量请求直接扑向数据库。针对的是一批相同过期时间的key。

解决:

过期时间设置的时候加上一个随机数,避免同时失效

四、缓存与数据库数据不一致

1、双写引起的不一致

2、读写引起的不一致

解决:

1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。

2、就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期

时间依然可以解决大部分业务对于缓存的要求。

3、如果不能容忍缓存数据不一致,可以给key加一个分布式锁,保证只有一个线程去操作。

4、也可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度。

总结:

以上针对的都是读多写少的情况加入缓存提高性能,如果写多读多的情况又不能容忍缓存数据不一致,那就没必要加缓存了,可以直接操作数据库。

放入缓存的数据应该是对实时性、一致性要求不是很高的数据。

切记不要为了用缓存,同时又要保证绝对的一致性做大量的过度设计和控制,增加系统复杂性!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值