本地缓存 分布式缓存_分布式缓存–概述

本地缓存 分布式缓存

什么是分布式缓存? 一种在应用程序(通常是Web应用程序)中“部署”的解决方案,可确保从内存而不是从磁盘(速度要慢得多)加载数据,以提高性能和响应时间。

如果要在单台计算机上使用缓存,这看起来很容易-您只需从内存中的数据库中加载最活跃的数据(例如Guava缓存实例),然后从那里提供数据。 当它必须在集群中工作时,它变得有些复杂-例如,5个应用程序节点以循环方式为用户提供请求。

每当对其中一台计算机的请求更新一条数据时,就必须在所有计算机上更新内存缓存。 如果仅将所有数据加载到内存中而不使数据无效,则高速缓存将不会具有“连贯性”,它将具有过时的值,并且对不同应用程序节点的请求将具有不同的结果,您肯定会避免这种情况。 或者,您可能只有一台具有大量内存的大型缓存服务器,但它可能会死机,这可能会破坏流畅的操作,因此,您希望在群集中至少拥有2台计算机。

您可以通过不同的方式获得分布式缓存。 列举一些:Infinispan( 我之前已经讲过),Terracotta / Ehcache,Hazelcast,Memcached,Redis,Cassandra,Elasticache(由Amazon负责)。 前三个是特定于Java的(均符合JCache),但是其余三个可以在任何设置中使用。 Cassandra最初并不是要用作缓存解决方案,但可以很容易地这样使用。

所有这些都具有不同的配置和不同的选项,甚至具有不同的体系结构。 例如,您可以使用中央Terracotta服务器或对等八卦协议来运行Ehcache。 过程中方法也适用于Infinispan和Hazelcast。 或者,您可以依赖于云提供的服务,例如Elasticache,或者可以设置自己的Memcached / Redis / Cassandra服务器集群。 由于网络开销,在应用程序节点本身上具有缓存比在专用内存服务器(群集)上具有更快的速度。

缓存是围绕键和值构造的-每个键都有一个缓存的条目。 当您想从数据库中加载某些内容时,首先要检查高速缓存中是否没有带有该键的条目(例如,基于数据库记录的ID)。 如果缓存中存在键,则不执行数据库查询。

但是数据如何“分布”? 同时将所有数据加载到所有节点上是没有意义的,因为复制会浪费空间,而保持高速缓存的一致性又是一个问题。 大多数解决方案都依赖于所谓的“一致性哈希” 。 当您寻找特定键时,将计算其哈希值(取决于缓存集群中的计算机数量),并且缓存解决方案会确切知道相应值位于哪台计算机上。 您可以在Wikipedia文章中阅读更多详细信息,但是该方法即使在从缓存群集(即保存缓存数据的计算机群集)中添加或删除节点时也有效。

然后,当您进行更新时,您还将更新缓存项,缓存解决方案会传播该缓存项,以使缓存保持一致。 请注意,如果您直接在数据库中进行手动更新,则缓存将具有陈旧的数据。

在应用程序级别,通常需要抽象出与缓存的交互。 您最终会得到类似通用“ get”方法的内容,该方法检查缓存,然后才进入数据库。 对于按ID获取查询确实如此,但是缓存也可以应用于其他SELECT查询-您只需将查询用作键,并将查询结果用作值。 对于更新,它将类似地更新数据库和缓存。

一些框架提供了开箱即用的这些抽象-像Hibernate这样的ORM拥有所谓的缓存提供程序,因此您只需添加一个配置选项,说“我要使用(第二级)缓存”,您的ORM操作就会自动咨询已配置的缓存提供程序在访问数据库之前。 Spring具有@Cacheable批注,该批注可以使用其参数作为键来缓存方法调用。 其他框架和语言通常也有类似的东西。

重要的旁注–您可能需要预加载缓存。 在群集的全新启动上(例如, 在以蓝绿色部署方案进行新部署 /崩溃/网络故障等之后),系统填充缓存可能会变慢。 因此,您可能在启动时运行了一个批处理作业,以从数据库中获取一些数据并将其放入缓存中。

听起来很简单,这很好–基本设置涵盖了大多数情况。 实际上,调整缓存配置要复杂一些。 即使您设法设置集群(例如在AWS中可能会遇到挑战),您的缓存策略也可能并非一帆风顺。 您必须回答几个可能很重要的问题–您希望缓存条目保留多少? 您需要多大的缓存空间? 元素应如何过期(缓存逐出策略)–最近使用最少,最不频繁使用,先进先出?

这些选项通常听起来是任意的。 通常您会使用默认值,而不必理会。 但是您必须经常关注缓存统计信息,进行性能测试,度量和调整。 有时,单个配置选项会产生很大的影响。

测量方面的一个重要注意事项–您不一定要缓存所有内容。 您可以以这种方式开始,但是事实证明,对于某些类型的条目,实际上最好不要缓存。 通常,这些是经常更新且读取的频率不高的文件,因此,使用它们不断更新缓存是一项无法弥补的开销。 所以–测量,调整,重复。

分布式缓存是Web应用程序几乎不可或缺的组件。 但是,我已经就给定系统如何非常庞大且需要大量硬件,其中所有数据都适合笔记本电脑内存的问题进行了无数讨论。 因此,令我惊讶的是,事实证明这还不是一个众所周知的概念。 我希望我对该概念和各种选择进行了简短但足够的概述。

翻译自: https://www.javacodegeeks.com/2017/04/distributed-cache-overview.html

本地缓存 分布式缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值