Redis在项目中的正确使用

缓存穿透:

问题:比如在我们的系统中搜索一个不存在id的产品,这个产品对应的id就不会存到redis中,数据库中也不会有这个id。所有当我们不停的发送根据这个id查询的请求时,就会直接命中到我们的数据库。当请求量非常大时就会把我们的数据库给干宕机。

解决方案:当搜索一个不存在的产品id时,首先会因为我们的redis中没有数据进而去查询我们的db,然后查询到一个null,这个时候我们也将这个产品id进行缓存起来,对应的value为null即可,然后设置一个失效时间。为什么要设置一个失效时间呢,首先可以节省缓存,其次担心我们的db中某天真的加入了这个id的产品,导致一直查询redis为null,我们也可以使用布隆过滤器将所有的产品进行储存,但是布隆过滤器不支持删除数据,如果要删除得重新初始化数据。

缓存击穿或失效:

问题:由于我们批量导入到redis中的数据都加入了失效时间,并且失效时间都是相同的,所以导致我们的key大面积的同一时刻被删除。然后所有的请求命中我们的数据库。然后导致数据库宕机。

解决方案:批量导入数据的时候设置缓存key的失效时间为随机数即可。

缓存雪崩:

问题:请求量过大,缓存层突然挂掉,所有的请求直接命中数据库。

解决方案:搭建高可用的缓存层,reids哨兵/集群。或者使用接口限流hystrix。

冷数据转热点数据

问题:项目中我们不是会将所有的产品id进行缓存的,但这时候如果大量的请求去查询这个产品id时,在高并发的情况下就会出现大量的请求命中到我们的数据库。导致数据库宕机。

解决方案:使用分布式锁,当第一个请求拿到锁后去查询db然后将这个产品id进行缓存起来,后面的请求就可以重新重缓存中获取到了。

缓存于db双写不一致的问题

问题:新数据会被旧数据所覆盖

解决方案:归根结底的原因就是因为并发过大量的线程并行的导致的,所以我们可以将并行转为串行。这个时候我们可以使用消息队列mq或者是锁来实现。mq:所有的请求都加入到我们的mq中,让请求有序的执行。分布式读写锁:可以使用redis的分布式读写锁。redisson.getReadWriteLock("key");这种就会稍微比mq好一点,所有的读请求就跟没有锁一样,遇到写请求就会对这个key加一个排它锁,其他线程都得等待。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值