zoukankan      html  css  js  c++  java
  • 分布式相关

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

    如果要在单台机器上使用高速缓存,那么看起来很简单 - 只需从内存中的数据库中加载最活跃的数据(例如Guava Cache实例),然后从中提供。当必须在集群中工作时,它变得有点复杂 - 例如5个应用节点以循环方式向用户提供请求。

    每次通过向其中一台机器发送请求更新数据时,您必须更新所有计算机上的内存缓存。如果您只是将所有数据加载到内存中并且不会使其无效,那么缓存将不会“一致” - 它将具有陈旧的值,并且对不同应用程序节点的请求会得到不同的结果,这些结果绝对是您想要避免的。或者你可以拥有一个大容量的缓存服务器,它拥有大量的内存,但可能会死掉 - 这可能会破坏平稳的操作,所以你希望在一个集群中至少有两台机器。

    您可以通过不同的方式获得分布式缓存。列出几个:Infinispan(我已经介绍过),Terracotta / Ehcache,Hazelcast,Memcached,Redis,Cassandra,Elasticache(亚马逊)。前三者是Java专用的(兼容JCache),但其余的可以用于任何设置。Cassandra最初并不是缓存解决方案,但它可以很容易地被使用。

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

    缓存是围绕键和值构建的 - 每个键都有一个缓存条目。当你想从数据库中加载某些东西时,首先检查缓存是否没有包含该键的条目(例如,基于数据库记录的ID)。如果缓存中存在密钥,则不需要执行数据库查询。

    但数据如何“分布式”?在同一时间加载所有节点上的所有数据是没有意义的,因为重复是浪费空间并保持缓存一致性将再次成为问题。大多数解决方案都依赖于所谓的“一致哈希”。当您查找特定密钥时,会计算其哈希值(取决于高速缓存集群中的计算机数量),高速缓存解决方案确切知道相应值位于哪台计算机上。您可以在维基百科文章中阅读更多详细信息,但该方法即使在您从缓存集群添加或删除节点时(即保存缓存数据的机器集群)也能正常工作。

     

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

    在应用程序级别上,通常需要抽象与缓存的交互。你最终会得到类似通用的“get”方法来检查缓存,然后才转到数据库。这适用于逐个查询的查询,但缓存也可以应用于其他SELECT查询 - 您只需将查询用作关键字,并将查询结果用作值。对于更新,它会同样更新数据库和缓存。

    有些框架开箱即可提供这些抽象--ORM等ORM具有所谓的缓存提供程序,因此您只需添加一个配置选项“我想使用(第二级)缓存”,并且您的ORM操作会自动查询配置的缓存提供程序在命中数据库之前。Spring有

    @Cacheable

    注解可以缓存方法调用,使用它们的参数作为关键字。其他框架和语言通常也有类似的东西。一个重要的方面 - 您可能需要预先加载缓存。在集群的全新启动(例如,在蓝绿色部署方案 /崩溃/网络故障等的新部署之后),系统填充缓存的速度可能会很慢。因此,您可能会在启动时运行批处理作业,以从数据库中获取一些数据并将它们放入缓存中。

    听起来很简单,这很好 - 基本设置涵盖了大部分情况。实际上,调整缓存配置有点复杂。即使您设法设置群集(这可能会对AWS有挑战性),但您的缓存策略可能并不简单。您必须回答几个可能很重要的问题 - 您希望您的缓存条目存活多少?你需要多大的缓存?元素应该如何过期(缓存逐出策略) - 最近最少使用,最少使用,先进先出?

    这些选项通常听起来是任意的 您通常会使用默认设置,不要打扰。但是你必须时刻关注缓存统计信息,进行性能测试,测量和调整。有时候一个配置选项会产生很大的影响。

    测量方面的一个重要注意事项 - 您不一定要缓存所有内容。你可以用这种方式开始,但是对于某些类型的条目,实际上没有缓存可能会更好。通常这些是经常更新并且不经常读取的,所以不断地用它们来更新缓存是不值得的开销。所以 - 测量,调整,重复。

    分布式缓存是Web应用程序的一个几乎必需的组件。然而,我曾经讨论过一个给定的系统如何很大,需要大量的硬件,所有的数据都适合我的笔记本电脑的内存。所以,令我惊讶的是,事实证明这还不是一个众所周知的概念。我希望我已经对这个概念和各种选项做了简短而充分的概述。

  • 相关阅读:
    Lombok 安装、入门
    Centos 6.5中使用yum安装jdk
    Mysql规范和使用注意点(转)
    Java编码规范
    windows2016重新配置sid
    Postman POST接口请求无法获取数据
    微信修改密码
    SQL事务
    .net时间格式化
    SQL查询列是否有重复值
  • 原文地址:https://www.cnblogs.com/xiaoshen666/p/11118616.html
Copyright © 2011-2022 走看看