文档章节

Guava缓存-Cache

Kevin-air
 Kevin-air
发布于 2016/08/05 16:55
字数 833
阅读 218
收藏 0

Guava Cache有两种创建方式:

  1. cacheLoader
  2. callable callback

  通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。

示例

import com.google.common.cache.*;
import org.junit.Test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * @author Kevin
 * @description
 * @date 2016/8/5
 */
public class CacheTest {

    @Test
    public void cacheLoaderTest() throws Exception {
        CacheLoader<String, String> cacheLoader = new CacheLoaderImpl();

        LoadingCache<String, String> cacheBuilder = CacheBuilder.newBuilder().maximumSize(1000).removalListener(new RemovalListenerImpl()).
                expireAfterAccess(5L, TimeUnit.SECONDS).build(cacheLoader);

        // read from database
        System.out.println("Kevin value:" + cacheBuilder.get("Kevin"));
        System.out.println("Han value:" + cacheBuilder.getUnchecked("Han"));

        // read from cache
        System.out.println("Kevin value:" + cacheBuilder.get("Kevin"));
        System.out.println("Han value:" + cacheBuilder.getUnchecked("Han"));

        // wait cache expire
        Thread.sleep(10000);

        // cache miss get EXPIRED notification
        System.out.println("Kevin value:" + cacheBuilder.get("Kevin"));
        System.out.println("Han value:" + cacheBuilder.getUnchecked("Han"));

        cacheBuilder.put("name", "Kevin");
        System.out.println("name value:" + cacheBuilder.get("name"));

        // async replace the key value ,get REPLACED notification
        cacheBuilder.refresh("name");

        // invalidate a key get EXPLICIT notification
        cacheBuilder.invalidate("name");
        System.out.println("name value:" + cacheBuilder.get("name"));

        // reload from databse then return value
        System.out.println(cacheLoader.load("name"));
    }


    @Test
    public void callbackCacheTest() throws ExecutionException {
        Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();
        String result = cache.get("Kevin", new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("call me when cache miss");
                String value = "hello " + "Kevin" + "!";
                return value;
            }
        });
        System.out.println("Kevin value:" + result);

        result = cache.get("Kevin", new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("call me when cache miss");
                String value = "hello " + "Kevin" + "!";
                return value;
            }
        });
        System.out.println("Kevin value:" + result);
    }
}

class CacheLoaderImpl extends CacheLoader<String, String> {

    @Override
    public String load(String key) throws Exception {
        System.out.println("call me when cache miss,read from database...");
        String value = "hello " + key + "!";
        return value;
    }
}

// 缓存事件监听器
class RemovalListenerImpl implements RemovalListener<String, String> {

    @Override
    public void onRemoval(RemovalNotification<String, String> notification) {
        System.out.println("cause : " + notification.getCause() + ",key : " + notification.getKey() + ",value : " + notification.getValue());
    }
}

cache的参数说明:

  回收的参数:
  1. 大小的设置:CacheBuilder.maximumSize(long)  CacheBuilder.weigher(Weigher)  CacheBuilder.maxumumWeigher(long)
  2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)
  3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues()  CacheBuilder.softValues()
  4. 明确的删除:invalidate(key)  invalidateAll(keys)  invalidateAll()
  5. 缓存监听器:CacheBuilder.removalListener(RemovalListener)
  

  refresh机制:
  1. LoadingCache.refresh(K)  异步刷新对应key的值。
  2. CacheLoader.reload(K, V) 重新加载key的值并返回新的value。
  3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache。

guava Cache数据移除:

  1. 基于容量大小的移除,定义的方式一般为 CacheBuilder.maximumSize(long)
  2. 基于时间的移除,guava提供了两个基于时间移除的方法
        expireAfterAccess(long, TimeUnit)  这个方法是根据某个键值对最后一次访问之后多少时间后移除
        expireAfterWrite(long, TimeUnit)  这个方法是根据某个键值对被创建或值被替换后多少时间移除
  3. 基于引用的移除,这种移除方式主要是基于java的垃圾回收机制,根据键或者值的引用关系决定移除

自主移除,主动移除有三种方法:
  1.单独移除用 Cache.invalidate(key)
  2.批量移除用 Cache.invalidateAll(keys)
  3.移除所有用 Cache.invalidateAll()

如果需要在移除数据的时候有所动作还可以定义Removal Listener,但是有点需要注意的是默认Removal Listener中的行为是和移除动作同步执行的,如果需要改成异步形式,可以考虑使用RemovalListeners.asynchronous(RemovalListener, Executor)

© 著作权归作者所有

共有 人打赏支持
Kevin-air
粉丝 13
博文 73
码字总数 26587
作品 0
深圳
Guava库学习:学习Guava Cache知识汇总

原文地址:Guava库学习:学习Guava Cache知识汇总 至此,我们结束了对Guava Cache 缓存机制的学习,在学习过程中,我们学习了如何简单的通过MapMaker创建最简单的ConcurrentMap缓存,我们也了...

Realfighter
2014/12/21
0
1
guava cache与spring集成

缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。在cpu进行计算的时候, 首先是读取寄存器,然后内存,...

爪哇小贩
2016/11/20
973
0
分布式缓存系列之guava cache

guava是google的一个开源java框架,其github地址是 https://github.com/google/guava。guava工程包含了若干被Google的 Java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching...

浮云骑士LIN
07/22
0
0
Guava 源码分析之Cache的实现原理

前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。 缓存 本次主要讨论缓存。缓存在日...

crossoverJie
01/20
0
0
Google Guava 在实际场景中的应用封装

毕竟西湖六月中,风光不与四时同。 接天莲叶无穷碧,映日荷花别样红。 晓出净慈寺送林子方-杨万里 周末与小伙伴约了一波西湖,这个时间荷花开的正好...,在开始文章之前先放一张“佛系”美图...

glmapper
06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
38
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部