项目开发中,很多配置数据需要缓存,一般来说,开发人员都会手动写HashMap,HashSet或者ConcurrentHashMap,ConcurrentHashSet缓存数据,但是这样的缓存往往存在内存泄漏,刷新机制不健全等缺点。实际上有不少第三方组件实现了功能完善的本地缓存,建议大家直接使用成熟的本地缓存组件,这里主要介绍一下google的guava。

整体来看,guava首次查询数据时使用用户实现的load方法加载数据,之后再次查询该数据就可以直接从内存中获取,不必走load方法了。当然,guava实现了缓存超时,缓存大小限制等管理机制,使用起来十分方便。废话不多说,直接看代码。

package com.coshaho.learn.guava;

import java.util.concurrent.TimeUnit;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.cache.Weigher; /**
*
* BaseCache.java Create on 2017年2月21日 下午9:42:55
*
* 类功能说明: GUAVA缓存
*
* Copyright: Copyright(c) 2013
* Company: COSHAHO
* @Version 1.0
* @Author coshaho
*/
public abstract class BaseCache<K, V>
{
private LoadingCache<K,V> cache; public BaseCache()
{
cache = CacheBuilder.newBuilder()
.maximumSize(10000)
.build(new CacheLoader<K, V>() {
@Override
public V load(K k) throws Exception
{
return loadData(k);
}
});
} /**
* 超时缓存:数据写入缓存超过一定时间自动刷新
* @param duration
* @param timeUtil
*/
public BaseCache(long duration, TimeUnit timeUtil)
{
cache = CacheBuilder.newBuilder()
.expireAfterWrite(duration, timeUtil)
.build(new CacheLoader<K, V>() {
@Override
public V load(K k) throws Exception
{
return loadData(k);
}
});
} /**
* 限容缓存:缓存数据个数不能超过maxSize
* @param maxSize
*/
public BaseCache(long maxSize)
{
cache = CacheBuilder.newBuilder()
.maximumSize(maxSize)
.build(new CacheLoader<K, V>() {
@Override
public V load(K k) throws Exception
{
return loadData(k);
}
});
} /**
* 权重缓存:缓存数据权重和不能超过maxWeight
* @param maxWeight
* @param weigher:权重函数类,需要实现计算元素权重的函数
*/
public BaseCache(long maxWeight, Weigher<K, V> weigher)
{
cache = CacheBuilder.newBuilder()
.maximumWeight(maxWeight)
.weigher(weigher)
.build(new CacheLoader<K, V>() {
@Override
public V load(K k) throws Exception
{
return loadData(k);
}
});
} /**
*
* 缓存数据加载方法
* @author coshaho
* @param k
* @return
*/
protected abstract V loadData(K k); /**
*
* 从缓存获取数据
* @author coshaho
* @param param
* @return
*/
public V getCache(K param)
{
return cache.getUnchecked(param);
} /**
*
* 清除缓存数据,缓存清除后,数据会重新调用load方法获取
* @author coshaho
* @param k
*/
public void refresh(K k)
{
cache.refresh(k);
} /**
*
* 主动设置缓存数据
* @author coshaho
* @param k
* @param v
*/
public void put(K k, V v)
{
cache.put(k, v);
}
}

本地缓存之GUAVA的更多相关文章

  1. springboot之本地缓存(guava与caffeine)

    1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...

  2. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  3. 第七章 企业项目开发--本地缓存guava cache

    1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...

  4. 企业项目开发--本地缓存guava cache(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...

  5. A comparison of local caches (1) 【本地缓存之比较 (1)】

    1. Spring local cache   [Spring 本地缓存] Spring provided cacheable annotation since 3.1. It's very supe ...

  6. 使用Guava cache构建本地缓存

    前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...

  7. Guava Cache本地缓存

    Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...

  8. 使用guava cache在本地缓存热点数据

    某些热点数据在短时间内可能会被成千上万次访问,所以除了放在redis之外,还可以放在本地内存,也就是JVM的内存中. 我们可以使用google的guava cache组件实现本地缓存,之所以选择gua ...

  9. 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)

    目录 1.问题场景及说明 2.Redis 缓存是深拷贝 3.Guava本地缓存直接获取则是浅拷贝 4.如何实现Guava获取本地缓存是深拷贝? 1.问题场景及说明 系统中同时使用 Redis 缓存和 ...

随机推荐

  1. [Html5] HTML5 开发手机应用

    上次周例会我给大家做了题目为:<漫游移动平台前端开发>的汇报,现在推荐一些额外的学习资料.          依照目前iPhone/Android 迅速提升市占率的情势来看,未来如果想要在 ...

  2. 配置java环境变量后没有生效的解决办法

    参考文章:https://blog.csdn.net/tooky_poom/article/details/60768458 系统安装了jdk1.7,环境变量正常,但是安装jdk1.8后,修改环境变量 ...

  3. INTRO: THE DAWN (亡灵序曲) 中独白

    As the last ship sailed towards the distant horizon I sat there watching on a rock My mind slowly dr ...

  4. MUI音乐播放html5+audio模块

    html5+ audio 模块MUI播放音频 Audio模块用于提供音频的录制和播放功能,可调用系统的麦克风设备进行录音操作,也可调用系统的扬声器设备播放音频文件.通过plus.audio获取音频管理 ...

  5. Rsync数据同步应用指南

    1.软件简介 Rsync 是一个本地或远程数据同步工具,基于RSync算法,这个算法是澳大利亚人Andrew Tridgell发明的:可通过 LAN/WAN 快速同步多台主机间的文件.Rsync 本来 ...

  6. 如何取消一个目录的git初始化

    一不小心把我的整个home目录都初始化为git仓库了,通过执行删除.git命令,可以恢复 rm -rf .git

  7. Oracle Function:COUNT

    Description The Oracle/PLSQL COUNT function returns the count of an expression. The COUNT(*) functio ...

  8. ONLYstore_name+AdWord

    情景描述ONLYstore_name+AdWord 基础表数据表 BASE_TABLEAdWord food drink1w1    1f1    1d12w2    2f_    2d_3w1    ...

  9. snowflake and uuid

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  10. Databases: MySQL tRIGger--chinese character-set php

    DELIMITER |create TRIGGER tr_calllog_insert after insert on messagescalllog for each row beginIF mes ...