【笔记06】Ehcache 缓存框架的使用

简介: Ehcache 是一个纯 Java 的缓存框架。具有快速、精干等特点,是 Hibernate(一个持久层框架,类似 MyBatis) 中默认的 CacheProvider

前言

:star: 在做微信小程序项目的时候,需要在 Java 后台暂时缓存 openid,以获取用户身份(openid 是公众号用户的唯一标识)
:star: 这操作让我想到了曾经做的项目的【登录】功能

:sweat_drops: 登录(客户端身份认证)有两种实现思路
【1】基于 Cookie、Session
:cherry_blossom: 执行流程:
① 客户端:发送用户名和密码
② 服务器端:验证客户端发送的用户名和密码。验证成功后,创建并保留一个跟客户端相关联的 Session(把客户端信息缓存到 Session 中),返回 Session_ID 给客户端
③ 客户端:将 Session_ID 保存到 Cookie 中
④ 客户端:后续的请求都带上包含了 Session_ID 的 Cookie
⑤ 服务器:通过验证 Cookie 中的 Session_ID 确认用户身份
:cherry_blossom: 该方案的优点:
服务器、客户端基本自动完成一系列的流程,不用编程太多额外的代码
:cherry_blossom: 该方案的确定
在分布式架构下,需解决 Session 共享问题(分布式架构下 Session 默认无法共享
不支持非浏览器环境(没有 Cookie 机制的环境,如:微信小程序)


【2】 基于 token
:cherry_blossom: 执行流程:
① 客户端:发送用户名和密码
② 服务器端:验证客户端发送的用户名和密码。验证成功后,生成一个跟客户端相关的 token,返回 token 给客户端
③ 客户端:存储 token 到本地
④ 客户端:后续的请求都带上 token
⑤ 服务器:通过 验证 token 确认用户身份
:cherry_blossom: 该方案优点:
支持分布式架构、支持非浏览器环境
:cherry_blossom: 该方案缺点:
需要客户端手动存储和发送 token
有些 token 会 比 Session_ID 大,需要消耗更多的流量
有些 token 方案默认无法在服务器端主动销毁 token

💦 方案一通过 Sessionrequest.getSession().setAttribute(k, v)】缓存用户信息在服务器端。可通过 Session 的 key 把用户信息给移除掉,实现【让用户下线的功能】
💦 方案二可使用 Session 缓存用户信息(不推荐,在非浏览器环境或前后端分离的时候 Session 是不共享的)。最佳实践使用 Redis 环境用户信息,用 Redis 缓存用户信息一般是分布式架构的时候。单体应用的使用可使用简单的 Ehcache 框架。

下面是对 Ehcache 框架的基本介绍和基本使用(包括工具类的封装和配置文件解释)

一、EhCache 简介

:four_leaf_clover: EhCache 是一个纯 Java 的缓存框架。具有快速、精干等特点,是 Hibernate(一个持久层框架,类似 MyBatis) 中默认的 CacheProvider

:four_leaf_clover: EhCache 是一款简单易用的缓存框架。它支持 3 层缓存:Heap(JVM 的堆内存)、Off-Heap(堆外内存)、Disk(磁盘)。【Off-Heap 和 Disk 要求对象支持序列化和反序列化】

:four_leaf_clover: 它简单易用,没有 Java 的 Session 在非浏览器环境或前后端分离时候的 Session 不共享情况;没有 Redis 框架的庞大(Redis 太高级了,常被使用于分布式架构),是单体应用中最好的缓存者

https://www.ehcache.org/documentation/3.8/getting-started.html

二、简单使用(MAVEN 和 配置文件)

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

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xmlns='http://www.ehcache.org/v3'
        xsi:schemaLocation="http://www.ehcache.org/v3
        http://www.ehcache.org/schema/ehcache-core.xsd">

    <!-- 需要把缓存数据存放到磁盘的时候, 存放到磁盘的该文件夹下 -->
    <persistence directory="F:/ehcache"/>

    <!--【公共的配置】-->
    <cache-template name="common">
        <!-- 缓存中存放的 key 和 value 都是 Object 类型 -->
        <key-type>java.lang.Object</key-type>
        <value-type>java.lang.Object</value-type>

        <resources>
            <!-- 堆中最多存放1000个对象 -->
            <heap>1000</heap>
            <!-- 堆外内存存放100MB -->
            <!--<offheap unit="MB">100</offheap>-->
            <!-- 服务器硬盘存放1GB -->
            <!--<disk unit="GB" persistent="true">1</disk>-->
        </resources>
    </cache-template>

    <!-- 用于缓存 token -->
    <cache alias="token" uses-template="common">
        <expiry>
            <!-- 连续7天不访问就过期 -->
            <tti unit="days">7</tti> <!--time to idle-->
        </expiry>
    </cache>

    <!-- 用于缓存 openid -->
    <cache alias="openid" uses-template="common">
        <expiry>
            <!-- 1天后自动过期 -->
            <ttl unit="days">1</ttl>
        </expiry>
    </cache>

    <!-- 用于缓存希望永不过期的数据 -->
    <cache alias="default" uses-template="common">
        <expiry>
            <none/> <!--永不过期-->
        </expiry>
    </cache>
</config>

:herb: 【cache】标签用于创建不同的缓存空间,不同的缓存空间缓存不同类型的数据。同一个缓存空间缓存的数据是相似的
:herb: 【expiry】标签用于设置缓存的过期时间
:herb: 【ttl】指定时间后缓存过期
:herb: 【tti】指定时间内未使用缓存过期

三、简单使用(Ehcache 工具类)

需在工具类中读取配置文件 cache.xml,并编写【增删改】缓存数据的代码
/**
 * 缓存工具类
 */
@SuppressWarnings("all")
public class EhCaches {
    // 缓存管理器(只用初始化一次)
    private static final CacheManager MGR;
    private static final Cache<Object, Object> DEFAULT_CACHE;
    private static final Cache<Object, Object> TOKEN_CACHE;
    private static final Cache<Object, Object> OPENID_CACHE;

    static {
        /* 初始化缓存管理器 */
        // 读取配置文件
        URL url = Ehcache.class.getClassLoader().getResource("ehcache.xml");
        assert url != null;
        XmlConfiguration xmlConfiguration = new XmlConfiguration(url);
        MGR = CacheManagerBuilder.newCacheManager(xmlConfiguration);
        MGR.init();

        /* 拿到缓存对象 */
        DEFAULT_CACHE = MGR.getCache("default", Object.class, Object.class);
        TOKEN_CACHE = MGR.getCache("token", Object.class, Object.class);
        OPENID_CACHE = MGR.getCache("openid", Object.class, Object.class);
    }

    /* 增 */
    public static void defaultPut(Object key, Object val) {
        DEFAULT_CACHE.put(key, val);
    }

    public static void openidPut(Object key, Object val) {
        OPENID_CACHE.put(key, val);
    }

    public static void tokenPut(Object key, Object val) {
        TOKEN_CACHE.put(key, val);
    }

    /* 删 */
    public static void defaultRemove(Object key) {
        DEFAULT_CACHE.remove(key);
    }

    public static void openidRemove(Object key) {
        OPENID_CACHE.remove(key);
    }

    public static void tokenRemove(Object key) {
        TOKEN_CACHE.remove(key);
    }

    /* 查 */
    public static <T> T defaultGet(Object key) {
        return (T) DEFAULT_CACHE.get(key);
    }

    public static <T> T openidGet(Object key) {
        return (T) OPENID_CACHE.get(key);
    }

    public static <T> T tokenGet(Object key) {
        return (T) TOKEN_CACHE.get(key);
    }

    /* 清空所有 */
    public static void defaultClear() {
        DEFAULT_CACHE.clear();
    }

    public static void openidClear() {
        OPENID_CACHE.clear();
    }

    public static void tokenClear() {
        TOKEN_CACHE.clear();
    } 
}
相关文章
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
1131 0
|
缓存 Java 数据库
SpringBoot集成Ehcache缓存使用指南
以上是SpringBoot集成Ehcache缓存的基本操作指南,帮助你在实际项目中轻松实现缓存功能。当然,Ehcache还有诸多高级特性,通过学习和实践,你可以更好地发挥它的威力。
1030 20
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
1155 16
Redis应用—8.相关的缓存框架
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
830 0
|
存储 缓存 自然语言处理
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
KV缓存是大语言模型(LLM)处理长文本的关键性能瓶颈,现有研究多聚焦于预填充阶段优化,忽视了解码阶段的重要性。本文提出SCOPE框架,通过分离预填充与解码阶段的KV缓存策略,实现高效管理。SCOPE保留预填充阶段的关键信息,并在解码阶段引入滑动窗口等策略,确保重要特征的有效选取。实验表明,SCOPE仅用35%原始内存即可达到接近完整缓存的性能水平,显著提升了长文本生成任务的效率和准确性。
963 3
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
2448 24
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
缓存 NoSQL Java
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
缓存与分布式锁、Redisson分布式锁、缓存数据一致性【必须满足最终一致性】
1179 16
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
3703 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
缓存 NoSQL Java
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化
缓存菜品、套餐数据、mysql主从复制实现读写分离、前后端分离
瑞吉外卖项目笔记+踩坑2——缓存、读写分离优化