赞
踩
首先,在学习一项技术之前,我们要知道为什么要使用这项技术。Redis会数据写在内存中,数据库会将数据持久化到硬盘。我们使用Redis的好处主要有二。
所以我们处理请求时要先去查缓存,如果命中则将数据反馈给web server。否则去查数据库。
如果缓存挂了或者缓存数据在同一时间过期,那么全部的请求都要访问数据库,程序容易垮掉。这就是缓存雪崩现象。
针对缓存数据在同一时间过期,可以随机设定缓存过期时间。
针对Redis挂掉,可以在事件发生前、中、后进行处理。
在事件发生前实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),避免Redis挂掉。事发中可以设置本地缓存+限流的方式缓解。事发后可以将Redis持久化的数据回复,来解决缓存雪崩
查询不存在的数据,不可能命中缓存,每次请求都会访问数据库,这种情况被称为缓存穿透。
注意,数据库差不多的话一般是不写入缓存的,一般情况下缓存不会更新,而是删除。
双写一致的问题出现在写操作中,不一致是指缓存和数据库中数据不一致。
对于更新操作,一般根据先后操作数据库和缓存的顺序分为两种情况。
这种问题的解决思路是,将缓存中要删除的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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。