记录guava 缓存的使用案例

本文介绍了Guava缓存的使用案例,包括设置并发级别、过期时间、刷新时间、初始容量、最大容量等参数。在缓存项不存在时,Guava能自动从数据库加载数据。当达到指定的过期时间,缓存会自动过期并触发重新加载,实现了内存缓存的高效管理。
摘要由CSDN通过智能技术生成

记录guava 缓存的使用案例

看了源码实现,发现有4-5千行代码,就没有去好好看了,直接上案例

import com.google.common.cache.*;
import com.study.cache.java.pojo.User;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

// https://github.com/google/guava
public class GuavaCacheDemo {
	
	
    public static void main(String[] args) throws ExecutionException {
        //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存
        LoadingCache<String, User> userCache
                //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例
                = CacheBuilder.newBuilder()
                //设置并发级别为8,并发级别是指可以同时写缓存的线程数
                .concurrencyLevel(8)
                //设置写缓存后8秒钟过期
                .expireAfterWrite(1, TimeUnit.SECONDS)
                //设置写缓存后1秒钟刷新
                .refreshAfterWrite(1, TimeUnit.SECONDS)
                //设置缓存容器的初始容量为10
                .initialCapacity(10)
                //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
                .maximumSize(100)
                //设置要统计缓存的命中率
                .recordStats()
                //设置缓存的移除通知
                .removalListener(new RemovalListener<Object, Object>() {
                    @Override
                    public void onRemoval(RemovalNotification<Object, Object> notification) {
                        System.out.println(notification.getKey() + " 被移除了,原因: " + notification.getCause());
                    }
                })
                //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
                .build(
                        new CacheLoader<String, User>() {
                            @Override
                            public User load(String key) throws Exception {
                                System.out.println("缓存没有时,从数据库加载" + key);
                                // TODO jdbc的代码~~忽略掉
                                return new User("cache" + key, key);
                            }
                        }
                );

        // 第一次读取
        for (int i = 0; i < 20; i++) {
            User user = userCache.get("uid" + i);
            System.out.println(user);
        }

        System.out.println("第一次读取完成------------------------------");

        // 第二次读取
        for (int i = 0; i < 20; i++) {
            User user = userCache.get("uid" + i);
            System.out.println(user);
        }
        System.out.println("第二次读取完成------------------------------");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 20; i++) {
            User user = userCache.get("uid" + i);
            System.out.println(user);
        }
        System.out.println("cache stats:");
        //最后打印缓存的命中率等 情况
        System.out.println(userCache.stats().toString());
    }
}

执行结果如下:

"D:\Program Files\Java\jdk-9.0.4\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.2.3\lib\idea_rt.jar=65114:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.2.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\动脑学院\高并发分布式2\36-高并发缓存( 从Redis入门到写出高性能缓存组件)-20190702-hash\课件\java-demo\target\classes;C:\Users\DELL\.m2\repository\javax\cache\cache-api\1.1.0\cache-api-1.1.0.jar;C:\Users\DELL\.m2\repository\com\google\guava\guava\27.0.1-jre\guava-27.0.1-jre.jar;C:\Users\DELL\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\DELL\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\DELL\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\DELL\.m2\repository\org\checkerframework\checker-qual\2.5.2\checker-qual-2.5.2.jar;C:\Users\DELL\.m2\repository\com\google\errorprone\error_prone_annotations\2.2.0\error_prone_annotations-2.2.0.jar;C:\Users\DELL\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\DELL\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.17\animal-sniffer-annotations-1.17.jar" com.study.cache.java.guava.GuavaCacheDemo
缓存没有时,从数据库加载uid0
User [userName=cacheuid0, userId=uid0]
缓存没有时,从数据库加载uid1
User [userName=cacheuid1, userId=uid1]
缓存没有时,从数据库加载uid2
User [userName=cacheuid2, userId=uid2]
缓存没有时,从数据库加载uid3
User [userName=cacheuid3, userId=uid3]
缓存没有时,从数据库加载uid4
User [userName=cacheuid4, userId=uid4]
第一次读取完成------------------------------
User [userName=cacheuid0, userId=uid0]
User [userName=cacheuid1, userId=uid1]
User [userName=cacheuid2, userId=uid2]
User [userName=cacheuid3, userId=uid3]
User [userName=cacheuid4, userId=uid4]
第二次读取完成------------------------------
uid0 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid0
User [userName=cacheuid0, userId=uid0]
uid1 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid1
User [userName=cacheuid1, userId=uid1]
uid2 被移除了,原因: EXPIRED
uid3 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid2
User [userName=cacheuid2, userId=uid2]
缓存没有时,从数据库加载uid3
User [userName=cacheuid3, userId=uid3]
uid4 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid4
User [userName=cacheuid4, userId=uid4]
cache stats:
CacheStats{hitCount=5, missCount=10, loadSuccessCount=10, loadExceptionCount=0, totalLoadTime=2519100, evictionCount=5}

Process finished with exit code 0

这个guava的缓存,是基于内存的缓存,可以通过创建时指定过期时间,刷新时间,这样,在key到达指定的过期时间后会自动过期,并且在指定的刷新时间到达时,自动去刷新数据,使用时直接使用key去获取对象,如果对象不存在,则会自动去执行build里面的接口实现load方法,从数据库重新加载数据到缓存

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值