当前位置:   article > 正文

Redis与缓存_缓存云和redis

缓存云和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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/353145
推荐阅读
相关标签
  

闽ICP备14008679号