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

缓存常见问题优化

1.缓存是什么?

缓存(Cache)是一种存储技术,用于暂时存储数据副本,以便更快地访问这些数据,最常存储于内存中。缓存的主要目的是提高数据访问的速度和效率,从而改善应用程序的性能和用户体验。

当应用程序需要访问某些数据时,它首先检查缓存中是否存在该数据的副本。如果存在(称为“缓存命中”),则直接从缓存中读取数据,而不是从原始数据源(如数据库或远程服务器)获取数据,缓存减少了对后端系统的请求次数,有助于减少服务器的负载。

2.为什么需要缓存优化?

缓存优化是软件开发中的一个重要概念,它可以帮助提高应用程序的性能、减少延迟、节省计算资源以及改善用户体验,特别是在现代 Web 和移动应用开发中,通过合理设计缓存策略,可以极大地提升系统的效率和用户体验。

3.常见的缓存问题及其解决方案

3.1. 缓存穿透

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,导致所有的请求都直接到达数据库,给数据库带来极大的压力。

解决方法:

1.设置过滤规则:
黑名单/白名单: 对非法或不存在的查询进行过滤,只允许合法的查询进入缓存或数据库。
参数校验: 在请求进入系统之前,进行参数的有效性校验,阻止无效请求进入缓存或数据库。


2.布隆过滤器:
使用布隆过滤器可以在一定程度上判断一个元素是否存在于集合中,对于不存在的查询可以直接在前端拒绝,避免无效请求进入缓存或数据库。
布隆过滤器虽然可能会产生一定的误判率,但对于不存在的数据,其误判率非常低,因此可以有效地减少无效请求。


3.设置特殊值:
当查询的数据在数据库中不存在时,仍然可以在缓存中存储一个特殊值(例如,null 或者一个特定的标识),并设置一个较短的过期时间(例如几分钟)。这样后续对该数据的查询可以直接从缓存中获取特殊值,而不会再次查询数据库。
设定过期时间:
为特殊值设置过期时间,以避免长时间占用缓存空间。


3.2. 缓存雪崩

缓存雪崩是指缓存中大量key失效后,当高并发请求到来时会短时间内大量请求涌向数据库,数据库资源会被极大消耗,可能会导致数据库崩溃。

解决方法:

1.同步锁:
使用分布式锁确保在一个缓存项过期时,只有一个线程负责加载新的缓存数据,其他线程等待锁释放后再尝试获取数据。


2.设置随机过期时间:
为了避免缓存项同时过期,可以为缓存项设置一个随机的过期时间,这样可以分散过期的时间点,避免大量的请求在同一时刻涌入后端系统。


3.缓存预热:
在系统启动时或定期刷新缓存,预先加载热点数据到缓存中,减少缓存过期的同时发生的概率。


3.3. 缓存击穿

缓存击穿是指同一个热点数据在缓存中过期的时候,恰好有大量的并发请求过来,导致这些请求都落到数据库上,极大消耗数据库资源,可能会导致数据库崩溃。

解决方法:

1.使用同步锁:
当数据过期时,使用同步锁确保只有一个线程去加载数据,其他线程等待锁释放后再尝试获取数据。
同步锁的范围尽量设置得小一些,以减少锁的等待时间。


2.预加载缓存:
在数据即将过期之前,提前加载数据到缓存中,以减少过期同时发生的情况。

3.热点数据不过期

由后台将热点数据提前写入缓存并把热点数据的过期时间设为不过期或为很长一段时间。


4.备用数据源:
准备备份数据源或降级策略,以便在缓存失效时使用,例如使用静态数据或默认值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 树莓派边缘计算网关搭建:集成MQTT、SQLite与Flask的完整解决方案
  • 数据结构初阶最终讲:排序
  • 使用python-pptx代码添加幻灯片:向PPT中插入新的幻灯片页面
  • Openwrt配置ZeroTier,实现公网访问内网中服务器
  • Windows下,C# 通过FastDDS高效通信
  • 碳化硅陶瓷膜过滤设备优异的过滤性能
  • 前端技术 -- 动画效果之GSAP作用与使用示例
  • Apex - Annotation#AuraEnabled
  • go的工厂模式
  • Oracle Flashback Recyclebin从回收站中恢复被删除的对象
  • 使用RabbitMQ死信交换机实现延迟消息
  • MySQL Galera Cluster 部署与介绍
  • 天津教育杂志天津教育杂志社天津教育编辑部2024年第24期目录
  • 【C++】函数的调用
  • 【RISC-V设计-05】- RISC-V处理器设计K0A之GPR
  • 深入了解以太坊
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Apache Zeppelin在Apache Trafodion上的可视化
  • EventListener原理
  • JS数组方法汇总
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • markdown编辑器简评
  • PHP面试之三:MySQL数据库
  • Sass Day-01
  • vue2.0项目引入element-ui
  • vue-loader 源码解析系列之 selector
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • zookeeper系列(七)实战分布式命名服务
  • 闭包--闭包之tab栏切换(四)
  • 深入 Nginx 之配置篇
  • 什么是Javascript函数节流?
  • -- 数据结构 顺序表 --Java
  • 再次简单明了总结flex布局,一看就懂...
  • 转载:[译] 内容加速黑科技趣谈
  • Linux权限管理(week1_day5)--技术流ken
  • !!Dom4j 学习笔记
  • # Kafka_深入探秘者(2):kafka 生产者
  • #### golang中【堆】的使用及底层 ####
  • #APPINVENTOR学习记录
  • #HarmonyOS:基础语法
  • #在 README.md 中生成项目目录结构
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (NSDate) 时间 (time )比较
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (论文阅读11/100)Fast R-CNN
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)JAVA中的堆栈
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)setTimeout 和 setInterval 的区别
  • (转)关于多人操作数据的处理策略