溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java內(nèi)存緩存-通過Google Guava創(chuàng)建緩存

發(fā)布時間:2020-07-28 13:24:07 來源:網(wǎng)絡 閱讀:630 作者:流體石頭 欄目:編程語言

谷歌Guava緩存

Guava介紹

Guava是Google guava中的一個內(nèi)存緩存模塊,用于將數(shù)據(jù)緩存到JVM內(nèi)存中。實際項目開發(fā)中經(jīng)常將一些公共或者常用的數(shù)據(jù)緩存起來方便快速訪問。

Java內(nèi)存緩存-通過Google Guava創(chuàng)建緩存

Guava Cache是單個應用運行時的本地緩存。它不把數(shù)據(jù)存放到文件或外部服務器。如果不符合需求,可以選擇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>
            <groupId>javax.cache</groupId>
            <artifactId>cache-api</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0.1-jre</version>
        </dependency>
    </dependencies>
</project>

GuavaCacheDemo.java 代碼如下:

package me.xueyao.cache.java.guava;

import com.google.common.cache.*;
import me.xueyao.cache.java.pojo.User;

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

/**
 * @author simon
 * https://github.com/google/guava
 */
public class GuavaCacheDemo {
    public static void main(String[] args) throws ExecutionException {
        //緩存接口這里是LoadingCache,LoadingCache在緩存項不存在時可以自動加載緩存
        LoadingCache<String, User> userCache
                //CacheBuilder的構造函數(shù)是私有的,只能通過其靜態(tài)方法newBuilder()來獲得CacheBuilder的實例
                = CacheBuilder.newBuilder()
                //設置并發(fā)級別為8,并發(fā)級別是指可以同時寫緩存的線程數(shù)
                .concurrencyLevel(8)
                //設置寫緩存后8秒鐘過期
                .expireAfterWrite(8, TimeUnit.SECONDS)
                //設置寫緩存后1秒鐘刷新
                .refreshAfterWrite(1, TimeUnit.SECONDS)
                //設置緩存容器的初始容量為5
                .initialCapacity(5)
                //設置緩存最大容量為100,超過100之后就會按照LRU最近雖少使用算法來移除緩存項
                .maximumSize(100)
                //設置要統(tǒng)計緩存的命中率
                .recordStats()
                //設置緩存的移除通知
                .removalListener(new RemovalListener<Object, Object>() {
                    @Override
                    public void onRemoval(RemovalNotification<Object, Object> notification) {
                        System.out.println(notification.getKey() + " 被移除了,原因: " + notification.getCause());
                    }
                })
                //build方法中可以指定CacheLoader,在緩存不存在時通過CacheLoader的實現(xiàn)自動加載緩存
                .build(
                        new CacheLoader<String, User>() {
                            @Override
                            public User load(String key) throws Exception {
                                System.out.println("緩存沒有時,從數(shù)據(jù)庫加載" + key);
                                return new User("tony" + key, key);
                            }
                        }
                );

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

        // 第二次讀取
        for (int i = 0; i < 10; i++) {
            User user = userCache.get("uid" + i);
            System.out.println(user);
        }
        System.out.println("cache stats:");
        //最后打印緩存的命中率等 情況
        System.out.println(userCache.stats().toString());
    }
}

User.java 代碼如下:


package me.xueyao.cache.java.pojo;

import java.io.Serializable;

/**

  • @author simon
    */
    public class User implements Serializable {
    private String userName;
    private String userId;

    public User(String userName, String userId) {
    this.userName = userName;
    this.userId = userId;
    }

    public String getUserId() {
    return userId;
    }

    public void setUserId(String userId) {
    this.userId = userId;
    }

    public String getUserName() {
    return userName;
    }

    @Override
    public String toString() {
    return userId + " --- " + userName;
    }
    }

運行后的結果如下:

Java內(nèi)存緩存-通過Google Guava創(chuàng)建緩存

第一次循環(huán)時緩存中沒有數(shù)據(jù),構建了緩存,第二次直接命中緩存。如果程序需要單機內(nèi)存緩存,可以用該方式構建緩存。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI