首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于LoadingCache的内存缓存

基于LoadingCache的内存缓存

作者头像
用户1215919
发布于 2021-12-28 04:42:35
发布于 2021-12-28 04:42:35
67400
代码可运行
举报
文章被收录于专栏:大大的微笑大大的微笑
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MemoryCache {

    private IService service;
    private static LoadingCache<String, Data> useCache;


    public MemoryCache(IService service) {
        this.service = service;
        initialized();
    }

    
    public Data getResult(String key) {
        try {
            return useCache.get(key);
        } catch (ExecutionException e) {
            return service.service(key);
        }
    }

    /**
     * 初始化
     */
    private void initialized() {
        // 若不为空直接结束
        if (Objects.nonNull(this.useCache)) {
            return;
        }
        synchronized (MemoryCache.class) {
            useCache = CacheBuilder.newBuilder()
                    //设置并发级别为10
                    .concurrencyLevel(10)
                    //设置写缓存后30分钟过期
                    .expireAfterWrite(30, TimeUnit.MINUTES)
//                    //设置写缓存后30分钟刷新
//                    .refreshAfterWrite(30, TimeUnit.MINUTES)
                    //设置缓存容器的初始容量为5
                    .initialCapacity(5)
                    //设置缓存最大容量为500,超过后会按照LRU算法来移除缓存项
                    .maximumSize(500)
                    //设置要统计缓存的命中率
                    .recordStats()
                    //设置缓存的移除通知
                    .removalListener((n) -> LOG.info("key:{} expire, execute remove, caught error:{}",
                            n.getKey(), n.getCause()))
                    // 缓存不存在时通过CacheLoader的实现自动加载缓存
                    .build(
                            new CacheLoader<String, Data>() {
                                @Override
                                public Data load(String key) {
                                    return service.service(key);
                                }
                            }
                    );
        }

    }


}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Guava Cache高级特性
缓存回收:LRU,定时(expireAfterAccess,expireAfterWrite),软弱引用,显示删除(Cache接口方法invalidate,invalidateAll)
黑洞代码
2021/07/14
7700
Guava Cache高级特性
Guava 内存缓存的使用
expireAfterWrite 为了避免缓存雪崩,guava 会限制只有一个加载操作时进行加锁,其他请求必须阻塞等待这个加载操作完成。而且,在加载完成之后,其他请求的线程会逐一获得锁,去判断是否已被加载完成,每个线程必须轮流地走一个“获得锁,获得值,释放锁”的过程,这样性能会有一些损耗。
JMCui
2021/08/18
2.8K0
Guava 内存缓存的使用
Java内存缓存-通过Google Guava创建缓存
Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。
小码农薛尧
2019/08/27
2.9K0
Java内存缓存-通过Google Guava创建缓存
GuavaCache 简单入门
缓存在各种用例中非常有用。尤其是当计算或者检索的代价很高,而需要多次在输入上检索这个值得时候,应该使用缓存。
2019/01/28
1.8K0
Caffeine Cache 进程缓存之王
互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。
Bug开发工程师
2019/07/13
4.1K0
3. java缓存-线程内缓存guava cache
根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是LocalLoadingCache extends LocalManualCache implements LoadingCache<K,V>接口。 LocalManualCache和LocalLoadingCache两者都是对LoaclCache的包装,而LocalCache就是一个缓存的存储器,通过继承AbstractMap和实现ConcurrentMap接口,实现了支持并发的本地map(可以看成类似的ConcunrrentHashMap),LocalCache不对外暴露,因此只能通过其他方式提供实例,这就是CacheBuilder,以后建议大家也可以通过Builder的形式对外暴露实例。
全栈程序员站长
2022/11/09
9240
3. java缓存-线程内缓存guava cache
Google Guava Cache 使用
缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。
MickyInvQ
2020/09/27
1.3K0
Caffeine Cache 进程缓存之王
互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。
三哥
2019/11/14
1.6K0
Caffeine Cache 进程缓存之王
Guava学习:Cache缓存
摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。 一、什么是缓存? 根据科普中国的定义,缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
用户5325874
2020/01/16
1.1K0
[Google Guava]-缓存清除
显式清除 任何时候,你都可以显式地清除缓存项,而不是等到它被回收: 个别清除:Cache.invalidate(key) 批量清除:Cache.invalidateAll(keys) 清除所有缓存项:Cache.invalidateAll() 移除监听器 通过CacheBuilder.removalListener(RemovalListener),你可以声明一个监听器,以便缓存项被移除时做一些额外操作。缓存项被移除时, RemovalListener会获取移除通知[RemovalNotification],其中包含移除原因[RemovalCause]、键和值。
用户5166556
2019/04/16
6.1K0
本地缓存组件 Guava cache 详解
缓存分为本地缓存和远端缓存。常见的远端缓存有Redis,MongoDB;本地缓存一般使用map的方式保存在本地内存中。一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。如果访问量大,我们还得兼顾本地缓存的线程安全问题。必要的时候也要考虑缓存的回收策略。
BUG弄潮儿
2021/10/08
2.7K1
本地缓存组件 Guava cache 详解
Guava CacheBuilder使用说明 原
CacheBuilder是Guava用于创建LoadingCache、Cache实例的构建类。可以使用下面的方法来创建一个Cache实例。
随风溜达的向日葵
2018/08/15
2.4K0
谷歌Guava LoadingCache介绍
  在工作中,加Cache是非常常见的一种性能优化手段,操作系统底层、计算机硬件层为了性能优化加了各种各样的Cache,当然大多数都是对应用层透明的。但如果你想在应用层加Cache的话,可能就需要你自己实现了。
xindoo
2024/08/07
1730
047. 谷歌 Guava 缓存
1. Guava Cache 介绍 ---- Guava Cache 是 google guava 中的一个内存缓存模块,用于将数据缓存到 JVM 内存中。 使用场景 愿意消耗一些内存空间来提升速度。 预料到某些键会被查询一次以上。 缓存中存放的数据总量不会超出内存容量。 Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。 2. 工具简单使用 ---- 1. pom.xml 文件中添加依赖 <dependency> <groupId>com.google.
山海散人
2021/03/03
3680
Java本地内存LoadingCache介绍
最简单的设计就是一个大的HashMap,这样在多线程写的时候会有问题,当然也可以用并发场景下高性能的ConcurrencyHashMap;当然还可以自己设计底层的存储结构;
心平气和
2022/03/29
2.4K0
Java本地内存LoadingCache介绍
guava cache 用法详解
在计算机领域的各个场景中,缓存都是一个非常常用的技术手段。通过高性能的缓存暂时存储重要的数据,可以有效提升整个系统的性能。
用户3147702
2022/06/27
1.3K0
guava cache的一些使用经验
它本身继承自AbstractMap,实现了ConcurrentMap。是根据jdk1.7中的ConcurrentHashMap中的分段锁的原理来实现的,构造方法为:
山行AI
2019/07/12
4.9K0
guava cache的一些使用经验
Spring Boot 集成 本地缓存Guava框架
本地缓存一般位于应用服务器的部署机器上,使用应用服务器本身的少量内存。它是应用层获取数据的第一道缓存,应用层获取数据时先访问本地缓存,如果未命中,再通过远程从 L1 缓存层获取,最终获取到的数据再预热到本地缓存中。
微观技术
2021/04/19
1.5K0
Spring Boot 集成 本地缓存Guava框架
重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来
不知不觉,这已经是《深入理解缓存原理与实战设计》系列专栏的第6篇文章了。经过前面5篇文章的铺垫,我们系统且全面的介绍了缓存相关的概念与典型问题,也手动实操了如何构建一个本地最简版本的通用缓存框架,还对JAVA主流的本地缓存规范进行了解读。
是Vzn呀
2022/11/26
2.3K0
Redis+Caffeine构建高性能二级缓存
在现代分布式系统设计中,缓存是优化服务性能的核心组件。标准实现方案采用远程缓存(如Redis/Memcached)作为数据库前置层,通过以下机制提升性能:
摘星.
2025/05/20
1610
Redis+Caffeine构建高性能二级缓存
相关推荐
Guava Cache高级特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验