运用 NCache 作为 Spring 数据缓存

Java Web 应用和 API

大家好,我叫苏莱曼,在这个视频中我们将探讨如何使用 NCache 我们将使用 Spring Data 并通过缓存来提升应用程序的性能。我这里有一个示例项目,它是一个 Spring Boot 应用程序。我们将首先实现 Spring 缓存,并借助 Spring Boot 缓存自动配置选项来实现这一点。

届时,缓存数据将被存储在内存中。完成之后,我们将插入…… NCache然后我将向您展示缓存数据是如何保存到缓存服务器上的。

NCache 卓越

所以,这通常是企业环境中部署缓存的架构。我们有一个独立的应用层,也称为缓存客户端,客户端应用程序就运行在这个层。然后,请注意还有一个独立的缓存层,其中包含我们的缓存服务器。最后是数据库层。我的架构与此非常相似。

NCache 企业环境中的部署
NCache 企业环境中的部署

NCache Spring Data 的设置

在开始设置之前,我们先来看一下我的项目。正如我提到的,这是一个 Spring Boot 应用,简单来说,它对这个产品对象执行 CRUD 操作。

示例应用程序

你会注意到我还编写了一个 HTML 页面。我们将使用用户界面与我们的端点进行交互。如果我进入产品控制器,你会看到我定义的端点。这里有…… 获取产品(), 添加产品()removeProduct()在服务层,你可以看到我还没有实现缓存。如果我们查看代码仓库,你会发现我使用了 Spring Data。所以目前客户端应用程序只与数据库交互,而没有与缓存交互。接下来我们将逐步讲解。

Spring 数据缓存注解

  • 启用缓存
    @EnableCaching
  • 获取缓存
    @Cacheable(value="demoCache", key="#id", unless = "#result == null")
  • 缓存放置
    @CachePut(value="demoCache", key="#product.productID")
  • 缓存清除
    @CacheEvict(value="demoCache", key="#id")

启用缓存

第一步非常简单,设置起来也很容易。我们只需要将这些注解添加到我们的类中。我们先从添加注解开始。 @EnableCache 注解。所以我会在主类中添加这个注解。如果你引入了 Spring 上下文支持依赖项(我认为 Spring Boot 自带这个依赖项),那么你应该可以使用这个注解。

@EnableCaching

获取缓存

完成上述步骤后,我们将进入服务层,添加可缓存方法注解。我知道有些人喜欢在控制器类中执行此操作,但这只是个人需求的问题。所以我们将这样做: @可缓存我将传入已创建或要创建的缓存名称。我将传入键值,在本例中,键值是方法参数,即 #id。我还会添加一个条件:除非结果等于 null,否则不缓存 null 值。

@Cacheable(value = "demoCache", key = "#id", unless = "#result==null")

缓存放置

就我们的产品而言,我们将这样做 @CachePut我将传入相同的值,但这次键会不同,因为我们没有 ID。所以我将直接传入产品 ID 的引用。也就是 product.productID。

@CachePut(value = "demoCache", key = "#product.productID")

你会注意到,在我的产品类中,产品 ID 是主键。这就是我这样做的原因。

缓存清除

最后,如果要删除缓存,我们将使用 @CacheEvict。这里的密钥是 #id。

@CacheEvict(value = "demoCache", key = "#id")

差不多就是这样了。我们刚刚添加了这些注解。请记住,目前我们仍然在使用 Spring 缓存。这会创建一个缓存实例并将缓存数据保存在内存中。当然,我们想要做的是将其插入到 Spring 缓存中。 NCache 并将数据保存到缓存服务器上。现在,这是通过注解实现的。

XML声明(可选)

我还想向您展示,如果您不想修改源代码,也可以在外部文件中声明 XML 标签,并实现完全相同的效果。

  • 获取缓存
    <cache:cacheable method="getProduct" key="#id" unless="#result == null"/>
  • 缓存放置
    <cache:cache-put method="addProduct" key="#product.productID"/>
  • 缓存清除
    <cache:cache-evict method="deleteProduct" key="#id"/>

正如你在这里看到的,这里有缓存获取 (Cache Get)、缓存放置 (Cache Put) 和缓存驱逐 (Cache Evict) 的 XML 标签。我将继续使用项目中的注解。但我现在想做的,只是想向你展示一下 XML 配置的样子。所以我现在在…… NCache 这里有一个网站,上面有 XML 设置指南。接下来我将进入…… 程序员指南我相信这来自这里的文档部分。我们先去查阅指南,然后我再查找…… 弹簧积分 选项。我相信它就在这一部分。所以你可以看到这里声明了控制器类,这里有带有缓存注解的服务方法。最后是 XML 声明。

<!-- the service we want to make cacheable -->
<bean id="bookService" class="com.spring.service.BookService"/>

<!-- cache definitions -->
<cache:advice id="booksCacheAdvice" cache-manager="cacheManager">
    <cache:caching cache="demoCache">
        <cache:cacheable method="findBookByIsbn" key="#isbn"/>
    </cache:caching>
</cache:advice>

<app:config>
    <app:advisor advice-ref="booksCacheAdvice" pointcut="execution(* com.spring.service.BookService.*(..))"/>
</app:config>

您可以看到,它需要传入缓存建议标签,指定缓存名称,传入可缓存的方法,以及与我们之前所做的非常相似的键。最后,您还需要传入应用配置标签来启用 XML 缓存。

设置 Spring Data NCache

我们将继续使用我之前提到的注释方式。那么,让我们开始实际设置吧。 NCache,在这个整合过程中。但趁我们在这里,赶紧快速浏览一下, NCache 实际上,这是一个缓存集群。我只是想向您展示一下,我已经创建了一个名为 demoCache 的缓存。它目前是一个单节点服务器,当然,在您的集群中,您可以添加多个不同的服务器。它部署在一个 Docker 实例上。我就是这样连接到它的。

容器运行

如果我只是点击查看我的统计数据,我想确保没有任何预先存在的数据。太好了,这样我们就是从零开始啦。

步骤 1:添加 NCache Spring依赖项

因此,要设置 Spring 数据, NCache 你首先要做的事情是添加这个 NCache Spring依赖项。如果您想知道在哪里可以找到这个依赖项,我将返回到…… NCache 网站,我要进入开发者 Java 部分。我现在正在做的就是进入 Maven 中央仓库,以便找到依赖项的最新版本。正如你在这里看到的。 NCache spring 5.3.6 是最新版本。

<dependency>
    <groupId>com.alachisoft.ncache</groupId>
    <artifactId>ncache-spring</artifactId>
    <version>5.3.6</version>
</dependency>

我这就把它复制到我的 pom.xml 文件里。我要同步 Maven 的更改。然后我再仔细检查一下我的库。你可以看到我有 NCache 客户, NCache 运行时间和 NCache 春天,完美。

步骤 2:指定缓存配置

下一步是在……中指定缓存配置。 ncache-spring.xml 简而言之,我们需要在这个文件中定义一个或多个缓存。应用程序将使用此文件来创建缓存实例。因此,我将在 resources 文件夹下定义此文件。至于此文件的 XML 布局,我将回到…… NCache 因为我们网站上有相关指南。如果我转到这个部分,你会看到我们必须…… 配置缓存策略而且它已经使用了 demoCache 作为名称。所以我直接复制粘贴就行了。

<application-config default-cache-name="demoCache">
    <caches>
        <cache name="demoCache" ncacheid-instance="democache" priority="normal" expiration-type="absolute" expiration-period="200"/>
    </caches>
</application-config>

您可以看到这里还有其他一些选项,例如项目优先级、表达式类型(可以是绝对、滑动或无)以及过期时间(以秒为单位)。因此,如果我将其设置为 200,那么我希望缓存项目在 200 秒后过期。

步骤 3:配置 CacheManager Bean

  • 基于 Java 的注解(推荐)
  • 基于 XML 的配置

我们先保持现状,继续进行下一步,也是最重要的一步。我们需要配置缓存管理器 bean。目前,由于我们使用的是 Spring Boot 的自动配置选项,Spring 会自动创建自己的缓存管理器实例。我们需要创建自己的缓存管理器实例并将其注入到 Spring 中,以完成集成。

基于 Java 的注解

现在有两种方法可以实现:使用注解,或者在 XML 中编写代码。对于注解,我将创建一个名为“缓存配置”的类(名称无关紧要)。我们将它标记为 Spring 组件。在这里,我们将声明一个返回缓存管理器实例的方法。请记住,这必须是 Spring 框架的导入。我还会将其注解为 bean。我将定义一个指向我们新创建的 ncache-spring.xml 文件的资源。从源文件夹复制该文件。接下来,我将定义一个 Spring 配置管理器。它包含部分内容…… NCache 代码。我要把它和我们刚才定义的资源关联起来。所以我们现在做的只是把所有东西连接起来。然后我要定义…… NCache 缓存管理器实例。这将是我们在此方法中返回的缓存管理器实例。我将把它关联到 Spring 配置管理器。最后返回缓存管理器实例。注解的设置就完成了。

基于 Java 的注解
基于 Java 的注解

基于 XML 的配置

如果您想用 XML 来实现,我们不需要定义这个类。我们只需要在 XML 文件中定义两个单独的 bean。一个是缓存管理器 bean,我这就把缓存管理器 bean 复制过来。您会注意到它会查找 Spring 配置管理器对象,所以我们必须把它定义为一个单独的 bean。我也要把这个 bean 粘贴过来。 NCache 配置管理器显然需要指向 ncache-spring.xml 文件。所以这和我们之前做的完全一样,只是这次是用 XML 格式。

<bean id="cacheManager" class="com.alachisoft.integrations.spring.NCacheCacheManager">
   <property name="springConfigurationManager" ref="NCacheConfigurationManager"/>
   <property name="logFilePath" value="C:\Program Files\NCache\log-files\CustomerDBSpringLogs"/>
</bean>
<bean id="NCacheConfigurationManager" class="com.alachisoft.integrations.spring.configuration.SpringConfigurationManager">
   <property name="configFile" value="ncache-spring.xml">
</bean>

步骤 4:指定缓存服务器

既然我们使用了注解,那就先把这部分注释掉,继续进行最后一步,也就是在 client.ncconf 文件中指定缓存服务器。我们只需要在这个文件中定义缓存服务器的 IP 地址和配置选项。现在,如果你有 NCache 如果客户端应用程序已安装在运行该应用程序的机器上,那么该文件应该已经存在。就我而言,因为我的确有…… NCache 安装完毕后,我确实有一个 NCache 安装文件夹中,正如您在这里看到的,应该已经存在这个文件了。我也会向您展示它的内容。您可以看到,它指定了您的缓存、缓存服务器 IP 地址以及一些其他选项。

指定缓存服务器
在 client.ncconf 中指定缓存服务器

如果您没有 NCache 如果您的客户端应用程序安装在您当前的机器上,我们需要自己创建它。所以,我刚刚复制了这些内容,现在我将在这里创建一个同名的新文件。文件位置并不重要,我们只需将内容粘贴到这里即可。现在我们唯一需要做的就是指向 NCache 将其作为配置文件。所以,我们只需要添加一小段代码。我将把它添加到缓存配置中。它看起来像缓存管理器。使用 NCache 导入客户端文件 `.setConfigPath`,然后我们将它指向这里的资源文件夹。这就是你需要做的全部工作。如果你没有客户端文件,请继续阅读。 NCache 安装文件夹,因为我也有,所以我会把这部分注释掉。但我只想简单解释一下。我们这样做的原因是,默认情况下 NCache 它会在安装文件夹中查找该客户端文件。如果没有安装文件夹,则需要覆盖此行为。我认为我们还漏掉了一件事,那就是禁用缓存自动配置选项。所以我只需排除 CacheAutoConfiguration.class,完美。现在我们可以运行应用程序了。

启动过程中,我先快速查看一下数据库,确保没有数据,很好,数据库是空的。加载的时候,我们打开统计页面。我试着把它和本地主机并排打开。现在应用程序已经启动并运行了,很好,你可以看到这里。可以看到,你可以添加产品、获取产品、删除产品。它只是使用了我们之前定义的那些接口。我们将访问所有这些接口,并测试缓存服务器。举个例子,我添加三个不同的产品。我在这里添加一些随机值。注意第一个请求需要一些时间,因为它尝试连接到缓存。你可以看到缓存计数增加了一。我再添加一个产品。你可以看到缓存计数反映了这一变化,很好。如果我们快速查看一下数据库,我预期会看到同样的情况。您可以看到这里添加了三项内容。

产品在运行时添加。

现在,如果我获取第二个项目,我希望从缓存而不是数据库中检索该值。所以你可以看到,我在这里获取到了该值。这会触发从缓存中每秒获取数据的选项。所以它按预期工作。如果我获取第三个项目,情况完全相同。现在,如果我删除 ID 为 1 的项目,我希望它同时从数据库和缓存服务器中删除。正如你在这里看到的,缓存中的计数减少了。如果我刷新数据库,我希望看到完全相同的行为。完美。

安排演示

好了,各位,我们的演示就到这里。如果您想了解更多信息,请继续阅读。 NCache,它的 功能 如果您想了解如何将其融入您的应用程序中,请联系我们。 安排演示非常感谢您观看本视频。

接下来做什么?

联系我们

联系电话

+1 214-619-2601 (美国)

+44 20 7993 8327 (英国)

©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。