java 谷歌内存缓存工具类

简介: java 谷歌内存缓存工具类

/**

  • 谷歌内存缓存-角色

*/
public class CacheManagerGuavaRole {

/**
 * 缓存项最大数量
 */
private static final long GUAVA_CACHE_SIZE = 100000;

/**
 * 缓存时间:天
 */
private static final long GUAVA_CACHE_DAY = 11800;

/**
 * 缓存操作对象
 */
private static LoadingCache<String, List<String>> GLOBAL_CACHE = null;
private static Logger log = LoggerFactory.getLogger(CacheManagerGuavaRole.class);

static {
    try {
        GLOBAL_CACHE = loadCache(new CacheLoader<String, List<String>>() {
            @Override
            public List<String> load(String key) throws Exception {
                // 处理缓存键不存在缓存值时的处理逻辑
                return null;
            }
        });
    } catch (Exception e) {
        log.error("初始化Guava Cache出错", e);
    }
}

/**
 * 全局缓存设置
 * <p>
 * 缓存项最大数量:100000
 * 缓存有效时间(天):10
 *
 * @param cacheLoader
 * @return
 * @throws Exception
 */
private static LoadingCache<String, List<String>> loadCache(CacheLoader<String, List<String>> cacheLoader) throws Exception {
    LoadingCache<String, List<String>> cache = CacheBuilder.newBuilder()
            //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项
            .maximumSize(GUAVA_CACHE_SIZE)
            //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护)
            //.expireAfterAccess(GUAVA_CACHE_DAY, TimeUnit.DAYS)
            // 设置缓存在写入之后 设定时间 后失效
            .expireAfterWrite(GUAVA_CACHE_DAY, TimeUnit.DAYS)
            //移除监听器,缓存项被移除时会触发
            .removalListener(new RemovalListener<String, List<String>>() {
                @Override
                public void onRemoval(RemovalNotification<String, List<String>> rn) {
                    //逻辑操作
                }
            })
            //开启Guava Cache的统计功能
            .recordStats().build(cacheLoader);
    return cache;
}

/**
 * 设置缓存值
 * 注: 若已有该key值,则会先移除(会触发removalListener移除监听器),再添加
 *
 * @param key
 * @param value
 */
public static void put(String key, List<String> value) {
    try {
        GLOBAL_CACHE.put(key, value);
    } catch (Exception e) {
        log.error("设置缓存值出错", e);
    }
}

/**
 * 批量设置缓存值
 *
 * @param map
 */
public static void putAll(Map<? extends String, ? extends List<String>> map) {
    try {
        GLOBAL_CACHE.putAll(map);
    } catch (Exception e) {
        log.error("批量设置缓存值出错", e);
    }
}

/**
 * 获取缓存值
 * 注:如果键不存在值,将调用CacheLoader的load方法加载新值到该键中
 *
 * @param key
 * @return
 */
public static List<String> get(String key) {
    List<String> token = Lists.newArrayList();
    try {
        token = GLOBAL_CACHE.get(key);
    } catch (Exception e) {
        log.error("获取缓存值出错", e);
    }
    return token;
}

/**
 * 获取缓存值
 * 注:如果键不存在值,将调用CacheLoader的load方法加载新值到该键中
 *
 * @param key
 * @return
 */
public static ImmutableMap<String, List<String>> getAll(List<String> key) {
    ImmutableMap<String, List<String>> map = ImmutableMap.of();
    try {
        map = GLOBAL_CACHE.getAll(key);
    } catch (Exception e) {
        log.error("获取缓存值出错", e);
    }
    return map;
}

/**
 * 移除缓存
 *
 * @param key
 */
public static void remove(String key) {
    try {
        GLOBAL_CACHE.invalidate(key);
    } catch (Exception e) {
        log.error("移除缓存出错", e);
    }
}

/**
 * 批量移除缓存
 *
 * @param keys
 */
public static void removeAll(Iterable<String> keys) {
    try {
        GLOBAL_CACHE.invalidateAll(keys);
    } catch (Exception e) {
        log.error("批量移除缓存出错", e);
    }
}

/**
 * 清空所有缓存
 */
public static void removeAll() {
    try {
        GLOBAL_CACHE.invalidateAll();
    } catch (Exception e) {
        log.error("清空所有缓存出错", e);
    }
}

/**
 * 获取缓存项数量
 *
 * @return
 */
public static long size() {
    long size = 0;
    try {
        size = GLOBAL_CACHE.size();
    } catch (Exception e) {
        log.error("获取缓存项数量出错", e);
    }
    return size;
}

}

相关文章
|
6天前
|
缓存 JavaScript 前端开发
Java 如何确保 JS 不被缓存
【10月更文挑战第19天】在 Java 中,可以通过设置 HTTP 响应头来确保 JavaScript 文件不被浏览器缓存。方法包括:1. 使用 Servlet 设置响应头,通过 `doGet` 方法设置 `Expires`、`Cache-Control` 和 `Pragma` 头;2. 在 Spring Boot 中配置拦截器,通过 `NoCacheInterceptor` 类和 `WebConfig` 配置类实现相同功能。这两种方法都能确保每次请求都能获取到最新的 JavaScript 内容。
|
11天前
|
缓存 算法 Java
Java中的内存管理:理解与优化
【10月更文挑战第6天】 在Java编程中,内存管理是一个至关重要的主题。本文将深入探讨Java内存模型及其垃圾回收机制,并分享一些优化内存使用的策略和最佳实践。通过掌握这些知识,您可以提高Java应用的性能和稳定性。
36 4
|
11天前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
4天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理方式,特别是垃圾回收机制。我们将了解Java的自动内存管理是如何工作的,它如何帮助开发者避免常见的内存泄漏问题。通过分析不同垃圾回收算法(如标记-清除、复制和标记-整理)以及JVM如何选择合适的垃圾回收策略,本文旨在帮助Java开发者更好地理解和优化应用程序的性能。
|
6天前
|
存储 Java
Java内存模型
【10月更文挑战第11天】Java 内存模型(JMM)是 Java 虚拟机规范中定义的多线程内存访问机制,解决内存可见性、原子性和有序性问题。它定义了主内存和工作内存的概念,以及可见性、原子性和有序性的规则,确保多线程环境下的数据一致性和操作正确性。使用 `synchronized` 和 `volatile` 等同步机制可有效避免数据竞争和不一致问题。
16 3
|
6天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
9天前
|
Java 数据挖掘 数据库连接
Java使用直接内存的好处
综上所述,Java直接内存的使用为开发者提供了一种绕过JVM堆限制、直接高效操作内存资源的途径,特别适用于高吞吐量、低延迟和大规模数据处理的场景。虽然直接内存的使用需要更精细的管理以避免内存泄漏和过度消耗系统资源,但恰当的利用能够显著提升应用的性能表现,是现代高性能Java应用不可或缺的工具之一。
10 2
|
10天前
|
Java 数据挖掘 数据库连接
Java使用直接内存的好处
综上所述,Java直接内存的使用为开发者提供了一种绕过JVM堆限制、直接高效操作内存资源的途径,特别适用于高吞吐量、低延迟和大规模数据处理的场景。虽然直接内存的使用需要更精细的管理以避免内存泄漏和过度消耗系统资源,但恰当的利用能够显著提升应用的性能表现,是现代高性能Java应用不可或缺的工具之一。
26 1
|
10天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
30 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
6天前
|
缓存 JavaScript 前端开发
Java 如何确保 JS 不被缓存
大家好,我是 V 哥。本文探讨了 Java 后端确保 JavaScript 不被缓存的问题,分析了文件更新后无法生效、前后端不一致、影响调试与开发及安全问题等场景,并提供了使用版本号、设置 HTTP 响应头、配置静态资源缓存策略和使用 ETag 等解决方案。最后讨论了缓存的合理使用及其平衡方法。