广告
返回顶部
首页 > 资讯 > 后端开发 > Python >ehcache 3.* 使用介绍
  • 761
分享到

ehcache 3.* 使用介绍

ehcache 2023-01-31 07:01:23 761人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

官网地址:Http://×××w.ehcache.org/documentation/3.6/getting-started.html    根据官网的说明使用起来非常简单,尤其是在3.0之后, 不管事xml配置文件还是链式编码配置。先看示

官网地址:Http://×××w.ehcache.org/documentation/3.6/getting-started.html

    根据官网的说明使用起来非常简单,尤其是在3.0之后, 不管事xml配置文件还是链式编码配置。

先看示例:

ResourcePoolsBuilder resourcePoolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder().heap(20, MemoryUnit.MB).offheap(30, MemoryUnit.MB);
CacheConfiguration<String, Object> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, resourcePoolsBuilder)
        .withValueSerializer(new PlainJavaSerializer<>(this.getClass().getClassLoader()))
        .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(24))).build();
org.ehcache.CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
        .withDefaultSizeOfMaxObjectSize(500, MemoryUnit.KB)
        .withDefaultSizeOfMaxObjectGraph(2000)
        .withCache(CACHE_NAME_CHINESE_DIC, cacheConfiguration)
        .withCache(CACHE_NAME_ENGLISH_DIC, cacheConfiguration)
        .build(true);

重要的几个知识点:

ehcache是分层缓存的

TiersHierarchy.png

  • heap 堆内缓存,也就是存储在JVM内存中;

  • off heap 堆外缓存,非JVM单独非配的一部分内存。因此,设置的参数要与jvm启动参数相协调。

  • disk 磁盘缓存,也就是将缓存内容写入到磁盘文件中。

  • cluster 集群缓存,它是需要已cluster服务器来处同步存储这些数据。

注意:

   1.heap是必须配置的;

   2.disk tier不能与cluster tier共存,因为,它们回产生不一致;

   3.个缓存tier是金字塔的配置,也就是 heap > off heap > disk > cluster,并且配置的大小是一次递增。

   4.除了heap tier之外,其它层都必须设置key和value的序列化器和反序列化器。另外基础数据类型,已经实现其对相应的序列化/反序列化器。   


ResourcePoolsBuilder是每个cache独立的,它仅仅只是配置信息。如:如果配置heap=20M,那么每个cache都有20M.


过期时间设置策略

   如:withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(24))

  1. no expiry 永不过期

  2. time-to-live 从缓存开始计算,所存储的时间

  3. time-to-idle 最后一次使用后计算,所存储的时间


UserManagedCache

 一个功能不需要太全,但能满足基本的缓存,则使用此类。

UserManagedCache<Long, String> userManagedCache = UserManagedCacheBuilder.newUserManagedCacheBuilder(Long.class, String.class).build(false);  
userManagedCache.init();

注:build(false)时,需要调用init()方法才有效。


此外,ehcache还有很多其他的设置,比如事务机制,集群,自定义线程池,自定义序列化器和反序列化器等等。在此就不在赘述,官网很详细。


springboot整合ehcache

由于版本的不同,之前的SpringBoot集成的时3.0之前的jar, 但是从3.0之后,依赖地址有net.sfn.ehache.*改为org.apache.echache.*。因此,自己注入了sprintboot cacheManager的实现。

代码如下:

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


@Configuration
@EnableCaching
public class CacheConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(CacheConfig.class);
    private static final String CACHE_NAME_XXXX = "XXXX";
    private static final String CACHE_NAME_YYYY = "YYYY";

    @Bean
    public CacheManager cacheManager() {
        ResourcePoolsBuilder resourcePoolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder().heap(20, MemoryUnit.MB).offheap(30, MemoryUnit.MB);
        CacheConfiguration<String, Object> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, resourcePoolsBuilder)
                .withValueSerializer(new PlainJavaSerializer<>(this.getClass().getClassLoader()))
                .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(24))).build();
        org.ehcache.CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .withDefaultSizeOfMaxObjectSize(500, MemoryUnit.KB)
                .withDefaultSizeOfMaxObjectGraph(2000)
                .withCache(CACHE_NAME_XXXX , cacheConfiguration)
                .withCache(CACHE_NAME_YYYY, cacheConfiguration)
                .build(true);
        return new CacheManager() {
            @Override
            public Cache getCache(String name) {
                org.ehcache.Cache<String, Object> heapEhcache = cacheManager.getCache(name, String.class, Object.class);
                return new Cache() {
                    @Override
                    public String getName() {
                        return name;
                    }

                    @Override
                    public Object getNativeCache() {
                        return heapEhcache;
                    }

                    @Override
                    public ValueWrapper get(Object key) {
                        Object value = heapEhcache.get(String.valueOf(key));
                        return null == value ? null : () -> value;
                    }

                    @Override
                    public <T> T get(Object key, Class<T> type) {
                        Object value = heapEhcache.get(String.valueOf(key));
                        if (value != null && type != null && !type.isInstance(value)) {
                            throw new IllegalStateException("Cached value is not of required type [" + type.getName() + "]: " + value);
                        }
                        return (T) value;
                    }

                    @Override
                    public <T> T get(Object key, Callable<T> valueLoader) {
                        try {
                            return valueLoader.call();
                        } catch (Exception e) {
                            LOGGER.error("ehcache valueLoader.call occur error", e);
                        }
                        return null;
                    }

                    @Override
                    public void put(Object key, Object value) {
                        heapEhcache.put(String.valueOf(key), value);
                    }

                    @Override
                    public ValueWrapper putIfAbsent(Object key, Object value) {
                        Object putIfAbsent = heapEhcache.putIfAbsent(String.valueOf(key), value);
                        return putIfAbsent == null ? null : () -> putIfAbsent;
                    }

                    @Override
                    public void evict(Object key) {
                        heapEhcache.remove(String.valueOf(key));
                    }

                    @Override
                    public void clear() {
                        heapEhcache.clear();
                    }
                };
            }

            @Override
            public Collection<String> getCacheNames() {
                String[] cacheNames = {CACHE_NAME_XXXX , CACHE_NAME_YYYY};
                return Arrays.asList(cacheNames);
            }
        };
    }
}

注意: 返回类型为ValueWrapper的Cache接口需要注意,源码提示:当返回为null说明缓存中没有此key,则直接返回null,然后就会从数据库中取数据。当有返回值时,说明缓存中有此key, 此时应该返回ValueWrapper的包裹类(包含了实际的返回值)。


--结束END--

本文标题: ehcache 3.* 使用介绍

本文链接: https://www.lsjlt.com/news/191135.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ehcache 3.* 使用介绍
    官网地址:http://×××w.ehcache.org/documentation/3.6/getting-started.html    根据官网的说明使用起来非常简单,尤其是在3.0之后, 不管事xml配置文件还是链式编码配置。先看示...
    99+
    2023-01-31
    ehcache
  • 3 Linux之“男人”使用介绍
    每日一句:马哥你的每日一句呢!!! 果断搬出座右铭:宝剑锋从磨砺出,梅花香自苦寒来(=.=!)内部命令所谓内部命令,就是bash环境自带的命令,通过type COMMAND可查询内部命令可通过 help COMMAND 查看帮助[]:中括号...
    99+
    2023-01-31
    男人 Linux
  • Cassandra基本介绍(3) - 架
        通过上面2节,大家了解到了RDBMS遇到的问题,以及对Cassandra有了基本的了解。下面将介绍下Cassandra内部简单结构。    通过本章,大家应该了解到:Cassandra Write流程什么是SSTableCassan...
    99+
    2023-01-31
    Cassandra
  • JMS和ActiveMQ介绍(3)_Ac
    首先简单介绍一下ActiveMQ。ActiveMQ是由Apache软件基金会提供的开源免费消息服务器,目前版本是5.8.0。ActiveMQ具有以下特点:基于JMS 1.1和J2EE 1.4规范;支持多种连接协议:HTTP/S,IP组播,S...
    99+
    2023-01-31
    JMS ActiveMQ _Ac
  • Cassandra基本介绍(3) - 架构简介
        通过上面2节,大家了解到了RDBMS遇到的问题,以及对Cassandra有了基本的了解。下面将介绍下Cassandra内部简单结构。  &...
    99+
    2022-10-18
  • 3. Powershell关键命令介绍
    3. Powershell关键命令介绍 我们将在这介绍三种简单的但是很关键的命令,这些命令能够让你的 Powershell之旅更加顺利。 当你学习的时候,请记住一条军规,那就是Powershell的动词-名词(Verb-noun)结构,...
    99+
    2023-01-31
    命令 关键 Powershell
  • Python基础语法介绍(3)
    基本概念、特性 顺序存储相同/不同类型的元素 定义:使用()将元素括起来,元素之间用“,”括开 特性:不可变,不支持添加,修改,删除等操作 查询:通过下标查询元组指定位置的元素 其他 空元组定义:non_tuple = () 只包含一...
    99+
    2023-01-31
    语法 基础 Python
  • Android AIDL使用介绍(3) 浅说AIDL背后的Binder
    1.背景 在前面的博客中,我们已经学会了使用AIDL进行跨进程通信,AIDL的使用比较简单,可实际上跨进程通信是一个相当复杂的过程,例如进程A是...
    99+
    2022-06-06
    aidl binder Android
  • 简单介绍Fedora Core 3系统应用
    Fedora Core 3是一种基于Linux操作系统的发行版,它是由Fedora项目开发的。Fedora Core 3提供了许多不...
    99+
    2023-09-23
    Fedora
  • 3、MySQL的数据类型介绍
    上一章节内容主要介绍了一些MySQL中对表和库的增删改查操作,对于上一章中对与表中字段的一些定义进行说明,本章主要介绍关于数据库类型的一些定义。一、概述:MySQL数据库中的数据大致可以分为以下几类,从而实现数据库在操作的时候对不同类型的处...
    99+
    2023-01-31
    数据类型 MySQL
  • python学习笔记(开课介绍3)
    学PYTHON有没有前途?美国python工程师工资情况:8-11W美元中国,以北京为例,2013年时全国范围内只有30个python职位,地域差别很大。编程语言排名:2013年,python排第八2015排到第四codeeval网站调研,...
    99+
    2023-01-31
    学习笔记 python
  • PreferenceActivity使用介绍
    PreferenceActivity是Android中的一个界面组件,用于展示和编辑应用程序的设置选项。它继承自Activity,并...
    99+
    2023-09-14
    使用
  • mysqldump使用介绍
    1,备份单个数据库的结构和数据mysqldump -uroot -p123456 test1 > /root/test1.sql2,还原单个数据库的结构和数据方法1:使用mysql命令mysql -u...
    99+
    2022-10-18
  • GoLangchannel使用介绍
    目录停止信号任务定时解耦生产方和消费方控制并发数停止信号 channel 用于停止信号的场景还是挺多的,经常是关闭某个 channel 或者向 channel 发送一个元素,使得接收...
    99+
    2022-11-11
  • ZookeeperZkClient使用介绍
    目录前言1、创建会话2、创建节点3、删除节点4、获取子节点5、获取数据(节点是否存在、更新、删除)前言 接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如何...
    99+
    2022-11-13
  • SpringBeanDefinition使用介绍
    目录1. 前言2. BeanDefinition2.1 AttributeAccessor2.2 BeanMetadataElement2.3 BeanDefinition2.4 A...
    99+
    2023-01-04
    Spring BeanDefinition作用 Spring BeanDefinition
  • puppet介绍、使用
    Puppet是一个自动化配置管理工具,可以帮助管理和部署大规模的计算机系统和网络设备。它允许用户通过定义所需的系统状态和配置,然后自...
    99+
    2023-09-23
    puppet
  • JS.findElementById()使用介绍
    复制代码 代码如下: his.findElementById = function (identifier, frame) { if (!frame) { frame = windo...
    99+
    2022-11-15
    findElementById
  • MinIO介绍使用
    MinIO介绍使用 MinIO 介绍 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。 MinIO 英文官网 MinIO 中文官网 注意:中...
    99+
    2023-09-02
    docker linux java
  • iOS中的3种定时器汇总介绍
    目录在iOS中有3种常见的定时器,它们会根据不同的场景进行选择使用。 1.DispatchSourceTimer: 基于GCD实现。 2.CADisplayLink:基于屏幕刷新实现...
    99+
    2023-05-19
    ios定时器 IOS定时器使用详解 iOS常见三种定时器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作