二级缓存(ehcache)

  1. 为什么需要缓存
    拉高程序的性能

    关系型数据库:数据与数据之间存在关系(联系)的数据库

mysql/Oracle、sqlserver
非关系型数据库:数据与数据之间是不存在关系的,key-

value
1、基于文件存储的数据库:ehcache
2、基于内存存储的数据库:redis、

memcache
3、基于文档存储的数据库:mongodb

  1. 什么样的数据需要缓存
    很少被修改或根本不改的数据

    业务场景比如:耗时较高的统计分析sql、电话账单查询sql

  1. ehcache是什么
    Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、

结构清晰、功能强大

注1:本章介绍的是2.X版本,3.x的版本和2.x的版本API差异

比较大

redis

  1. ehcache的特点
    4.1 够快
    Ehcache的发行有一段时长了,经过几年的努力和不计其

数的性能测试,Ehcache终被设计于large, high concurrency

systems.
4.2 够简单
开发者提供的接口非常简单明了,从Ehcache的搭建到运

用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道

自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
4.3 够袖珍
关于这点的特性,官方给了一个很可爱的名字small foot

print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB


4.4 够轻量
核心程序仅仅依赖slf4j这一个包,没有之一!
4.5 好扩展
Ehcache提供了对大数据的内存和硬盘的存储,最近版本

允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法

,基础属性支持热配置、支持的插件多
4.6 监听器
缓存管理器监听器 (CacheManagerListener)和 缓存

监听器(CacheEvenListener),做一些统计或数据一致性广播挺

好用的
4.7 分布式缓存
从Ehcache 1.2开始,支持高性能的分布式缓存,兼具灵

活性和扩展性

  1. ehcache的使用
    3.1 导入相关依赖

    net.sf.ehcache
    ehcache
    2.10.0

3.2 核心接口
CacheManager:缓存管理器
Cache:缓存对象,缓存管理器内可以放置若干cache,存

放数据的实质,所有cache都实现了Ehcache接口
Element:单条缓存数据的组成单位

3.3 src:ehcache.xml

  1. hibernate缓存
    4.1 一级缓存
    session

4.2 二级缓存
SessionFactory
可拔插式

  1. hibernate(5.2.12.Final)中使用二级缓存步骤(ehcache)
    5.1 导入ehcache相关依赖

    org.hibernate
    hibernate-ehcache
    5.2.12.Final

5.2 src添加ehcache.xml

5.3 hibernate.cfg.xml中添加二级缓存相关配置

<property

name=“hibernate.cache.use_second_level_cache”>true</pr

operty>

<property

name=“hibernate.cache.use_query_cache”>true

<property

name=“hibernate.cache.region.factory_class”>org.hibern

ate.cache.ehcache.EhCacheRegionFactory

5.4 指定实体类开启二级缓存

<class-cache usage=“read-write”

class=“entity.Dict”/>

  <!-- xml配置方式 -->
  <class table="t_sys_dict" name="entity.Dict">
	<cache usage="read-write"/> 
            .......
  </class>


 注1:查全部需要编写代码来开启二级缓存的
 query.setCacheRegion("entity.Dict");//指定缓存策略

,名字必须实体类的完整类名
query.setCacheable(true);//手动开启二级缓存

核心接口
CacheManager:缓存管理器
Cache:缓存对象,缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口
Element:单条缓存数据的组成单位

src:ehcache.xml 介绍

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
       updateCheck="false">
  <!--磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存-->
  <!--path:指定在硬盘上存储对象的路径-->
  <!--java.io.tmpdir 是默认的临时文件路径。 可以通过如下方式打印出具体的文件路径 System.out.println(System.getProperty("java.io.tmpdir"));-->
  <!-- <diskStore path="F:\temp"/> -->
  <diskStore path="java.io.tmpdir"/>

  <!--defaultCache:默认的管理策略-->
  <!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断-->
  <!--maxElementsInMemory:在内存中缓存的element的最大数目-->
  <!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上-->
  <!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false-->
  <!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问-->
  <!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问-->
  <!--memoryStoreEvictionPolicy:缓存的3 种清空策略-->
  <!--FIFO:first in first out (先进先出)-->
  <!--LFU:Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存-->
  <!--LRU:Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存-->
  <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
                timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>


  <!--name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)-->
  <cache name="com.zking.one.entity.User" eternal="false" maxElementsInMemory="100"
         overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
         timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/>
</ehcache>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在项目中引入依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> ``` 然后,在 Spring Boot 启动类中添加 @EnableCaching 注解开启缓存功能: ```java @SpringBootApplication @EnableCaching public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 接下来,需要创建一个配置类,配置 Ehcache 作为缓存管理器: ```java @Configuration @EnableCaching public class EhcacheConfig { @Bean public CacheManager cacheManager() { return new EhCacheCacheManager(ehCacheCacheManager().getObject()); } @Bean public EhCacheManagerFactoryBean ehCacheCacheManager() { EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean(); cmfb.setConfigLocation(new ClassPathResource("ehcache.xml")); cmfb.setShared(true); return cmfb; } } ``` 接着,在项目的 classpath 下新建一个名为 ehcache.xml 的配置文件,并在其中定义一个缓存cache),作为二级缓存: ```xml <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd" updateCheck="true" monitoring="autodetect"> <cache name="secondLevelCache" maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="3600" diskSpoolBufferSizeMB="20" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </cache> </ehcache> ``` 最后,在需要使用二级缓存的实体类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值