我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解缓存:缓存中存在的挑战及策略

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解缓存:缓存中存在的挑战及策略

此过程旨在快速读取使用率较高的数据,避免在存取之前的数据时产生额外的计算负担。缓存只能储存数据一小段时间,这是权衡容量后的选择,以此换取更高的运行速度。

[[390218]]

像随机存取存储器(RAM)和内存存储引擎这类在缓存层下的硬件能够实现快速存取,它们通常和软件层一起被用于访问数据。缓存基本上分为两种:本地缓存和远程缓存。本地缓存依靠JVW(Java虚拟机)堆进行储存,而远程(或集群)缓存使用内存存储器,如Redis和Memcached。

什么是堆内本地缓存?

堆内缓存指把数据存储于Java堆中,在这里数据由垃圾收集器(GC)自动管理。

堆内缓存的优点:

  • GC会自动分配和释放对象
  • 访问数据的速度更快

堆内缓存的不足:

  • GC停顿多发
  • 因为数据被存储于JVM存储器之中,如果JVM崩溃了,数据就会丢失。因此无法长期缓存。

什么是堆外本地缓存?

堆外缓存指把数据存储在堆外。垃圾收集器不会自动处理这些数据,因为数据被存储在Java堆外,所以它们以字节数组存储,因此也存在把数据序列化和反序列化的额外运行负担。

堆外缓存的优点:

  • 允许大量数据的缓存且无须担心GC停顿
  • JVM崩溃后支持在存储器中添加持久层以恢复数据
  • JVM之间可共享缓存数据

堆外缓存的不足:

  • 数据的序列化和反序列化是使用堆外缓存时最大的不便之处。这会为下层程序带来计算负担。因为没有共同的数据结构,把序列化的数据转换成单独对象将付出额外的成本。
  • 短期数据更适合堆内缓存,因为它允许GC自动运行。因而,识别哪些数据可以被归于堆内缓存会带来额外的计算。
  • 手动存储器管理(像存储器分段之类的问题!)

总之,因为堆外缓存能够长期存储大量数据,所以它是存储数据的一种更好方式。再加上大磁盘子系统,就能提高每秒读写次数(IOPS)。

什么是远程缓存?

远程缓存是将数据存储在云端的缓冲区。因为可以在云端检索数据,所以这有助于构建一个更坚固且性能更强的持久层。Redis和Memcached是当下两款大受欢迎的内存缓存产品。

[[390219]]

图源:unsplash

远程缓存的优势:

  • 远程缓存集群可以根据需求进行扩展
  • 远程缓存不仅仅局限于单一数据结构,并且它支持多语言编程,因而操作简单。
  • 与磁盘的低速存取相比,性能有所增强(因为数据存储在存储器中,存取数据速度更快)

如何确定系统/服务需要缓存

  • 缓存命中率:如果服务所提供的数据不需要经常刷新且属于经常检索型数据,应当考虑缓存它们。
  • 最终一致性的容限:仔细考虑源数据的变化率,以及缓存的刷新频率。还应该考虑服务对象是否重视最近数据的读取。

缓存策略类型和相应挑战

[[390220]]

图源:unsplash

(1) 本地缓存:

通过在服务(比如说哈希表)内使用某种存储方式将使本地缓存的执行更加容易,但也会导致缓存一致性问题。意思就是,不同服务器中的本地缓存不同,这将导致数据不一致。

例如,服务器S1用数据D1响应了请求R1,并把它存储到本地缓存中。如果在数据库中的数据被更新成D2版本,之后R1再次发出相同的请求,则有可能返回数据D1或D2,这取决于请求抵达了哪个服务器。

冷启动也是内存缓存的一个重要问题。因为每一个服务器都是在没有缓存的情况下启动的,随着新服务器的增加,甚至在部署期间,对下游依赖发出的请求数量也会随之变多。这个问题可以通过请求合并解决。

(2) 外部缓存:

  • 能够解决以上问题,因为外部缓存是分开存储的,例如Redis和Memcached。
  • 提供更多存储空间并减少因容量而导致的缓存淘汰。
  • 挑战包括提高整体系统的复杂性和增加更多负载以维护额外的缓存服务器。
  • 始终在服务中添加代码来解决缓存可能不可用的情况。
  • 可以在此期间呼叫下游服务。但如果缓存中断时间过长,可能导致下游服务的负载增加。
  • 或者,外部存储器和内部存储器一起使用可以避免完全回落到下游依赖。
  • 也可以考虑采取减载技术,通过限制服务的请求数量来避免下游服务负载过重。

(3) 应对缓存扩展和弹性问题:

如果缓存达到最大容量,那么需要通过向其添加更多节点来扩展。深入了解系统及其在达到最大容量时的反应(例如,缓存达到最大容量时每个容器的内存利用率上升)有助于设置准确的警报。

这些警报可用于扩展缓存服务。在扩展服务时,需要记住两件事:缓存集群是否支持在没有宕机的情况下添加节点,或者是否支持一致性哈希算法来平衡流量分配。始终确保通过模拟故障来测试扩展策略。

(4) 控制数据的鲁棒性

缓存数据应能够读取更新后的代码格式,而更新后的代码应能够处理缓存所提供的旧版本数据。

缓存实现要点

图源:unsplash

(1) 缓存大小:根据服务中通过的数据类型可以确定缓存大小,以便提高缓存命中率。

(2) 缓存淘汰:这指的是当缓存达到最大容量时,把数据从缓存中移除。缓存淘汰最常见的模式是LRU(最近最少使用)。

(3) 缓存逾期:这是一种确定数据在缓存中的保留时间的策略,具体取决于数据刷新频率或客户处理过时数据的能力。

(4) 下游服务不可用

如果下游服务因为某些原因不可用,缓存服务不应该用更新数据的请求攻击下游,而是能够长期保护缓存,并等待它恢复。根据与客户之间的权衡协调,要么报告缓存中的过时数据,避免请求令下游服务掉线,要么使用一种机制来存储下游服务的错误响应,并对其进行相应的解释说明。

(5) 安全性

正在缓存的敏感数据或客户数据的安全性是人们对缓存集群的担忧之一。敏感数据应在存储前加密,并在输入和输出缓存数据的过程中确保其安全性。此外,由于缓存数据的返回速度比从数据库获取的调用速度快,攻击者可以根据响应时间识别服务发出的请求类型,这被称为侧信道时序攻击。

(6) “惊群效应”问题

下游服务不可用时,如果为了从下游服务获取未缓存的数据而发出多个请求,则可能会引发多次重试,进而导致服务掉线。可以结合多个策略来缓解这个情况,例如按客户或请求来进行节流、请求合并(即对相同的未缓存数据只发送一个请求)等。

缓存可以提供更快的数据访问速度和提高下游服务可用性,但它的代价是缓存节点的处理会更加复杂。通过巧妙地理解下游服务的需求,可以得出一个缓存解决方案。在不同的情景中(如流量峰值、缓存不可用、下游服务掉线等)都应当对此解决方案的表现进行仔细监控以调整参数。

希望本文能够帮你理解那些在为服务部署缓存解决方案时要牢记于心的要点。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解缓存:缓存中存在的挑战及策略

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解缓存:缓存中存在的挑战及策略

缓存基本上分为两种:本地缓存和远程缓存。本地缓存依靠JVW(Java虚拟机)堆进行储存,而远程(或集群)缓存使用内存存储器,如Redis和Memcached。

JuiceFS 缓存策略详解

对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技术可以大大降低存储操作的延时并提高数据吞
JuiceFS 缓存策略详解
2014-10-24

MySQL缓存策略详解

MySQL缓存方案 一、MySQL缓存方案目的分析1.1、缓存层的作用1.2、缓存层选择1.3、场景分析 二、提升MySQL访问性能的方式2.1、MySQL主从复制2.2、读写分离2.3、连接池2.4、异步连接 三、redi
2023-08-25

Redis缓存更新策略详解

本文实例为大家分享了Redis缓存更新策略的具体代码,供大家参考,具体内容如下一、缓存的收益与成本1.1 收益加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如mysql),内存
2022-07-28

探索HTTP缓存机制:了解常见的缓存策略

解密HTTP缓存机制:你知道有哪些常见的缓存策略吗?HTTP缓存机制是Web开发中非常重要的一部分,它可以提高网站的性能和用户体验。通过缓存,用户可以更快地加载网页内容,并减轻服务器的负载。然而,为了正确地使用缓存机制,我们需要了解其中的
探索HTTP缓存机制:了解常见的缓存策略
2024-01-23

RecyclerView的缓存机制及使用策略

当RecyclerView不再需要某个ViewHolder时(例如,当列表项被完全移出屏幕并且缓存已满时),ViewHolder会被放入RecycledViewPool并最终可能被系统回收。

探究HTTP缓存的奥秘:掌握各种缓存策略的了解

深入剖析HTTP缓存机制:了解不同的缓存策略有哪些?引言:在互联网的时代,网络性能往往成为用户体验的关键因素之一,而HTTP缓存机制作为一种优化手段,可以提升网页的加载速度,减轻服务器的负载,提高用户体验。本文将深入剖析HTTP缓存机制,
探究HTTP缓存的奥秘:掌握各种缓存策略的了解
2024-01-23

golang函数缓存的内存管理策略解读

内存管理策略:go 语言函数缓存提供三种内存管理策略:全局内存管理:所有函数共享一个全局缓存表。局部内存管理:每个包或模块有自己的缓存表,仅缓存内部定义的函数。混合内存管理:结合全局和局部缓存,同时维护全局和局部缓存表。Go 语言函数缓存的
golang函数缓存的内存管理策略解读
2024-05-02

Docker中Nginx的缓存策略与性能优化(如何在Docker中为Nginx配置高效的缓存策略?)

Docker中Nginx的缓存策略和性能优化至关重要。通过HTTP缓存、代理缓存、反向代理缓存和数据库缓存的合理配置,可以显著提升响应时间和减少服务器负载。此外,禁用未使用功能、优化工作进程配置、启用GZIP压缩、使用CDN和持续监控等性能优化措施可进一步增强Nginx的表现。定期调整策略和优化配置,确保在Docker环境中高效运行Nginx,提供最佳的Web体验。
Docker中Nginx的缓存策略与性能优化(如何在Docker中为Nginx配置高效的缓存策略?)
2024-04-02

redis 的 maxmemory 配置以及 缓存淘汰策略

1. maxmemory 相关介绍maxmemory 的作用设置 redis 可用内存的上限。maxmemory 的配置将 maxmemory 设置为零将导致没有内存限制。这是 64 位系统的默认行为,而32位系统使用 3GB 的隐式内存限制。maxmemor
redis 的 maxmemory 配置以及 缓存淘汰策略
2015-05-05

PHP中封装性的缓存策略和技术

缓存是提高应用性能的重要手段之一。在PHP开发中,合理地使用缓存可以减少数据库查询次数、提高数据读取速度,从而提升应用的响应速度和用户体验。封装性的缓存策略是指将缓存的操作封装到通用的代码块中,方便在多个地方复用,并且方便统一管理和配置。下
2023-10-21

浅谈Android 中图片的三级缓存策略

什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 网络缓存,最后加载,速度慢,浪费流量为什么要进行三级缓存三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 。如今的 APP 网络交互似乎已
2023-05-30

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

Write Behind模式和Write Through模式整个架构是一样的,核心在于write through在缓存数据库中的更新是同步的,而Write Behind是异步的。

PHP 函数调用中的缓存优化策略

为了优化 php 中经常调用的函数性能,可以通过缓存函数结果实现。有两种缓存策略:1. static 函数将结果存储在静态变量中;2. apc 扩展用于缓存字节码和函数结果。利用这些策略,可以有效减少复杂函数的计算时间,提高应用程序性能。P
PHP 函数调用中的缓存优化策略
2024-04-17

热门标签

编程热搜

编程资源站

目录