当前位置: 首页 > article >正文

缓存穿透和缓存雪崩

缓存穿透问题

string cacheKey = "Book" + id;//缓存键
Book? b = memoryCache.Get<Book?>(cacheKey);
if (b == null)//如果缓存中没有数据
{
    //查询数据库,然后写入缓存
    b = await ctx.Set<Book>().FindAsync(id);
    memoryCache.Set(cacheKey, b);
}

使用IMemoryCache接口中的Get和Set设置缓存时,首先从缓存中查询是否有缓存键对应的缓存内容,如果没有,则去数据库查,并把查询结果写入缓存

对于大部分正常请求,客户端都会将信息保存到缓存中,后续从缓存读取,数据库压力小;但是针对在数据库不存在的数据,缓存中不会保存任何信息,如果恶意访问使用不存在id来发送大量请求,数据库压力大,可能会导致崩溃,这就叫缓存穿透

解决办法

把“查不到”也当成一个数据放入缓存。

我们用GetOrCreateAsync方法即可,因为它会把null值也当成合法的缓存值。

缓存雪崩

缓存项集中过期引起缓存雪崩。

解决方法

在基础过期时间之上,再加一个随机的过期时间。

e.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(Random.Shared.Next(10, 15));//过期时间随机10-15


http://www.kler.cn/a/522301.html

相关文章:

  • 【Jave全栈】Java与JavaScript比较
  • 分布式版本控制系统:Git
  • 【实践案例】使用Dify构建文章生成工作流【在线搜索+封面图片生成+内容标题生成】
  • 用WinForm如何制作简易计算器
  • HarmonyOS:创建应用静态快捷方式
  • 人工智能能够进行逻辑推理码?
  • C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
  • deepseek-r1技术报告解析
  • 在RHEL 8.10上安装开源工业物联网解决方案Thingsboard 3.9
  • 【Linux】互斥锁、基于阻塞队列、环形队列的生产消费模型、单例线程池
  • “基因合作:生命演化中的共生与目的性”
  • 【2024年华为OD机试】 (A卷,200分)- 开放日活动、取出尽量少的球(JavaScriptJava PythonC/C++)
  • 6. 使用springboot做一个音乐播放器软件项目【1.0版项目完结】附带源码~
  • Android SystemUI——最近任务列表启动(十八)
  • FPGA 26,数码管动态显示,解析与实现( 使用 Xilinx Vivado 实现数码管动态显示 )
  • 计算机网络之计算机网络基本概念
  • 【Leetcode 每日一题】45. 跳跃游戏 II
  • Linux 命令之技巧(Tips for Linux Commands)
  • QT 笔记
  • 深入探讨防抖函数中的 this 上下文
  • 论文笔记(六十五)Schmidt-EKF-based Visual-Inertial Moving Object Tracking
  • LeetCode-175. 组合两个表
  • H2 Database安装部署
  • VMware 中Ubuntu无网络连接/无网络标识解决方法【已解决】
  • PHP Error处理与优化指南
  • volatile之四类内存屏障指令 内存屏障 面试重点 底层源码