三、Guava的缓存

Guava Cache不同于ConcurrentMap,它自动回收元素以限制内存占用。适用于速度提升和有限缓存需求的场景。创建方式包括cacheLoader和callable callback。缓存回收策略包括基于容量、定时和引用回收。Guava Cache提供了统计、asMap视图和中断等其他特性,适合关注性能和内存管理的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和ConcurrentMap的区别

Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。

通常来说,Guava Cache适用于:

  1. 你愿意消耗一些内存空间来提升速度。
  2. 你预料到某些键会被查询一次以上。
  3. 缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果这不符合你的需求,请尝试Memcached这类工具)

Guava Cache有两种创建方式:


  1. cacheLoader
  2. callable callback

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

cacheLoader方式实现实例:

   public static LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {

        @Override
        public String load(String key) throws Exception {
            return key + "@";
        }
    });

    @Test
    public void put() throws ExecutionException {
        loadingCache.put("aaa","bbb");
        String aaa = loadingCache.get("aaa");//bbb
        String ccc = loadingCache.get("CCC");//CCC@
    }

注:如果你不需要Cache中的特性,使用ConcurrentHashMap有更好的内存效率——但Cache的大多数特性都很难基于旧有的ConcurrentMap复制,甚至根本不可能做到。

callable callback的实现:

package cache;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.junit.Test;

import java.util.concurrent.ExecutionException;

/**
 * Created by LF on 2017/4/26.
 */
public class MyCallable {
   
    private static Cache<String, String> cache = CacheBuilder.newBuilde
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值