当前位置: 首页 > 科技观察

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

时间:2023-03-23 10:23:47 科技观察

缓存详解:缓存中的挑战和策略在计算机世界中,缓存是将数据子集存储在高度可访问的高速层(称为缓存)中的过程。此过程旨在快速读取大量使用的数据,而不会在访问以前的数据时产生额外的计算负担。缓存只能存储较短时间的数据,这是权衡容量以换取更高运行速度后的选择。缓存层以下的硬件,例如随机存取存储器(RAM)和内存存储引擎,可实现快速访问,并且通常与软件层结合使用以访问数据。基本上有两种类型的缓存:本地缓存和远程缓存。本地缓存依赖JVW(Java虚拟机)堆进行存储,而远程(或集群)缓存使用内存存储,例如Redis和Memcached。什么是堆内本地缓存?堆内缓存是指将数据存储在Java堆中,其??中数据由垃圾收集器(GC)自动管理。堆上缓存的优点:GC会自动分配和释放对象更快地访问数据堆上缓存不足:频繁的GC暂停因为数据存储在JVM内存中,如果JVM崩溃,数据将丢失。所以不能长期缓存。什么是堆外本地缓存?堆外缓存是指将数据存储在堆外。垃圾收集器不会自动处理这些数据,因为数据存储在Java堆之外,因此它们存储为字节数组,因此还存在额外的运行时序列化和反序列化数据的负担。堆外缓存的优点:允许缓存大量数据而不用担心GC暂停和JVM崩溃支持在内存中添加持久层来恢复数据可在JVM之间共享缓存数据堆外缓存不足:数据的序列化和反序列化是使用堆外缓存时最大的不便。这给底层程序带来了计算负担。因为没有通用的数据结构,将序列化数据转换成单独的对象会产生额外的成本。短期数据更适合堆上缓存,因为它允许GC自动运行。因此,识别哪些数据可以归因于堆上缓存涉及额外的计算。手动内存管理(内存分段等问题!)通常,堆外缓存是一种更好的数据存储方式,因为它们能够长时间存储大量数据。再加上大型磁盘子系统,可以提高每秒读写次数(IOPS)。什么是远程缓存?远程缓存是在云中存储数据的缓冲区。这有助于构建更健壮和高性能的持久层,因为可以在云中检索数据。Redis和Memcached是目前比较流行的两种内存缓存产品。来源:Unsplash远程缓存优势:远程缓存集群可以按需扩展。远程缓存不局限于单一数据结构,支持多语言编程,操作简单。相比磁盘的慢速访问,性能提升(因为数据存放在内存中,数据访问速度更快)如何判断系统/服务需要缓存缓存命中率:如果服务提供的数据没有需要经常刷新和频繁检索的数据应该考虑缓存。最终一致性的容忍度:仔细考虑源数据的变化率,以及缓存应该多久刷新一次。您还应该考虑服务对象是否重视最近的数据读取。缓存策略的种类及对应的挑战图源:unsplash(1)本地缓存:通过在服务中使用某种存储(比如哈希表),本地缓存的执行会更容易,但也会造成缓存一致性问题问题。这意味着不同服务器中的本地缓存不同,这将导致数据不一致。例如,服务器S1用数据D1响应请求R1,并存储在本地缓存中。如果数据库中的数据更新到D2版本,然后R1再次发出相同的请求,它可能会返回数据D1或D2,这取决于请求到达的服务器。冷启动也是内存缓存的一个重要问题。因为每个服务器都是在没有缓存的情况下启动的,所以随着新服务器的添加,即使在部署期间,对下游依赖项的请求数量也会增加。这个问题可以通过拉取请求合并来解决。(2)外部缓存:可以解决以上问题,因为外部缓存是单独存储的,比如Redis、Memcached。提供更多存储空间并减少因容量而导致的缓存逐出。挑战包括增加整体系统的复杂性和增加更多负载以维护额外的缓存服务器。始终在您的服务中添加代码以解决缓存可能不可用的情况。这段时间可以调用下游服务。但是,如果缓存中断时间过长,可能会导致下游服务的负载增加。或者,外部和内部存储可以一起使用,以避免完全回退到下游依赖项。您还可以考虑采用减载技术,通过限制服务请求的数量来避免下游服务过载。(3)处理缓存扩展和弹性问题:如果缓存达到其最大容量,则需要通过向其添加更多节点来进行扩展。深入了解系统及其在达到最大容量时的反应(例如,当缓存达到最大容量时每个容器的内存利用率上升)有助于设置准确的警报。这些警报可用于扩展缓存服务。在扩展服务时,需要注意两点:缓存集群是否支持不停机添加节点,或者是否支持一致性哈希算法来平衡流量分配。始终确保通过模拟故障来测试您的扩展策略。(4)控制数据的健壮性缓存的数据应该能够读取更新的代码格式,更新的代码应该能够处理缓存提供的旧版本数据。缓存实现要点图源:unsplash(1)缓存大小:缓存大小可以根据服务中传入的数据类型来确定,从而提高缓存命中率。(2)缓存淘汰:指缓存达到最大容量时,将数据从缓存中移除。最常见的缓存逐出模式是LRU(最近最少使用)。(3)缓存过期:这是一个决定数据在缓存中保留多长时间的策略,取决于数据刷新的频率或客户端处理陈旧数据的能力。(4)下游服务不可用如果下游服务由于某种原因不可用,缓存服务不应向下游发起更新数据请求攻击,而是可以长期保护缓存,等待其恢复。根据与客户端的权衡,要么在缓存中报告陈旧数据以避免请求使下游服务离线,要么使用一种机制来存储来自下游服务的错误响应并相应地解释它们。(5)安全性被缓存的敏感数据或客户数据的安全性是人们对缓存集群的关注之一。敏感数据应在存储前加密,并在缓存数据的进出过程中保持安全。此外,由于缓存数据的返回速度比从数据库中获取的调用更快,因此攻击者可以根据响应时间识别服务发出的请求类型,这被称为边信道定时攻击。(6)“雷羊群效应”问题当下游服务不可用时,如果多次请求获取下游服务未缓存的数据,可能会导致多次重试,从而导致服务下线。可以组合多种策略来缓解这种情况,例如每个客户端或请求节流、请求合并(即只发送一个对相同未缓存数据的请求)等。缓存可以提供更快的数据访问并提高下游服务的可用性,但在缓存节点进行更复杂处理的成本。通过熟练地理解下游服务的需求,可以衍生出缓存方案。应仔细监控此解决方案的性能,以在不同场景(例如流量峰值、缓存不可用、下游服务停机等)下调整参数。希望本文能帮助您了解在为您的服务部署缓存解决方案时要牢记的要点。