Guava

万字详解本地缓存之王 Caffeine

和自甴很熟 提交于 2021-02-18 01:40:39
点击上方 Java后端 , 选择 设为星标 优质文章,及时送达 Alben|https://albenw.github.io/posts/a4ae1aa2/ 排版公众号:JavaGuide 概要 Caffeine [1] 是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版,有些文章把 Caffeine 称为“新一代的缓存”、“现代缓存之王”。 本文将重点讲解 Caffeine 的高性能设计,以及对应部分的源码分析。 与 Guava Cache 比较 如果你对 Guava Cache 还不理解的话,可以点击 这里 [2] 来看一下我之前写过关于 Guava Cache 的文章。 大家都知道,Spring5 即将放弃掉 Guava Cache 作为缓存机制,而改用 Caffeine 作为新的本地 Cache 的组件,这对于 Caffeine 来说是一个很大的肯定。为什么 Spring 会这样做呢?其实在 Caffeine 的 Benchmarks [3] 里给出了好靓仔的数据,对读和写的场景,还有跟其他几个缓存工具进行了比较,Caffeine 的性能都表现很突出。 使用 Caffeine Caffeine 为了方便大家使用以及从 Guava Cache 切换过来(很有针对性啊~),借鉴了 Guava Cache

guava、caffeine、ohc(堆外缓存)详解

笑着哭i 提交于 2021-02-18 01:25:19
一、Guava缓存 Guava Cache适用于以下场景: 你愿意消耗一些内存空间来提升速度。 你预料到某些键会被查询一次以上。 缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果这不符合你的需求,请尝试Redis这类工具) 仓库坐标如下: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> 代码详细示例: @Data public class CacheVO { private String name; public CacheVO(String name) { this.name = name; } } public class GuavaCacheMangerService { private static LoadingCache<String, CacheVO> cache; private static ExecutorService executorService = new ThreadPoolExecutor(8, 8, 8, TimeUnit.SECONDS, new

Compare maps ignoring given fields

倖福魔咒の 提交于 2021-02-17 06:22:28
问题 I feel like I'm missing something obvious here, but the documentation is letting me down. I'm attempting to compare two maps while ignoring a set of fields in assertJ. I would like to see this assert pass: private static final String[] IGNORED_FIELDS = { "ignored", "another" }; private static final Map<String, Object> TEST_PAYLOAD = ImmutableMap.of("test", "payload", "example", "value", "ignored", "field"); private static final Map<String, Object> COMPARISON_PAYLOAD = ImmutableMap.of("test",

How do I get each of the entries from Guava MultiMap and their corresponding values associated with it?

只愿长相守 提交于 2021-02-17 06:02:38
问题 I am reading from a huge csv file which contains duplicate entries. I was able to read the whole csv file into a Multimap . I am also able to obtain the keyset with duplicate values and write them to a file. I want to get the value associated with each of the keys and write it to a file but unable to do so. I cant seem to find any of the options that might help me. I tried using entries() method which according to the doc Returns a view collection of all key-value pairs contained in this

GuaVa缓存应用

只谈情不闲聊 提交于 2021-02-16 13:02:01
LoadingCache<String, List<Order>> cacheOrders = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES)//表示在写入内存1分钟后该数据过期 .expireAfterAccess(1, TimeUnit.MINUTES)//表示如果1分钟之内没有使用该缓存则数据过期 每调用一次缓存有效时间都刷新为一分钟 .refreshAfterWrite(1, TimeUnit. MINUTES)//只阻塞当前数据加载线程,其他线程返回旧值 . concurrencyLevel ( 8 )// 设置并发级别为8,并发级别是指可以同时写缓存的线程数 .maximumSize(100)//设置最大缓存数 超过限制采用最少使用淘汰机制 .build(new CacheLoader<String, List<Order>>() { /** 当本地缓存命没有中时,调用load方法获取结果并将结果缓存 */ @Override public List<Order> load(String key) { return getOrders(); } // 此时一般我们会进行相关处理,如到数据库去查询 private List<Order> getOrders() { List<Order>

GUAVA--缓存(概述)

孤街浪徒 提交于 2021-02-16 12:23:50
1、适用性 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取 值的时候,就应当考虑使用缓存。 Guava Cache 与 ConcurrentMap 很相似,但也不完全一样。最基本的区别是 ConcurrentMap 会一直保存所 有添加的元素,直到显式地移除。相对地,Guava Cache 为了限制内存占用,通常都设定为自动回收元素。在 某些场景下,尽管 LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。 通常来说,Guava Cache 适用于: 你愿意消耗一些内存空间来提升速度。 你预料到某些键会被查询一次以上。 缓存中存放的数据总量不会超出内存容量。(Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果这不符合你的需求,请尝试 Memcached 这类工具) 如果你的场景符合上述的每一条,Guava Cache 就适合你。 如同范例代码展示的一样,Cache 实例通过 CacheBuilder 生成器模式获取,但是自定义你的缓存才是最有趣的部分。 注:如果你不需要 Cache 中的特性,使用 ConcurrentHashMap 有更好的内存效率——但 Cache 的大多数特性都很难基于旧有的 ConcurrentMap 复制,甚至根本不可能做到。 2、加载

Java内存缓存-通过Google Guava创建缓存

浪子不回头ぞ 提交于 2021-02-16 12:04:23
谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。 Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果不符合需求,可以选择Memcached、Redis等工具。 小案例 >pom.xml添加guava依赖 <!--?xml version="1.0" encoding="UTF-8"?--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>me.xueyao.cache</groupid> <artifactid>java-demo</artifactid> <version>1.0.0</version> <dependencies> <dependency>

牛逼,手撸一个SpringBoot缓存系统!

人盡茶涼 提交于 2021-02-15 00:56:14
缓存是最直接有效提升系统性能的手段之一。个人认为用好用对缓存是优秀程序员的必备基本素质。 本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统。 一、通用缓存接口 1、缓存基础算法 FIFO(First In First Out) ,先进先出,和OS里的FIFO思路相同,如果一个数据最先进入缓存中,当缓存满的时候,应当把最先进入缓存的数据给移除掉。 LFU(Least Frequently Used) ,最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。 LRU(Least Recently Used) ,最近最少使用,如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据移除。 2、接口定义 简单定义缓存接口,大致可以抽象如下: package com.power.demo.cache.contract; import java.util.function. Function ; /** * 缓存提供者接口 **/ public interface CacheProviderService { /** * 查询缓存 * * @param key 缓存键 不可为空 **/ <T extends Object > T get

Java本地缓存解决方案其一(使用Google的CacheBuilder)

心已入冬 提交于 2021-02-14 12:03:14
前不久,业务实现上需要用到本地缓存来解决一些数据量相对较小但是频繁访问的数据,通过查找各种资料,找到了一种可以实现的方案——采用的是Google的CacheBuilder。下面是代码实现过程: 1.首先在maven中引入下面的包; < dependency > < groupId >com.google.guava </ groupId > < artifactId >guava </ artifactId > < version >19.0 </ version > </ dependency > 2.下面这段是缓存代码,用到了匿名内部类的方式; package com.jd.common.util; import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class AndyService { private final LoadingCache<String, String> cache; public AndyService() { /** * 5秒自动过期 */ cache

秒杀系统后台实现详解

雨燕双飞 提交于 2021-02-13 16:39:13
秒杀后台实现 本文主要讲解项目实战中秒杀如何解决下面问题: 1)实现秒杀异步下单,掌握如何保证生产者&消费者消息不丢失 2)实现防止恶意刷单 3)实现防止相同商品重复秒杀 4)实现秒杀下单接口隐藏 5)实现下单接口限流 1 秒杀异步下单 用户在下单的时候,需要基于JWT令牌信息进行登陆人信息认证,确定当前订单是属于谁的。 针对秒杀的特殊业务场景,仅仅依靠对象缓存或者页面静态化等技术去解决服务端压力还是远远不够。 对于数据库压力还是很大,所以需要异步下单,异步是最好的解决办法,但会带来一些额外的程序上的 复杂性。 1.1 秒杀服务-下单实现 1)将tokenDecode工具类config放入秒杀服务并声明Bean public static void main(String[] args){ SpringApplication.run(SeckillApplication,class,args); } @Bean public TokenDecode tokenDecode(){ return new TokenDecode(); } 2)更新秒杀服务启动类,添加redis配置 /** * 设置 redisTemplate 的序列化设置 * @param redisConnectionFactory * @return */ @Bean public RedisTemplate