Redis缓存穿透、击穿、雪崩等场景解决方案
					当前位置:点晴教程→知识管理交流
					
					→『 技术文档交流 』
					
				 
				
 一、缓存穿透定义:查询一个不存在的数据,Mysql查询不到数据也不会直接写入缓存,导致每次请求都要查数据库 两个解决方案: 
 举例说明:根据文章id查询文章,请求路径如下: 
 正常缓存流程:根据id到redis中爬取数据,若找到数据则返回结果;若redis中未找到,再到数据库中查找,将结果返回,返回前需将数据库中查到的数据存储于redis中 缓存穿透是查询一个不存在的数据,Mysql查询不到数据也不会直接写入缓存,导致每次请求都要查数据库。导致这种情况一般是由于系统被恶意攻击,请求路径被获取后制造假id(0、复数、很大的值),疯狂冲击数据库,数据库并发并不高,请求达到一定量就会造成宕机 关于布隆过滤器 二、缓存击穿定义:给某个key设置过期时间,当key过期时,刚好这个时间点key有大量的并发请求,这些并发请求可能瞬间把DB压垮。 虽然我们再查询时把数据同步到redis,但可能在缓存重建时,存入的是多个表汇总的结果,可能需要分组统计花费较长的时间,比如花费了50毫秒,这时若有大量请求数据库是承受不住的。 两个解决方案: 
 互斥锁:强一致性、性能差 
 逻辑过期:高可用、性能优 
 三、缓存雪崩定义:指同一时段大量缓存key同时失效或Redis服务宕机,导致大量请求达到数据库造成巨大压力。 解决方案 
 降级可作为系统的保底策略,适用于穿透、击穿、雪崩 四、双写一致性定义:当修改了数据库数据也要更新缓存的数据,保持缓存和数据库的数据一致 
 
 先删除缓存,还是先修改数据库? 先删除缓存,再修改数据库 
 
 
 修改数据库数据前被其他线程写入缓存,导致缓存与数据库数据不一致 
 先修改操作数据库,再删除缓存 
 线程1得到的返回的结果写入缓存,与线程2更新的数据库数据对不上 
 所以不管先删除缓存,还是先修改数据库都会出现脏数据,应该采取延迟双删的方法,即删除两次缓存,可以降低脏数据的出现。延迟删除是因为数据库是主存模式,延迟删除让主节点把数据同步到从节点,但延迟删除也只是控制了一部分脏数据的风险,由于延迟时间不好确认,也有脏数据的风险,做不到绝对的强一至。 如何保持强一致性? 
 强一致,性能低 
 一般存入缓存的数据都是读多写少,用读写锁来进行控制 
 具体代码操作: 
 
 利用异步通知解决数据同步问题 
 
 
 它是基于mysql的主从同步实现 五、持久化两种方式:RDB、AOF 
 将内存中的数据存到磁盘中,当redis实例故障重启后,从磁盘读取快照文件,恢复数据 人工主动备份: 
 redis内部有触发RBG的机制,可以在redis.conf文件中找到 
 六、数据过期策略Redis过期删除策略:惰性删除 + 定期删除两种策略配合使用 
 定义:访问key时再判断是否过期,过期则删除,反之返回key         优点:对CPU友好 
 定义:每隔一段时间,会从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key(随之时间推一会遍历所有key,把所有过期key删除) 
 优点:可通过限制删除操作执行时长和频率减少删除操作对CPU的影响,另外定期删除能有效释放过期键占用的内存 七、数据淘汰策略定义:当redis内存不足想添加新key,会按照某种规则将内存数据删除,这种数据删除规则被成为内存的淘汰策略 
 
 
 使用建议 
 转自https://www.cnblogs.com/PandaVerse/p/18399430 该文章在 2025/5/15 9:52:50 编辑过  | 
		
			 关键字查询 
				相关文章 
				正在查询...  |