Redis的缓存穿透,缓存击穿,缓存雪崩
1.缓存穿透
缓存穿透是指当用户查询一条数据的时候,而此时数据库和缓存内却没有关于这条数据的任何记录,这时他拿不到数据,会一直查询数据库,这样会对数据库的访问造成很大的压力。
解决方案:
1.缓存空对象
缓存空对象就是第一次请求,发现缓存内不存在,数据库内也不存在,将空结果给缓存起来,当第二次访问的时候直接将空值返回出去,但是这样会导致缓存内有大量的空对象,这样不仅会占用许多内存空间,还会浪费很多资源,可以给空对象设置过期时间来解决这个问题

2.使用布隆过滤器
布隆过滤器是一种基于概率的数据结构,主要用于判断当前某个元素是否在该集合中
布隆过滤器特点:
1.一个非常强大的二进制数组
2.拥有若干个哈希函数
3.在空间效率和查询效率都非常高
4.布隆过滤器不会提供删除方法,在代码维护上比较困难
2.缓存击穿
缓存击穿是指当这个key在缓存的过期时间时,突然有大量有关这个key的访问请求,这样会导致大量并发请求直接穿透缓存,请求数据库,瞬间对数据库访问压力增大
造成缓存击穿的原因有两个:
1.一个冷门的key突然被大量用户请求访问。
2.一个热门key在缓存中恰好过期,这时有大量用户来进行访问

对于缓存击穿最常用的方案是加锁,对于key过期要查询数据的时候加上一把锁,这时只能让第一个请求进行查询数据库,然后把从数据库查询的值放入缓存中。
3.缓存雪崩
缓存雪崩是指在某一时间段内,缓存集中过期失效,如果在这个时间段内有大量请求,而查询量巨大,所有请求都会达到存储层,存储层调用量会暴增,引起数据库压力过大甚至宕机。
引发缓存雪崩的原因:
1.Redis宕机
2.大部分数据失效

解决方案:
1.redis高可用
多增加几台redis实现,一主多从或多主多从,这样一台挂掉之后其他的还可以继续工作,其实就是搭建redis集群
2.限流降级
在缓存失效后通过加锁或者队列来控制读数据库写缓存的线程数量,对某个key只允许一个线程查询数据和写缓存,其他线程进行等待
3.数据预热
就是在正式部署之前,先把数据预先访问一遍这样数据就会加载到缓存中。
4.不同过期时间
设置不同的过期时间,让缓存失效的时间点尽量均匀。
原文链接:
https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247506412&idx=2&sn=27191b8f082aa0bbcdd76e03532e4ad5&chksm=eb505cdadc27d5ccc6fd3db89e15795ef95af2b87b3dee16825c59e4251264a5a309ba773368&scene=126&sessionid=1599555032&key=519b8bbaea533f944777a28cd34c8647e7f535159b4117a0d79ebcbc474f799cab69bee182a0ef2f465b0be8ed0186d898c1d12a26f9276d60c2cd424c9d06f31ca665eea8a9eacc7aa29f1982fb17c4cb4a03d385098c4a09345f2306066ed67c9da892bacd4692db2c99426d7e8102e87f395278374fd4accdcb61eeeb8459&ascene=1&uin=MzM4NTcyMzU4NA%3D%3D&devicetype=Windows+10+x64&version=62090538&lang=zh_CN&exportkey=ASsOv0q2Lnj%2FBcupefzCcrM%3D&pass_ticket=cL0BEjI%2Fvpl4uxIdtSMEBmhxQHs8kTSvskF5zbN8Mv%2BABq8oIwc%2FuHS20VPSMR1t&wx_header=0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-09-23 复习四(读取XML)