Guava------------Cache使用方法

简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及.

1.使用场景

2.如何使用Cache

3.创建方式

4. 如何和Spring搭配使用

+------------------------------------------------------分割心吖-------------------------------------------------------+

1. Cache的使用场景

一般而言,对于那些频繁需要查询比对的热点数据,我们采用使用缓存,对于数据量较小的,几条,几十条数据,而且需要加缓存的接口较少,这时候我们会采用Cache,建议使用Google提供的guava Cache,它简单易用的同时,性能也好. 而且线程安全(原因看源码) .对于那些较大数据量的,或者需要加缓存的接口较多的项目,可以去考虑Redis,memcached等等

2. 如何使用Cache

和Map的使用方式差不多,也可以和Spring结合,使用@Cacheable注解使用.

3. 创建方式

1. Cache Callable

2. LoadingCache

方式一:

  1 package info.sanaulla.cache;
  2
  3 import com.google.common.cache.Cache;
  4 import com.google.common.cache.CacheBuilder;
  5 import org.junit.Test;
  6
  7 import java.util.concurrent.Callable;
  8 import java.util.concurrent.ExecutionException;
  9 import java.util.concurrent.TimeUnit;
 10
 11 /**
 12  * *********************************************************
 13  * <p/>
 14  * Author:     XiJun.Gong
 15  * Date:       2016-08-17 16:59
 16  * Version:    default 1.0.0
 17  * Class description:
 18  * <p/>
 19  * *********************************************************
 20  */
 21 public class CacheDemo {
 22     private static Cache<Object, Object> cache = CacheBuilder.newBuilder()
 23             .maximumSize(100).expireAfterWrite(24, TimeUnit.HOURS)
 24             .recordStats()
 25             .build();
 26
 27     public static Object get(Object key) throws ExecutionException {
 28
 29         Object var = cache.get(key, new Callable<Object>() {
 30             @Override
 31             public Object call() throws Exception {
 32                 System.out.println("如果没有值,就执行其他方式去获取值");
 33                 String var = "Google.com.sg";
 34                 return var;
 35             }
 36         });
 37         return var;
 38     }
 39
 40     public static void put(Object key, Object value) {
 41         cache.put(key, value);
 42     }
 43
 44     class Person {
 45         private String name;
 46         private Integer age;
 47
 48         public Person() {
 49         }
 50
 51         public Person(String name, Integer age) {
 52             this.name = name;
 53             this.age = age;
 54         }
 55
 56         public String getName() {
 57             return name;
 58         }
 59
 60         public void setName(String name) {
 61             this.name = name;
 62         }
 63
 64         public Integer getAge() {
 65             return age;
 66         }
 67
 68         public void setAge(Integer age) {
 69             this.age = age;
 70         }
 71
 72         @Override
 73         public String toString() {
 74             return "Person{" +
 75                     "名字=‘" + name + ‘\‘‘ +
 76                     ", 年纪=" + age +
 77                     ‘}‘;
 78         }
 79     }
 80
 81     @Test
 82     public void CacheTest() throws ExecutionException {
 83
 84         Person person = new Person();
 85         person.setAge(11);
 86         person.setName("tSun");
 87         System.out.println(CacheDemo.get("man"));
 88         CacheDemo.put("man", new Person("hopg", 123));
 89         System.out.println(CacheDemo.get("man"));
 90         System.out.println(CacheDemo.get("man"));
 91
 92         System.out.println(CacheDemo.get("person").toString());
 93         CacheDemo.put("person", person);
 94         System.out.println(CacheDemo.get("person").toString());
 95         System.out.println(CacheDemo.get("person").toString());
 96
 97         System.out.println(CacheDemo.get("woman"));
 98         CacheDemo.put("women", new Person("google", 666));
 99         System.out.println(CacheDemo.get("woman"));
100         System.out.println(CacheDemo.get("woman"));
101         System.out.println(CacheDemo.get("man"));
102     }
103 }

结果:

 1 如果没有值,就执行其他方式去获取值
 2 Google.com.sg
 3 Person{名字=‘hopg‘, 年纪=123}
 4 Person{名字=‘hopg‘, 年纪=123}
 5 如果没有值,就执行其他方式去获取值
 6 Google.com.sg
 7 Person{名字=‘tSun‘, 年纪=11}
 8 Person{名字=‘tSun‘, 年纪=11}
 9 如果没有值,就执行其他方式去获取值
10 Google.com.sg
11 Google.com.sg
12 Google.com.sg
13 Person{名字=‘hopg‘, 年纪=123}

方式二:

  1 package info.sanaulla.cache;
  2
  3 import com.google.common.cache.CacheBuilder;
  4 import com.google.common.cache.CacheLoader;
  5 import com.google.common.cache.LoadingCache;
  6 import org.junit.Test;
  7
  8 import java.util.concurrent.ExecutionException;
  9 import java.util.concurrent.TimeUnit;
 10
 11 /**
 12  * *********************************************************
 13  * <p/>
 14  * Author:     XiJun.Gong
 15  * Date:       2016-08-17 15:00
 16  * Version:    default 1.0.0
 17  * Class description:
 18  * <p>Cache Demo</p>
 19  * <p/>
 20  * *********************************************************
 21  */
 22 public class CacheUtil {
 23
 24
 25     private static LoadingCache<Object, Object> cache = CacheBuilder.newBuilder()
 26             .maximumSize(2)
 27             .expireAfterAccess(24, TimeUnit.HOURS)
 28             .recordStats()
 29             .build(new CacheLoader<Object, Object>() {
 30
 31                 @Override
 32                 public Object load(Object key) throws Exception {
 33                     return key;
 34                 }
 35             });
 36
 37     public static Object get(Object key) throws ExecutionException {
 38         Object var = cache.get(key);
 39
 40         if (var.equals(key)) {
 41
 42             System.out.println("执行其他操作,查询该值");
 43             /**执行其他操作,获取值**/
 44             Object object = "Google.com.hk";
 45             put(key, object);
 46         } else {
 47             System.out.println("从Cache中取值....");
 48         }
 49         return cache.get(key);
 50     }
 51
 52     public static void put(Object key, Object value) {
 53         cache.put(key, value);
 54     }
 55
 56     class Person {
 57         private String name;
 58         private Integer age;
 59
 60         public Person() {
 61         }
 62
 63         public Person(String name, Integer age) {
 64             this.name = name;
 65             this.age = age;
 66         }
 67
 68         public String getName() {
 69             return name;
 70         }
 71
 72         public void setName(String name) {
 73             this.name = name;
 74         }
 75
 76         public Integer getAge() {
 77             return age;
 78         }
 79
 80         public void setAge(Integer age) {
 81             this.age = age;
 82         }
 83
 84         @Override
 85         public String toString() {
 86             return "Person{" +
 87                     "名字=‘" + name + ‘\‘‘ +
 88                     ", 年纪=" + age +
 89                     ‘}‘;
 90         }
 91     }
 92
 93     @Test
 94     public void TestCache() throws ExecutionException {
 95
 96         Person person = new Person();
 97         person.setAge(11);
 98         person.setName("tSun");
 99         System.out.println(CacheUtil.get("man"));
100         CacheUtil.put("man", new Person("hopg", 123));
101         System.out.println(CacheUtil.get("man"));
102         System.out.println(CacheUtil.get("man"));
103
104         System.out.println(CacheUtil.get("person").toString());
105         CacheUtil.put("person", person);
106         System.out.println(CacheUtil.get("person").toString());
107         System.out.println(CacheUtil.get("person").toString());
108
109         System.out.println(CacheUtil.get("woman"));
110         CacheUtil.put("women", new Person("google", 666));
111         System.out.println(CacheUtil.get("woman"));
112         System.out.println(CacheUtil.get("woman"));
113         System.out.println(CacheUtil.get("man"));
114     }
115 }

结果:

 1 执行其他操作,查询该值
 2 Google.com.hk
 3 从Cache中取值....
 4 Person{名字=‘hopg‘, 年纪=123}
 5 从Cache中取值....
 6 Person{名字=‘hopg‘, 年纪=123}
 7 执行其他操作,查询该值
 8 Google.com.hk
 9 从Cache中取值....
10 Person{名字=‘tSun‘, 年纪=11}
11 从Cache中取值....
12 Person{名字=‘tSun‘, 年纪=11}
13 执行其他操作,查询该值
14 Google.com.hk
15 从Cache中取值....
16 Google.com.hk
17 从Cache中取值....
18 Google.com.hk
19 执行其他操作,查询该值
20 Google.com.hk

4. 如何和Spring结合使用

4.1 首先简单了解一下@Cacheable,@CachePut,@CacheEvit

对于cache和数据操作进行一个功能对应,如下图.

      cache      sql

     Cacheable       --save/insert

CachePut        --update/Insert

CacheEvit        --remove/delete

4.2 配置spring配置文件applicationContext.xml

 1     <!-- cache -->
 2     <bean id="cacheManager" class="com.data.cache.guava.GuavaCacheManager"
 3           p:transactionAware="true">
 4         <property name="caches">
 5             <list>
 6                 <bean class="com.data.cache.guava.GuavaCacheFactoryBean" name="Person-cache"/>
 7                 <bean class="com.data.cache.guava.GuavaCacheFactoryBean" name="Modules-cache"/>
 8             </list>
 9         </property>
10     </bean>

部分代码:

 1     @Override
 2     @Cacheable(value = "Modules-cache")
 3     public Collection<Module> getModule(String name) {
 4         return module.get(checkNotNull(name));
 5     }
 6
 7     @Override
 8     @Transactional(readOnly = false)
 9     @CacheEvict(value = "Modules-cache", key = "#modules.name")
10     public void createModule(Modules post) {
11         ModuleDao.create(checkNotNull(module));
12     }

5. 扩展

在github上看到一篇关于,对于overflow时候,将数据写入到文件系统的例子,还不错,如果有这方面的需求可以看看.

地址:https://github.com/raphw/guava-cache-overflow-extension

时间: 2024-10-19 12:23:45

Guava------------Cache使用方法的相关文章

guava cache与spring集成

缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间.在cpu进行计算的时候, 首先是读取寄存器,然后内存,再是硬盘.由于寄存器容量很小,不太适合存储我们需要快速读取的数据,放在硬盘中话,效率太低,所以大多数人将一些静态资源或者不经常修改的数据放在内存中. 缓存的作用 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日常开发的很多场合,由于受限于硬盘 IO的性能或者我们自身业务系统的数

缓存框架Guava Cache部分源码分析

在本地缓存中,最常用的就是OSCache和谷歌的Guava Cache.其中OSCache在07年就停止维护了,但它仍然被广泛的使用.谷歌的Guava Cache也是一个非常优秀的本地缓存,使用起来非常灵活,功能也十分强大,可以说是当前本地缓存中最优秀的缓存框架之一.之前我们分析了OSCache的部分源码,本篇就通过Guava Cache的部分源码,来分析一下Guava Cache的实现原理. 在分析之前,先弄清数据结构的使用.之前的文章提到,OSCache使用了一个扩展的HashTable,作

google guava cache

老规矩,有些知识很容易忘记啊,还是记录一下咯. google guava cache中,有很多参数. 1.expireAfterAccess(n , timeunit)   表示cache中管理的key如果在n(s,m,h,d)时间范围内没有被使用,则被cache驱逐. 2.maximumSize(n)   表示可以缓存的最大数目.没有到达最大数目时, 即开始驱逐部门缓存数据. 3.removalListener     实现RemovalListener接口onRemoval方法.可以记录缓存

第二章 Google guava cache源码解析1--构建缓存器

1.guava cache 当下最常用最简单的本地缓存 线程安全的本地缓存 类似于ConcurrentHashMap(或者说成就是一个ConcurrentHashMap,只是在其上多添加了一些功能) 2.使用实例 具体在实际中使用的例子,去查看<第七章 企业项目开发--本地缓存guava cache>,下面只列出测试实例: import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit;

(翻译)Google Guava Cache

翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering Guava Cache. Guava Cache offers more flexibility and power than either a HashMap or ConcurrentHashMap, but is not as heavy as using EHCache or Memcache

Guava学习笔记:Guava cache

缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间. 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现.缓存的作用就是将这些来自不易的数据保存在内存中,当有其他线程或者客户端需要查询相同的数据资源时,

Java 高并发缓存与Guava Cache

一.背景 缓存是我们在开发中为了提高系统的性能,把经常的访问业务的数据第一次把处理结果先放到缓存中,第二次就不用在对相同的业务数据在重新处理一遍,这样就提高了系统的性能.缓存分好几种: (1)本地缓存. (2)数据库缓存. (3)分布式缓存. 分布式缓存比较常用的有memcached等,memcached是高性能的分布式内存缓存服务器,缓存业务处理结果,减少数据库访问次数和相同复杂逻辑处理的时间,以提高动态Web应用的速度. 提高可扩展性. 二.本地缓存在高并发下的问题以及解决 今天我们介绍的是

guava cache使用例子

关于介绍请参考:http://blog.csdn.net/liangrui1988/article/details/46120533# 下面是测试代码 ,下载源码可在github上获取:https://github.com/liangrui1988/guavaTest package org.rui.test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import

Guava库学习:学习Guava Cache(六)CacheStats

原文地址:Guava库学习:学习Guava Cache(六)CacheStats 上一篇,Guava库学习:学习Guava Cache(五)CacheLoader 中, 我们学习了CacheLoader抽象类,主要是其中的from方法,接收一个Function或Supplier,返回一个CacheLoader实 例,至此,我们已经了解了如何创建一个强大的缓存机制,接下来,我们想要收集缓存执行或使用后的一些统计信息,又该怎么做呢?现在开始本篇,Guava Cache CacheStats的学习.

Guava Cache 实现与源码分析

目录 Guava Cache 一.概述 1.内存缓存 2.核心数据结构 二.具体实现 0.一览众山小 1.CacheBuilder 构建器 2.LocalCache Guava Cache 一.概述 1.内存缓存 可看作一个jdk7的concurrentHashMap,核心功能get,put 但是比一般的map多了一些功能,如: ??过限失效(根据不同的维度失效,读后N秒,写后N秒,最大size,最大weight) 自动刷新 支持软引用和弱引用 监听删除 2.核心数据结构 和jdk7的HashM