• EhCache缓存框架


    一、为什么要使用缓存

    什么是缓存,我们为什么要使用缓存?缓存实际上是为了减轻数据库服务器的负载,使用缓存,我们可以将一些常用的数据放入缓存,因为这些数据经常性的使用,大大增加了服务器的负载,但是当放入缓存后,在使用这些数据的时候,首先会从缓存中查找,如果缓存中有就读取,不会再到数据库中查找,如果缓存中没有,才会到数据库中查询,在这里,需要注意的是,ehcache的是将数据放入jvm内存中,也就是说当次缓存在本次服务器启动期间有效,下次服务器启动将会失效。
     

    二、EhCache简介

    1、基本介绍

    EhCache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级 容器。可以和大部分Java项目无缝整合,例如:Hibernate中的缓存就是基于EhCache实现 的。 EhCache支持内存和磁盘存储,默认存储在内存中,如内存不够时把缓存数据同步到磁 盘中。EhCache支持基于Filter的Cache实现,也支持Gzip压缩算法。
     

    2、主要的特性

    EhCache直接在JVM虚拟机中缓存,速度快,效率高;

    EhCache缺点是缓存共享麻烦,集群分布式应用使用不方便;

    可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用;

    3、ehcache 和 redis 比较

    ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。

    redis是通过socket访问到缓存服务,效率比Ehcache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

    ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。
     

    三、入门案例

    1、添加依赖 

    1. <dependency>
    2. <groupId>net.sf.ehcachegroupId>
    3. <artifactId>ehcacheartifactId>
    4. <version>2.6.11version>
    5. dependency>

    2、编写ehcache.xml文件

    1. "1.0" encoding="UTF-8"?>
    2. <ehcache>
    3. <diskStore path="D:\JAVA\Project\EhCache"/>
    4. <defaultCache
    5. maxEntriesLocalHeap="10000"
    6. eternal="false"
    7. timeToIdleSeconds="120"
    8. timeToLiveSeconds="120"
    9. maxEntriesLocalDisk="10000000"
    10. diskExpiryThreadIntervalSeconds="120"
    11. memoryStoreEvictionPolicy="LRU">
    12. <persistence strategy="localTempSwap"/>
    13. defaultCache>
    14. <cache name="HelloWorldCache"
    15. maxElementsInMemory="1000"
    16. eternal="false"
    17. timeToIdleSeconds="5"
    18. timeToLiveSeconds="5"
    19. overflowToDisk="false"
    20. memoryStoreEvictionPolicy="LRU"/>
    21. ehcache>

    3、编写测试方法

    1. public static void main(String[] args) {
    2. //获取编译目录下的资源的流对象
    3. InputStream input = TestEH.class.getClassLoader().getResourceAsStream("EhCache/ehcache.xml");
    4. //获取 EhCache 的缓存管理对象
    5. CacheManager cacheManager = new CacheManager(input);
    6. //获取缓存对象
    7. Cache cache = cacheManager.getCache("HelloWorldCache");
    8. //创建缓存数据
    9. Element element = new Element("name","zhang3");
    10. //存入缓存
    11. cache.put(element);
    12. //从缓存中取出
    13. Element element1 = cache.get("name");
    14. System.out.println(element1.getObjectValue());
    15. }

    四、springboot集成EhCache

    1、添加springboot 配置(application.yml)

    1. spring:
    2. cache:
    3. type: ehcache
    4. ehcache:
    5. config: classpath:ehcache.xml

    2、pring boot启动类开启缓存注解

    @EnableCaching

    3、EhCache工具类

    1. import net.sf.ehcache.Cache;
    2. import net.sf.ehcache.CacheManager;
    3. import net.sf.ehcache.Element;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Component;
    6. /**
    7. * Ehcache工具类
    8. *
    9. * @Author syh
    10. * @Date 2022/11/16 11:28
    11. */
    12. @Component
    13. public class EhcacheUtils {
    14. @Autowired
    15. private CacheManager cacheManager;
    16. /**
    17. * 获取Ehcache对象
    18. *
    19. * @param cacheName 缓存策略
    20. * @return Cache
    21. */
    22. public Cache getEhcache(String cacheName){
    23. return cacheManager.getCache(cacheName);
    24. }
    25. /**
    26. * 获取缓存
    27. *
    28. * @param cacheName xml中配置的缓存策略
    29. * @param key 键
    30. * @return Object
    31. */
    32. public Object getCache(String cacheName,String key){
    33. Cache cache = cacheManager.getCache(cacheName);
    34. if(cache==null){
    35. return null;
    36. }
    37. return cache.get(key).getObjectValue();
    38. }
    39. /**
    40. * 保存一个缓存数据,若使用的缓存策略不存在则创建一个新的缓存
    41. *
    42. * @param cacheName xml中配置的缓存策略的名字
    43. * @param key 缓存键
    44. * @param value 缓存值
    45. */
    46. public void putCache(String cacheName,String key,Object value){
    47. Cache cache = cacheManager.getCache(cacheName);
    48. if(cache==null){
    49. cacheManager.addCache(cacheName);
    50. cache = cacheManager.getCache(cacheName);
    51. }
    52. cache.put(new Element(key, value));
    53. System.out.println( cacheName + "已缓存");
    54. }
    55. /**
    56. * 删除缓存
    57. *
    58. * @param cacheName 缓存策略
    59. * @param key 键
    60. */
    61. public void removeCache(String cacheName,String key){
    62. Cache cache = cacheManager.getCache(cacheName);
    63. if(cache!=null){
    64. cache.remove(key);
    65. }else{
    66. System.out.println("cache is null...");
    67. }
    68. }
    69. /**
    70. * 替换缓存
    71. *
    72. * @param cacheName 缓存策略
    73. * @param key 键
    74. * @param value 值
    75. */
    76. public void replaceCache(String cacheName,String key,String value){
    77. Cache cache = cacheManager.getCache(cacheName);
    78. if(cache!=null){
    79. cache.replace(new Element(key,value));
    80. }
    81. }
    82. /**
    83. * 关闭缓存
    84. */
    85. public void shutDownCache(){
    86. cacheManager.shutdown();
    87. }
    88. public CacheManager getCacheManager() {
    89. return cacheManager;
    90. }
    91. public void setCacheManager(CacheManager cacheManager) {
    92. this.cacheManager = cacheManager;
    93. }
    94. }

    4、EhCache工具类测试

    1. import com.hssmart.config.ehcache.EhcacheUtils;
    2. import net.sf.ehcache.Cache;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import org.springframework.web.bind.annotation.RestController;
    6. import javax.annotation.Resource;
    7. /**
    8. * @Description 缓存测试controller
    9. * @ClassName EhcacheController
    10. * @Author syh
    11. * @Date 2022/11/16 11:29
    12. */
    13. @RestController
    14. @RequestMapping(value = "/EhcacheController")
    15. public class EhcacheController {
    16. @Resource
    17. private EhcacheUtils cacheUtils;
    18. @GetMapping("/test")
    19. public String test() {
    20. try {
    21. // 在HelloWorldCach1e策略下设置缓存
    22. cacheUtils.putCache("HelloWorldCach1e", "kexq", "this is myCache test ...");
    23. String s = (String)cacheUtils.getCache("HelloWorldCach1e","kexq");
    24. System.out.println(s);
    25. // 获取HelloWorldCach1e策略对象
    26. Cache cache = cacheUtils.getEhcache("HelloWorldCach1e");
    27. System.out.println(cache.getMemoryStoreEvictionPolicy().getName());;
    28. System.out.println(cache);
    29. }catch (Exception e){
    30. e.printStackTrace();
    31. }
    32. return "index";
    33. }
    34. }

  • 相关阅读:
    Java程序设计-韩建平-读书笔记
    2.11 Nginx控制浏览器缓存
    ES6如何声明一个类?类如何继承?
    嵌入式实时操作系统的设计与开发(概述学习)
    Spring体系结构详解
    11.23二叉树
    原型制作的软件 Experience Design mac( XD ) 中文版软件特色
    振芯GM7123C:功能RGB转VGA芯片方案简介
    Django REST Farmowork初探
    python 代码 C 执行
  • 原文地址:https://blog.csdn.net/asddasddeedd/article/details/127838322