Redis与缓存

使用Redis的好处

首先,在学习一项技术之前,我们要知道为什么要使用这项技术。Redis会数据写在内存中,数据库会将数据持久化到硬盘。我们使用Redis的好处主要有二。

  • 提高性能,操作内存的效率要高于硬盘。
  • 提高并发能力,缓存可以分担部分请求。

所以我们处理请求时要先去查缓存,如果命中则将数据反馈给web server。否则去查数据库。

缓存雪崩

如果缓存挂了或者缓存数据在同一时间过期,那么全部的请求都要访问数据库,程序容易垮掉。这就是缓存雪崩现象。

缓存雪崩现象的解决方案

针对缓存数据在同一时间过期,可以随机设定缓存过期时间。
针对Redis挂掉,可以在事件发生前、中、后进行处理。
在事件发生前实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),避免Redis挂掉。事发中可以设置本地缓存+限流的方式缓解。事发后可以将Redis持久化的数据回复,来解决缓存雪崩

缓存穿透

查询不存在的数据,不可能命中缓存,每次请求都会访问数据库,这种情况被称为缓存穿透。

缓存穿透的解决方案

  1. 使用布隆过滤器或者压缩filter提前拦截。
  2. 将空对象放入缓存。空对象一般设置较短的过期时间。

双写一致

注意,数据库差不多的话一般是不写入缓存的,一般情况下缓存不会更新,而是删除。
双写一致的问题出现在写操作中,不一致是指缓存和数据库中数据不一致。

对于更新操作,一般根据先后操作数据库和缓存的顺序分为两种情况。

  • 先操作数据库
    如果数据库操作失败,Exception,缓存不进行操作。
    如果数据库操作成功,第二部失败,那么缓存不一致。

这种问题的解决思路是,将缓存中要删除的key发送到MQ,自己消费信息,不断删除,直到成功。

  • 先操作缓存

删除缓存失败,返回Excepion,一致。
删除成功,数据库操作失败,一致。

但是在并发条件下,还是会出现缓存不一致现象,例如,线程A删除缓存,线程B访问缓存,进而访问数据库,把旧数据写入缓存,线程A更新数据。

解决思路是实现串行化,例如将操作写入队列中,保证队列FIFO。

对比:高并发时,先删除缓存表现不好,但是原子性被破坏时表现良好。
先操作数据库则相反。

参考文档:
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484609&idx=1&sn=4c053236699fde3c2db1241ab497487b&chksm=ebd745c0dca0ccd682e91938fc30fa947df1385b06d6ae9bb52514967b0736c66684db2f1ac9&token=177635168&lang=zh_CN#rd

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值