Springboot—Spring Cache 缓存方案详解及代码-Ehcache

这篇具有很好参考价值的文章主要介绍了Springboot—Spring Cache 缓存方案详解及代码-Ehcache。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Spring缓存概念

Spring从3.1开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术; 并支持使用 JCache(JSR-107) 注解简化我们开发。

常用的缓存实现有 RedisCache 、EhCache、ConcurrentMapCache 、Guava Cache(谷歌)等。

1、Spring Cache 介绍

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能

Spring Cache提供了一层抽象,底层可以切换不同的Cache实现,具体是通过CacheManager接口来统一不同的缓存技术

针对于不同的缓存技术需要实现不同的CacheManager:

CacheManager

描述

EhCacheCacheManager

使用EhCache作为缓存技术

GuavaCacheManager

使用Google的GuavaCache作为缓存技术

RedisCacheManager

使用Redis作为缓存技术

2、Spring Cache 常用注解

我们来介绍Spring Cache用于缓存的常用的四个注解:

注解

说明

@EnableCaching

开启缓存注解功能

@Cacheable

在方法执行前先查看缓存中是否存有数据,如果有数据直接返回数据;如果没有,调用方法并将返回值存入缓存

@CachePut

将方法的返回值放到缓存

@CacheEvict

将一条或多条从缓存中删除

在Spring项目中,使用缓存技术只需要导入相关缓存技术的依赖包,并在启动类上加上@EnableCaching开启缓存支持即可

二、Ehcache介绍

EhCache 是一个纯Java的进程内缓存管理框架,属于开源的Java分布式缓存框架,主要用于通用缓存,Java EE和轻量级容器,是从 Hibernate 的缓存开始的。

目前版本已到了Ehcache 3.10,Ehcache 3引入了以下内容:

  • 改进的 API,利用 Java 泛型并简化缓存交互,

  • 与javax.cache API (JSR-107)完全兼容,

  • 堆下存储功能,包括仅堆下缓存,

  • 开箱即用的Spring Caching和Hibernate集成,这要归功于javax.cache支持

1、 Ehcache特性:

1、快速轻量: Ehcache 是最快的 Java 缓存之一,很小的 jar 包

2、伸缩性:缓存在内存和磁盘存储可以伸缩到数 G

3、灵活性:Ehcache 1.2 具备对象 API 接口和可序列化 API 接口。

4、标准支持 Ehcache 提供了对 JSR107 JCACHE API 最完整的实现

5、可扩展性 监听器可以插件化

6、应用持久化 在 VM 重启后,持久化到磁盘的存储可以复原数据

官网:Ehcache

2、 Ehcache 的加载模块列表

ehcache-core:API,标准缓存引擎,RMI 复制和 Hibernate 支持

ehcache:分布式 Ehcache,包括 Ehcache 的核心和 Terracotta 的库

ehcache-monitor:企业级监控和管理

ehcache-web:为 Java Servlet Container 提供缓存、gzip 压缩支持的 filters

ehcache-jcache:JSR107 JCACHE 的实现

ehcache-jgroupsreplication:使用 JGroup 的复制

ehcache-jmsreplication:使用 JMS 的复制

ehcache-openjpa:OpenJPA 插件

ehcache-server:war 内部署或者单独部署的 RESTful cache server

ehcache-unlockedreadsview:允许 Terracotta cache 的无锁读

ehcache-debugger:记录 RMI 分布式调用事件

Ehcache for Ruby:Jruby and Rails 支持

3、核心定义:

  • cache manager:缓存管理器,以前是只允许单例的,不过现在也可以多实例了

  • cache:缓存管理器内可以放置若干 cache,存放数据的实质,所有 cache 都实现了 Ehcache 接口

  • element:单条缓存数据的组成单位

  • system of record(SOR):可以取到真实数据的组件,可以是真正的业务逻辑、外部接口调用、存放真实数据的数据库等等,缓存就是从 SOR 中读取或者写入到 SOR 中去的

Ehcache 支持的数据存储包括:

  • 堆上存储 - 利用 Java 的堆上 RAM 内存来存储缓存条目。此层使用与 您的 Java 应用程序,所有这些应用程序都必须由 JVM 垃圾回收器扫描。您的 JVM 堆空间越多 利用,应用程序性能受垃圾回收暂停的影响就越大。这家商店是 速度极快,但通常是您最有限的存储资源。

  • 堆外存储 - 大小仅受可用 RAM 的限制。 不受 Java 垃圾回收 (GC) 的约束。 非常快,但比堆上存储慢,因为在存储和重新访问数据时,必须将数据移入和移出 JVM 堆。

  • 磁盘存储 - 利用磁盘(文件系统)存储缓存条目。 这种类型的存储资源通常非常丰富,但比基于 RAM 的存储慢得多。至于所有使用磁盘的应用程序 存储时,建议使用快速专用的磁盘来优化吞吐量。

  • 群集存储 - 此数据存储是远程服务器上的缓存。 远程服务器可以选择具有故障转移服务器,以提供改进的高可用性。 由于群集存储会因网络延迟以及建立客户端/服务器一致性等因素而带来性能损失, 从本质上讲,此层比本地堆外存储慢。

三、开发实例:

引入依赖:


 <dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.10.0</version>
    </dependency>  

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache">

    <diskStore path="../temp/bojun/ehcache" />

    <!-- 默认缓存配置. -->
    <defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="1800" timeToLiveSeconds="3600"
        overflowToDisk="false" maxEntriesLocalDisk="100000" />

    <cache name="SystemAuthorizingRealm" maxEntriesLocalHeap="2000"
           eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0"
           overflowToDisk="false" statistics="true">
    </cache>


    <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000"
           eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0"
           overflowToDisk="false" statistics="true">
    </cache>

    <!-- 系统缓存 -->
    <cache name="sysCache" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="false"/>

    <cache name="cmsCache" maxEntriesLocalHeap="3000" eternal="false" overflowToDisk="false"/>
    <cache name="captchaCache" maxEntriesLocalHeap="3000" timeToLiveSeconds="300" eternal="false" overflowToDisk="false"/>

    <!-- 用户缓存 -->
    <cache name="userCache" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="false"/>

    <!-- 工作流模块缓存 -->
    <cache name="actCache" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="false"/>

    <cache name="sys.config" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="false"/>

    <!-- 系统活动会话缓存 -->
    <cache name="activeSessionsCache" maxEntriesLocalHeap="10000" overflowToDisk="false"
           eternal="false" timeToLiveSeconds="0" timeToIdleSeconds="0"
           diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/>
</ehcache>

配置类代码:

@ConditionalOnProperty(name = "spring.cache.type", havingValue = "ehcache")
@Configuration
@EnableCaching//标注启动缓存.
public class CacheConfig {

    /**
     * @param ehCacheManagerFactoryBean
     * @return
     */

    @Bean
    public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean){
        System.out.println("CacheConfiguration.ehCacheCacheManager()");
        return new EhCacheCacheManager(ehCacheManagerFactoryBean.getObject());
    }

    /*
     * 据shared与否的设置,
     * Spring分别通过CacheManager.create()
     * 或new CacheManager()方式来创建一个ehcache基地.
     */
    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
        System.out.println("CacheConfiguration.ehCacheManagerFactoryBean()");
        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
        cacheManagerFactoryBean.setShared(true);
        return cacheManagerFactoryBean;
    }

}

工具类:

public class CacheUtils {
private static CacheManager cacheManager = SpringContextHolder.getBean(CacheManager.class);
    private static final String SYS_CACHE = "sysCache";

    /**
     * 获取SYS_CACHE缓存
     *
     * @param key
     * @return
     */
    public static Object get(String key) {
        return get(SYS_CACHE, key);
    }

    /**
     * 获取SYS_CACHE缓存
     *
     * @param key
     * @param defaultValue
     * @return
     */
    public static Object get(String key, Object defaultValue) {
        Object value = get(key);
        return value != null ? value : defaultValue;
    }

    /**
     * 写入SYS_CACHE缓存
     *
     * @param key
     * @return
     */
    public static void put(String key, Object value) {
        put(SYS_CACHE, key, value);
    }

    /**
     * 从SYS_CACHE缓存中移除
     *
     * @param key
     * @return
     */
    public static void remove(String key) {
        remove(SYS_CACHE, key);
    }

    /**
     * 获取缓存
     *
     * @param cacheName
     * @param key
     * @return
     */
    public static Object get(String cacheName, String key) {
        if( getCache(cacheName).get(key) == null){
            return null;
        }else {
            return getCache(cacheName).get(key).get();
        }
    }

    /**
     * 获取缓存
     *
     * @param cacheName
     * @param key
     * @param defaultValue
     * @return
     */
    public static Object get(String cacheName, String key, Object defaultValue) {
        Object value = get(cacheName, key);
        return value != null ? value : defaultValue;
    }

    /**
     * 写入缓存
     *
     * @param cacheName
     * @param key
     * @param value
     */
    public static void put(String cacheName, String key, Object value) {
        getCache(cacheName).put(key, value);
    }

    /**
     * 从缓存中移除
     *
     * @param cacheName
     * @param key
     */
    public static void remove(String cacheName, String key) {
        getCache(cacheName).evict(key);
    }


    /**
     * 获得一个Cache,没有则显示日志。
     *
     * @param cacheName
     * @return
     */
    private static Cache getCache(String cacheName) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache == null) {
            throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。");
        }
        return cache;
    }
}

测试代码:

   @Cacheable(key="'user_'+#id",value="userCache")
    public User getUserById(String id)
    {     
        return userDao.findById(id);   
    }

这是一个cache框架,可以根据需要引入不同的cache实现方案文章来源地址https://www.toymoban.com/news/detail-768690.html

到了这里,关于Springboot—Spring Cache 缓存方案详解及代码-Ehcache的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Cache框架(缓存)

    1、介绍: Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单加个注解,就能实现缓存功能。它提供了一层抽象,底层可以切换不同的cache实现。具体就是通过 CacheManager 接口来实现不同的缓存技术。 针对不同的混存技术需要实现不同的 CacheManage r: CacheManager 描述

    2024年02月11日
    浏览(16)
  • 简述Spring Cache缓存策略

    Spring框架提供了一种名为Spring Cache的缓存策略。Spring Cache是一种抽象层,它提供了一种方便的方式来管理缓存,并与Spring应用程序中的各种缓存实现(如EhCache、Guava、Caffeine等)集成。 Spring Cache使用注解(如@Cacheable、@CachePut、@CacheEvict等)来描述与缓存相关的操作。这些注解

    2024年02月10日
    浏览(14)
  • SpringBoot Cache缓存

    application.properties配置文件 ehcache.xml配置文件 name:cache的名字,必须惟一。 eternal:是否持久化,若为true,则表示缓存元素不会过期。 maxElementsInMemory:cache中最多可以存放的元素的数量。 overflowToDisk:溢出是否写入磁盘。 diskPersistent:是否持久化磁盘缓存。 timeToIdleSeconds:访

    2024年01月18日
    浏览(26)
  • Spring Boot 缓存 Cache 入门

    Spring Boot 缓存 Cache 入门

    在系统访问量越来越大之后,往往最先出现瓶颈的往往是数据库。而为了减少数据库的压力, 我们可以选择让产品砍掉消耗数据库性能的需求 。 当然也可以引入缓存,在引入缓存之后,我们的读操作的代码,往往代码如下: 这段代码,是比较常用的缓存策略,俗称**“被动写

    2024年02月15日
    浏览(12)
  • 三、Spring Cache + Redis 缓存数据

    Spring Cache 是一个非常优秀的缓存组件。自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis) 使用Spring Cache的好处:  1,提供基本的Cache抽象,方便切换各种底层Cache;  2,通过注解Cache可以实现类似于事务

    2024年02月05日
    浏览(11)
  • SpringBoot项目中使用缓存Cache的正确姿势!!!

    SpringBoot项目中使用缓存Cache的正确姿势!!!

    缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性。我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时候写的很蠢且low, 大致写法如下: 其实Spring Boot 提供了强大的缓

    2023年04月10日
    浏览(10)
  • spring boot整合cache使用Ehcache 进行数据缓存

    spring boot整合cache使用Ehcache 进行数据缓存

    之前的文章 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 带着大家通过spring boot整合了 cache 缓存 那么 我们就来说说 其他服务的缓存 而spring boot默认的缓存方案就是 cache 用simple模式 spring boot的强大在于它的整合能力 它将其他缓存技术整合 统一了接口 简单说 所有的

    2024年02月19日
    浏览(13)
  • 8.10 用redis实现缓存功能和Spring Cache

    8.10 用redis实现缓存功能和Spring Cache

    什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据,减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起来。 控

    2024年02月13日
    浏览(19)
  • Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!

    Spring Boot 3.2项目中使用缓存Cache的正确姿势!!!

    你是否曾想过为什么在 Spring Boot 应用中缓存是如此重要?答案在于它通过减少数据检索时间来提高性能。在本文中,我们将深入探讨缓存对微服务模式的影响,并探讨根据操作易用性、速度、可用性和可观测性等因素选择正确缓存的重要性。我们还将探讨如何最大程度地提高

    2024年02月05日
    浏览(13)
  • ARMv8-缓存一致性(cache coherency)解决方案:MOESI protocol

    ARMv8-缓存一致性(cache coherency)解决方案:MOESI protocol

    目录 一,MOESI状态释义 二,MOESI状态转换    1, Invalid after Reset 2, Invalid = Exclusive 3, Exclusive = Modified  4.1, Modified = Owned, Invalid = Shared  4.2 Modified = Invalid , Invalid = Modified 5,Owned = Invalid, Shared = Invalid, Shared = Modified  6,Clean 和Invalidate操作对MOESI状态的影响 6.1 对 Owned状态进行clea

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包