大家好,我叫苏莱曼,在这个视频中我们将探讨如何使用 NCache 我们将使用 Spring Data 并通过缓存来提升应用程序的性能。我这里有一个示例项目,它是一个 Spring Boot 应用程序。我们将首先实现 Spring 缓存,并借助 Spring Boot 缓存自动配置选项来实现这一点。
届时,缓存数据将被存储在内存中。完成之后,我们将插入…… NCache然后我将向您展示缓存数据是如何保存到缓存服务器上的。
所以,这通常是企业环境中部署缓存的架构。我们有一个独立的应用层,也称为缓存客户端,客户端应用程序就运行在这个层。然后,请注意还有一个独立的缓存层,其中包含我们的缓存服务器。最后是数据库层。我的架构与此非常相似。
在开始设置之前,我们先来看一下我的项目。正如我提到的,这是一个 Spring Boot 应用,简单来说,它对这个产品对象执行 CRUD 操作。
你会注意到我还编写了一个 HTML 页面。我们将使用用户界面与我们的端点进行交互。如果我进入产品控制器,你会看到我定义的端点。这里有…… 获取产品(), 添加产品() 和 removeProduct()在服务层,你可以看到我还没有实现缓存。如果我们查看代码仓库,你会发现我使用了 Spring Data。所以目前客户端应用程序只与数据库交互,而没有与缓存交互。接下来我们将逐步讲解。
@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 标签,并实现完全相同的效果。
<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 缓存。
我们将继续使用我之前提到的注释方式。那么,让我们开始实际设置吧。 NCache,在这个整合过程中。但趁我们在这里,赶紧快速浏览一下, NCache 实际上,这是一个缓存集群。我只是想向您展示一下,我已经创建了一个名为 demoCache 的缓存。它目前是一个单节点服务器,当然,在您的集群中,您可以添加多个不同的服务器。它部署在一个 Docker 实例上。我就是这样连接到它的。
如果我只是点击查看我的统计数据,我想确保没有任何预先存在的数据。太好了,这样我们就是从零开始啦。
因此,要设置 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 春天,完美。
下一步是在……中指定缓存配置。 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 秒后过期。
我们先保持现状,继续进行下一步,也是最重要的一步。我们需要配置缓存管理器 bean。目前,由于我们使用的是 Spring Boot 的自动配置选项,Spring 会自动创建自己的缓存管理器实例。我们需要创建自己的缓存管理器实例并将其注入到 Spring 中,以完成集成。
基于 Java 的注解
现在有两种方法可以实现:使用注解,或者在 XML 中编写代码。对于注解,我将创建一个名为“缓存配置”的类(名称无关紧要)。我们将它标记为 Spring 组件。在这里,我们将声明一个返回缓存管理器实例的方法。请记住,这必须是 Spring 框架的导入。我还会将其注解为 bean。我将定义一个指向我们新创建的 ncache-spring.xml 文件的资源。从源文件夹复制该文件。接下来,我将定义一个 Spring 配置管理器。它包含部分内容…… NCache 代码。我要把它和我们刚才定义的资源关联起来。所以我们现在做的只是把所有东西连接起来。然后我要定义…… NCache 缓存管理器实例。这将是我们在此方法中返回的缓存管理器实例。我将把它关联到 Spring 配置管理器。最后返回缓存管理器实例。注解的设置就完成了。
基于 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>
既然我们使用了注解,那就先把这部分注释掉,继续进行最后一步,也就是在 client.ncconf 文件中指定缓存服务器。我们只需要在这个文件中定义缓存服务器的 IP 地址和配置选项。现在,如果你有 NCache 如果客户端应用程序已安装在运行该应用程序的机器上,那么该文件应该已经存在。就我而言,因为我的确有…… NCache 安装完毕后,我确实有一个 NCache 安装文件夹中,正如您在这里看到的,应该已经存在这个文件了。我也会向您展示它的内容。您可以看到,它指定了您的缓存、缓存服务器 IP 地址以及一些其他选项。
如果您没有 NCache 如果您的客户端应用程序安装在您当前的机器上,我们需要自己创建它。所以,我刚刚复制了这些内容,现在我将在这里创建一个同名的新文件。文件位置并不重要,我们只需将内容粘贴到这里即可。现在我们唯一需要做的就是指向 NCache 将其作为配置文件。所以,我们只需要添加一小段代码。我将把它添加到缓存配置中。它看起来像缓存管理器。使用 NCache 导入客户端文件 `.setConfigPath`,然后我们将它指向这里的资源文件夹。这就是你需要做的全部工作。如果你没有客户端文件,请继续阅读。 NCache 安装文件夹,因为我也有,所以我会把这部分注释掉。但我只想简单解释一下。我们这样做的原因是,默认情况下 NCache 它会在安装文件夹中查找该客户端文件。如果没有安装文件夹,则需要覆盖此行为。我认为我们还漏掉了一件事,那就是禁用缓存自动配置选项。所以我只需排除 CacheAutoConfiguration.class,完美。现在我们可以运行应用程序了。
启动过程中,我先快速查看一下数据库,确保没有数据,很好,数据库是空的。加载的时候,我们打开统计页面。我试着把它和本地主机并排打开。现在应用程序已经启动并运行了,很好,你可以看到这里。可以看到,你可以添加产品、获取产品、删除产品。它只是使用了我们之前定义的那些接口。我们将访问所有这些接口,并测试缓存服务器。举个例子,我添加三个不同的产品。我在这里添加一些随机值。注意第一个请求需要一些时间,因为它尝试连接到缓存。你可以看到缓存计数增加了一。我再添加一个产品。你可以看到缓存计数反映了这一变化,很好。如果我们快速查看一下数据库,我预期会看到同样的情况。您可以看到这里添加了三项内容。
现在,如果我获取第二个项目,我希望从缓存而不是数据库中检索该值。所以你可以看到,我在这里获取到了该值。这会触发从缓存中每秒获取数据的选项。所以它按预期工作。如果我获取第三个项目,情况完全相同。现在,如果我删除 ID 为 1 的项目,我希望它同时从数据库和缓存服务器中删除。正如你在这里看到的,缓存中的计数减少了。如果我刷新数据库,我希望看到完全相同的行为。完美。
好了,各位,我们的演示就到这里。如果您想了解更多信息,请继续阅读。 NCache,它的 功能 如果您想了解如何将其融入您的应用程序中,请联系我们。 安排演示非常感谢您观看本视频。