高并发场景下的缓存有哪些常见的问题?

简介:

一、缓存一致性问题

当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。

这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。

8e764623ee2518c933dd848971f071a8a850895a

二、缓存并发问题

缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。

此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?

我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。

ee2cad37cb6f3ba1c94f86500c5511bf13db4ee6

三、缓存穿透问题

缓存穿透在有些地方也称为“击穿”。很多朋友对缓存穿透的理解是:由于缓存故障或者缓存过期导致大量请求穿透到后端数据库服务器,从而对数据库造成巨大冲击。

这其实是一种误解。真正的缓存穿透应该是这样的:

在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

可以通过下面的几种常用方式来避免缓存传统问题:

1、缓存空对象

对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。

同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

2、单独过滤处理

对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。

8d6c8591ef02c948b4d96fc749d9e3d3746e5631

四、缓存颠簸问题

缓存的颠簸问题,有些地方可能被成为“缓存抖动”,可以看做是一种比“雪崩”更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响。一般是由于缓存节点故障导致。业内推荐的做法是通过一致性Hash算法来解决。

五、缓存的雪崩现象

缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。

还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难。

此外,从整个研发体系流程的角度,应该加强压力测试,尽量模拟真实场景,尽早的暴露问题从而防范。

18dca816110c8b6345f842aecb042696a88bbc9d

六、缓存无底洞现象

该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。

他们发现了一个问题---memcached 连接频率,效率下降了,于是加 memcached 节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。

7b469b7f519c9e6533e0d997b41497959f0560ee

目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求。

有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的。当然,也有些是在服务端进行的。

但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。

主要可以从如下几个方面避免和优化:

1、数据分布方式

有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样能够从一定程度避免网络IO的开销。

2、IO优化

可以充分利用连接池,NIO等技术来尽可能降低连接开销,增强并发连接能力。

3、数据访问方式

一次性获取大的数据集,会比分多次去获取小数据集的网络IO开销更小。

当然,缓存无底洞现象并不常见。在绝大多数的公司里可能根本不会遇到。


原文发布时间为:2018-09-11

本文作者:丁码农

本文来自云栖社区合作伙伴“Java后端技术”,了解相关信息可以关注“Java后端技术”。


相关文章
|
9月前
|
Web App开发 开发框架 监控
Playwright与Selenium对比:迁移策略与注意事项
本文分享团队将2000+ Selenium端到端测试迁至Playwright的实战经验:直面浏览器更新导致的随机失败,剖析架构、等待机制等核心差异;详解并行运行、选择器迁移、页面对象重构、分批替换四阶段策略;总结执行提速60%、稳定性提升至98%+等收益,并给出迁移决策指南。
|
Web App开发 自然语言处理 监控
基于 WebAssembly 的AIoT应用框架实践
天猫精灵大前端团队基于 WebAssembly 的AIoT应用框架实践分享。
基于 WebAssembly 的AIoT应用框架实践
|
数据可视化 搜索推荐 关系型数据库
【最佳实践】实时计算Flink在IoT行业的实时数仓建设实践
据 IDC 估计,到 2020 年物联网将在全球范围内产生 1.46 万亿美元的价值。据预测,届时中国的物联网市场规模将超过 1.8 万亿人民币。
|
1月前
|
人工智能 自然语言处理 数据可视化
QwenWork 千问办公全场景测评:打通 PPT、网页、数据分析,一站式 AI 办公平台上手体验
随着大模型技术快速迭代,市面上绝大多数AI工具依旧停留在“对话问答输出文本”的阶段。用户拿到AI输出文字之后,还需要手动复制粘贴,切换多个软件完成排版、制作PPT、整理表格、编写网页,大量时间消耗在中转操作上。千问办公QwenWork作为面向个人与企业的一站式AI原生办公平台,依托Qwen3.8旗舰大模型,跳出单纯聊天问答的定位,主打**对话即执行,生成即所得**。用户只需要输入一句自然语言指令,就可以直接拿到PPT、Word、Excel、可交互网页、视频剪辑素材、数据分析报告等可直接交付使用的成果。产品同时覆盖网页端、桌面客户端,深度打通钉钉生态,打通个人云盘、本地文件系统、连接器、定时任务
405 0
|
8月前
|
机器学习/深度学习 存储 自然语言处理
蚂蚁集团 Ling-2.5-1T 开源:万亿参数,重新定义"又快又强"
Ling-2.5-1T是蚂蚁集团inclusionAI推出的开源即时大模型(MIT协议),以“效率×效果”为核心:万亿参数、63B激活,首创混合线性注意力架构,支持百万token上下文;推理吞吐大幅提升,AIME任务仅需1/3 token即达前沿思考模型水平。ModelScope可下载。
1336 4
蚂蚁集团 Ling-2.5-1T 开源:万亿参数,重新定义"又快又强"
|
7月前
|
人工智能 弹性计算 Linux
OpenClaw 与 Codex 定位对比:架构差异、场景分工与OpenClaw阿里云/本地部署实战指南
OpenClaw(Clawdbot)与Codex并非同类替代产品,而是处于不同层级的AI协作组件。二者在能力覆盖上可以高度重叠,但在存在形态、运行架构、价值沉淀上有着本质区别:**Codex 擅长即时攻坚、临场推理、一次性解决复杂问题;OpenClaw 负责流程固化、长期记忆、自动化值守与个人工作系统沉淀**。理解这一定位差异,才能真正发挥两者的组合价值,实现“单次突破→持续复利”的AI工作闭环。
4844 0
抖音直播间点赞脚本,可点收藏点赞作品,autojs抖音点赞协议
这个脚本实现了抖音视频的自动滑动、点赞和收藏功能。主要包含以下模块: 基础配置
|
机器学习/深度学习 资源调度 计算机视觉
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
845 15
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
|
图形学
unity摄像机的平滑过渡,平滑缓冲
在Unity中,通过插值计算实现摄像机的平滑过渡与缓冲效果,避免突兀跳跃,提升玩家视觉体验。主要方法包括位置和旋转的平滑过渡,常用线性插值(Lerp)和SmoothDamp函数。代码示例展示了如何使用SmoothDamp实现摄像机从一个点到另一个点的平滑移动。将脚本挂载到场景中测试即可看到效果。
|
前端开发 JavaScript
轻松上手:基于single-spa构建qiankun微前端项目完整教程
轻松上手:基于single-spa构建qiankun微前端项目完整教程
1055 0