女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

本地緩存的技術(shù)實(shí)踐

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-30 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、摘要

說(shuō)到緩存,面試官基本上會(huì)繞不開(kāi)以下幾個(gè)話(huà)題!

項(xiàng)目中哪些地方用到了緩存?為什么要使用緩存?怎么使用它的?引入緩存后會(huì)帶來(lái)哪些問(wèn)題?

這些問(wèn)題,基本上是互聯(lián)網(wǎng)公司面試時(shí)必問(wèn)的一些問(wèn)題,如果面試的時(shí)候,連緩存都不清楚,那確實(shí)多少顯的有些尷尬!

項(xiàng)目里面為什么要引入緩存?這個(gè)問(wèn)題還得結(jié)合項(xiàng)目中的業(yè)務(wù)來(lái)回答!

引入緩存,其實(shí)主要有兩個(gè)用途: 高性能高并發(fā)

假設(shè)某個(gè)操作非常頻繁,比如網(wǎng)站的商城首頁(yè),需要頻繁的從數(shù)據(jù)庫(kù)里面獲取商品數(shù)據(jù),可能從數(shù)據(jù)庫(kù)一頓各種亂七八糟的操作下來(lái),平均耗時(shí) 500 ms,隨著請(qǐng)求頻次越高,用戶(hù)等待數(shù)據(jù)的返回結(jié)果時(shí)間越來(lái)越長(zhǎng),體驗(yàn)越來(lái)越差。

如果此時(shí), 引入緩存 ,將數(shù)據(jù)庫(kù)里面查詢(xún)出來(lái)的商品數(shù)據(jù)信息,放入緩存服務(wù)里面,當(dāng)用戶(hù)再此發(fā)起查詢(xún)操作的時(shí)候,直接從緩存服務(wù)里面獲取,速度從耗時(shí) 500 ms,可能直接優(yōu)化成 5 ms,體驗(yàn)上瞬間會(huì)上升好幾個(gè)層次!

這就是引入緩存帶來(lái)的高性能體驗(yàn)結(jié)果

當(dāng)然,除此之外, 引入緩存之前 ,以 mysql 數(shù)據(jù)庫(kù)為例,單臺(tái)機(jī)器一秒內(nèi)的請(qǐng)求次數(shù)到達(dá) 2000 之后就會(huì)開(kāi)始報(bào)警; 引入緩存之后 ,比如以 redis 緩存服務(wù)器為例,單臺(tái)機(jī)器一秒內(nèi)的請(qǐng)求次數(shù)支持 110000 次,兩者支持的并發(fā)量完全不是一個(gè)數(shù)量級(jí)的。

這就是引入緩存帶來(lái)的高并發(fā)體驗(yàn)結(jié)果

尤其是對(duì)于流量很大的業(yè)務(wù),引入緩存,給系統(tǒng)帶來(lái)的提升是十分顯著的

可能有的同學(xué)又會(huì)發(fā)出疑問(wèn),緩存和數(shù)據(jù)庫(kù)為啥差距這么大,有啥區(qū)別?

我們都知道在計(jì)算機(jī)領(lǐng)域,數(shù)據(jù)的存儲(chǔ)主要有兩處: 一處是內(nèi)存,另一處是磁盤(pán)

在計(jì)算機(jī)中,內(nèi)存的數(shù)據(jù)讀寫(xiě)性能遠(yuǎn)超磁盤(pán)的讀寫(xiě)性能,盡管如此,其實(shí)兩者也有不同,如果數(shù)據(jù)存儲(chǔ)到內(nèi)存中,雖然讀寫(xiě)性能非常高,但是當(dāng)電腦重啟之后,數(shù)據(jù)會(huì)全部清除;而存入磁盤(pán)的數(shù)據(jù),雖然讀寫(xiě)性能很差,但是電腦重啟之后數(shù)據(jù)不會(huì)丟失。

因?yàn)閮烧叩臄?shù)據(jù)存儲(chǔ)方案不同,造就了不同的實(shí)踐用途

我們上面講到的緩存服務(wù),其實(shí)本質(zhì)就是將數(shù)據(jù)存儲(chǔ)到內(nèi)存中;而數(shù)據(jù)庫(kù)服務(wù),是將數(shù)據(jù)寫(xiě)入到磁盤(pán),從磁盤(pán)中讀取數(shù)據(jù)。

無(wú)論是哪種方案,沒(méi)有絕對(duì)的好與壞,主要還是取決于實(shí)際的業(yè)務(wù)用途。

在項(xiàng)目中如何引入緩存呢?我們通常的做法如下:

圖片

操作步驟:

  • 1.當(dāng)用戶(hù)發(fā)起訪(fǎng)問(wèn)某數(shù)據(jù)的操作時(shí),檢查緩存服務(wù)里面是否存在,如果存在,直接返回;如果不存在,走數(shù)據(jù)庫(kù)的查詢(xún)服務(wù)
  • 2.從數(shù)據(jù)庫(kù)里面獲取到有效數(shù)據(jù)之后,存入緩存服務(wù),并返回給用戶(hù)
  • 3.當(dāng)被訪(fǎng)問(wèn)的數(shù)據(jù)發(fā)生更新的時(shí)候,需要同時(shí)刪除緩存服務(wù),以便用戶(hù)再次查詢(xún)的時(shí)候,能獲取到最新的數(shù)據(jù)

當(dāng)然以上的緩存處理辦法,對(duì)于簡(jiǎn)單的需要緩存的業(yè)務(wù)場(chǎng)景,能輕松應(yīng)對(duì)。

但是面對(duì)復(fù)雜的業(yè)務(wù)場(chǎng)景和服務(wù)架構(gòu),尤其是對(duì)緩存要求比較高的業(yè)務(wù),引入緩存的方式,也會(huì)跟著一起變化!

從緩存面向的對(duì)象不同,緩存分為: 本地緩存分布式緩存多級(jí)緩存

所謂 本地緩存 ,相信大家都能理解,在單個(gè)計(jì)算機(jī)服務(wù)實(shí)例中,直接把數(shù)據(jù)緩存到內(nèi)存中進(jìn)行使用。

但是現(xiàn)在的服務(wù),大多都是以集群的方式來(lái)部署,你也可以這樣理解,同一個(gè)網(wǎng)站服務(wù),同時(shí)在兩臺(tái)計(jì)算機(jī)里面部署,比如你用到的session會(huì)話(huà),就無(wú)法同時(shí)共享,因此需要引入一個(gè)獨(dú)立的緩存服務(wù)來(lái)連接兩臺(tái)服務(wù)器,這個(gè)獨(dú)立部署的緩存服務(wù),我們把這種技術(shù)實(shí)踐方案稱(chēng)為 分布式緩存

在實(shí)際的業(yè)務(wù)中,本地緩存分布式緩存會(huì)同時(shí)結(jié)合進(jìn)行使用,當(dāng)收到訪(fǎng)問(wèn)某個(gè)數(shù)據(jù)的操作時(shí),會(huì)優(yōu)先從本地緩存服務(wù)(也叫一級(jí)緩存)查詢(xún),如果沒(méi)有,再?gòu)姆植际骄彺娣?wù)(也叫二級(jí)緩存)里面獲取,如果也沒(méi)有,最后再?gòu)臄?shù)據(jù)庫(kù)里面獲取;從數(shù)據(jù)庫(kù)查詢(xún)完成之后,在依次更新分布式緩存服務(wù)、本次緩存服務(wù),我們把這個(gè)技術(shù)實(shí)踐方案叫 多級(jí)緩存

由于篇幅的原因,我們?cè)诤笃诮o大家介紹 分布式緩存服務(wù)多級(jí)緩存服務(wù)

今天主要圍繞本地緩存服務(wù)的技術(shù)實(shí)現(xiàn),給大家進(jìn)行分享和介紹!

二、方案介紹

如果使用過(guò)緩存的同學(xué),可以很容易想到緩存需要哪些東西,通常我們?cè)谑褂镁彺娴臅r(shí)候,比較關(guān)注兩個(gè)地方,第一是內(nèi)存持久化,第二是支持緩存的數(shù)據(jù)自動(dòng)過(guò)期清楚。

基于以上的要求,我們向介紹以下幾種技術(shù)實(shí)現(xiàn)方案。

2.1、手寫(xiě)一個(gè)緩存服務(wù)

對(duì)于簡(jiǎn)單的數(shù)據(jù)緩存,我們完全可以自行編寫(xiě)一套緩存服務(wù),實(shí)現(xiàn)過(guò)程如下!

首先創(chuàng)建一個(gè)緩存實(shí)體類(lèi)

public class CacheEntity {

    /**
     * 緩存鍵
     */
    private String key;

    /**
     * 緩存值
     */
    private Object value;

    /**
     * 過(guò)期時(shí)間
     */
    private Long expireTime;

    //...set、get
}

接著,編寫(xiě)一個(gè)緩存操作工具類(lèi)CacheUtils

public class CacheUtils {

    /**
     * 緩存數(shù)據(jù)
     */
    private final static Map< String, CacheEntity > CACHE_MAP = new ConcurrentHashMap<  >();

    /**
     * 定時(shí)器線(xiàn)程池,用于清除過(guò)期緩存
     */
    private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();


    static {
        // 注冊(cè)一個(gè)定時(shí)線(xiàn)程任務(wù),服務(wù)啟動(dòng)1秒之后,每隔500毫秒執(zhí)行一次
        executor.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                // 清理過(guò)期緩存
                clearCache();
            }
        },1000,500,TimeUnit.MILLISECONDS);
    }

    /**
     * 添加緩存
     * @param key    緩存鍵
     * @param value  緩存值
     */
    public static void put(String key, Object value){
        put(key, value, 0);
    }


    /**
     * 添加緩存
     * @param key    緩存鍵
     * @param value  緩存值
     * @param expire 緩存時(shí)間,單位秒
     */
    public static void put(String key, Object value, long expire){
        CacheEntity cacheEntity = new CacheEntity()
                .setKey(key)
                .setValue(value);
        if(expire > 0){
            Long expireTime = System.currentTimeMillis() + Duration.ofSeconds(expire).toMillis();
            cacheEntity.setExpireTime(expireTime);
        }
        CACHE_MAP.put(key, cacheEntity);
    }


    /**
     * 獲取緩存
     * @param key
     * @return
     */
    public static Object get(String key){
        if(CACHE_MAP.containsKey(key)){
            return CACHE_MAP.get(key).getValue();
        }
        return null;
    }

    /**
     * 移除緩存
     * @param key
     */
    public static void remove(String key){
        if(CACHE_MAP.containsKey(key)){
            CACHE_MAP.remove(key);
        }
    }

    /**
     * 清理過(guò)期的緩存數(shù)據(jù)
     */
    private static void clearCache(){
        if(CACHE_MAP.size() > 0){
            return;
        }
        Iterator< Map.Entry< String, CacheEntity >> iterator = CACHE_MAP.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry< String, CacheEntity > entry = iterator.next();
            if(entry.getValue().getExpireTime() != null && entry.getValue().getExpireTime().longValue() > System.currentTimeMillis()){
                iterator.remove();
            }
        }
    }

}

最后,我們來(lái)測(cè)試一下緩存服務(wù)

// 寫(xiě)入緩存數(shù)據(jù)
CacheUtils.put("userName", "張三", 3);

// 讀取緩存數(shù)據(jù)
Object value1 = CacheUtils.get("userName");
System.out.println("第一次查詢(xún)結(jié)果:" + value1);

// 停頓4秒
Thread.sleep(4000);

// 讀取緩存數(shù)據(jù)
Object value2 = CacheUtils.get("userName");
System.out.println("第二次查詢(xún)結(jié)果:" + value2);

輸出結(jié)果,與預(yù)期一致!

第一次查詢(xún)結(jié)果:張三
第二次查詢(xún)結(jié)果:null

實(shí)現(xiàn)思路其實(shí)很簡(jiǎn)單,采用ConcurrentHashMap作為緩存數(shù)據(jù)存儲(chǔ)服務(wù),然后開(kāi)啟一個(gè)定時(shí)調(diào)度,每隔500毫秒檢查一下過(guò)期的緩存數(shù)據(jù),然后清除掉!

2.2、基于 Guava Cache 實(shí)現(xiàn)本地緩存

Guava 是 Google 團(tuán)隊(duì)開(kāi)源的一款 Java 核心增強(qiáng)庫(kù),包含集合、并發(fā)原語(yǔ)、緩存、IO、反射等工具箱,性能和穩(wěn)定性上都有保障,應(yīng)用十分廣泛。

相比自己編寫(xiě)的緩存服務(wù),Guava Cache 要強(qiáng)大的多,支持很多特性如下:

  • 支持最大容量限制
  • 支持兩種過(guò)期刪除策略(插入時(shí)間和讀取時(shí)間)
  • 支持簡(jiǎn)單的統(tǒng)計(jì)功能
  • 基于 LRU 算法實(shí)現(xiàn)

使用方面也很簡(jiǎn)單,首先引入guava庫(kù)包。

< !--guava-- >
< dependency >
    < groupId >com.google.guava< /groupId >
    < artifactId >guava< /artifactId >
    < version >31.1-jre< /version >
< /dependency >

案例代碼如下:

// 創(chuàng)建一個(gè)緩存實(shí)例
Cache< String, String > cache = CacheBuilder.newBuilder()
        // 初始容量
        .initialCapacity(5)
        // 最大緩存數(shù),超出淘汰
        .maximumSize(10)
        // 過(guò)期時(shí)間
        .expireAfterWrite(3, TimeUnit.SECONDS)
        .build();

// 寫(xiě)入緩存數(shù)據(jù)
cache.put("userName", "張三");

// 讀取緩存數(shù)據(jù)
String value1 = cache.get("userName", () - > {
    // 如果key不存在,會(huì)執(zhí)行回調(diào)方法
    return "key已過(guò)期";
});
System.out.println("第一次查詢(xún)結(jié)果:" + value1);

// 停頓4秒
Thread.sleep(4000);

// 讀取緩存數(shù)據(jù)
String value2 = cache.get("userName", () - > {
    // 如果key不存在,會(huì)執(zhí)行回調(diào)方法
    return "key已過(guò)期";
});
System.out.println("第二次查詢(xún)結(jié)果:" + value2);

輸出結(jié)果:

第一次查詢(xún)結(jié)果:張三
第二次查詢(xún)結(jié)果:key已過(guò)期

2.3、基于 Caffeine 實(shí)現(xiàn)本地緩存

Caffeine 是基于 java8 實(shí)現(xiàn)的新一代緩存工具,緩存性能接近理論最優(yōu),可以看作是 Guava Cache 的增強(qiáng)版,功能上兩者類(lèi)似,不同的是 Caffeine 采用了一種結(jié)合 LRU、LFU 優(yōu)點(diǎn)的算法:W-TinyLFU,在性能上有明顯的優(yōu)越性。

使用方面也很簡(jiǎn)單,首先引入caffeine庫(kù)包。

< !--caffeine-- >
< dependency >
    < groupId >com.github.ben-manes.caffeine< /groupId >
    < artifactId >caffeine< /artifactId >
    < version >2.9.3< /version >
< /dependency >

案例代碼如下:

// 創(chuàng)建一個(gè)緩存實(shí)例
Cache< String, String > cache = Caffeine.newBuilder()
        // 初始容量
        .initialCapacity(5)
        // 最大緩存數(shù),超出淘汰
        .maximumSize(10)
        // 設(shè)置緩存寫(xiě)入間隔多久過(guò)期
        .expireAfterWrite(3, TimeUnit.SECONDS)
        // 設(shè)置緩存最后訪(fǎng)問(wèn)后間隔多久淘汰,實(shí)際很少用到
        //.expireAfterAccess(3, TimeUnit.SECONDS)
        .build();

// 寫(xiě)入緩存數(shù)據(jù)
cache.put("userName", "張三");

// 讀取緩存數(shù)據(jù)
String value1 = cache.get("userName", (key) - > {
    // 如果key不存在,會(huì)執(zhí)行回調(diào)方法
    return "key已過(guò)期";
});
System.out.println("第一次查詢(xún)結(jié)果:" + value1);

// 停頓4秒
Thread.sleep(4000);

// 讀取緩存數(shù)據(jù)
String value2 = cache.get("userName", (key) - > {
    // 如果key不存在,會(huì)執(zhí)行回調(diào)方法
    return "key已過(guò)期";
});
System.out.println("第二次查詢(xún)結(jié)果:" + value2);

輸出結(jié)果:

第一次查詢(xún)結(jié)果:張三
第二次查詢(xún)結(jié)果:key已過(guò)期

2.4、基于 Encache 實(shí)現(xiàn)本地緩存

Encache 是一個(gè)純 Java 的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是 Hibernate 中默認(rèn)的 CacheProvider。

同 Caffeine 和 Guava Cache 相比,Encache 的功能更加豐富,擴(kuò)展性更強(qiáng),特性如下:

  • 支持多種緩存淘汰算法,包括 LRU、LFU 和 FIFO
  • 緩存支持堆內(nèi)存儲(chǔ)、堆外存儲(chǔ)、磁盤(pán)存儲(chǔ)(支持持久化)三種
  • 支持多種集群方案,解決數(shù)據(jù)共享問(wèn)題

使用方面也很簡(jiǎn)單,首先引入ehcache庫(kù)包。

< !--ehcache-- >
< dependency >
    < groupId >org.ehcache< /groupId >
    < artifactId >ehcache< /artifactId >
    < version >3.9.7< /version >
< /dependency >

案例代碼如下:

/**
 * 自定義過(guò)期策略實(shí)現(xiàn)
 */
public  class CustomExpiryPolicy< K, V > implements ExpiryPolicy< K, V > {

    private final Map< K, Duration > keyExpireMap = new ConcurrentHashMap();


    public Duration setExpire(K key, Duration duration) {
        return keyExpireMap.put(key, duration);
    }

    public Duration getExpireByKey(K key) {
        return Optional.ofNullable(keyExpireMap.get(key))
                .orElse(null);
    }

    public Duration removeExpire(K key) {
        return keyExpireMap.remove(key);
    }

    @Override
    public Duration getExpiryForCreation(K key, V value) {
        return Optional.ofNullable(getExpireByKey(key))
                .orElse(Duration.ofNanos(Long.MAX_VALUE));
    }

    @Override
    public Duration getExpiryForAccess(K key, Supplier< ? extends V > value) {
        return getExpireByKey(key);
    }

    @Override
    public Duration getExpiryForUpdate(K key, Supplier< ? extends V > oldValue, V newValue) {
        return getExpireByKey(key);
    }
}
public static void main(String[] args) throws InterruptedException {
    String userCache = "userCache";

    // 自定義過(guò)期策略
    CustomExpiryPolicy< Object, Object > customExpiryPolicy = new CustomExpiryPolicy<  >();

    // 聲明一個(gè)容量為20的堆內(nèi)緩存配置
    CacheConfigurationBuilder configurationBuilder = CacheConfigurationBuilder
            .newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(20))
            .withExpiry(customExpiryPolicy);

    // 初始化一個(gè)緩存管理器
    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            // 創(chuàng)建cache實(shí)例
            .withCache(userCache, configurationBuilder)
            .build(true);

    // 獲取cache實(shí)例
    Cache< String, String > cache = cacheManager.getCache(userCache, String.class, String.class);
    // 獲取過(guò)期策略
    CustomExpiryPolicy expiryPolicy = (CustomExpiryPolicy)cache.getRuntimeConfiguration().getExpiryPolicy();

    // 寫(xiě)入緩存數(shù)據(jù)
    cache.put("userName", "張三");
    // 設(shè)置3秒過(guò)期
    expiryPolicy.setExpire("userName", Duration.ofSeconds(3));

    // 讀取緩存數(shù)據(jù)
    String value1 = cache.get("userName");
    System.out.println("第一次查詢(xún)結(jié)果:" + value1);

    // 停頓4秒
    Thread.sleep(4000);

    // 讀取緩存數(shù)據(jù)
    String value2 = cache.get("userName");
    System.out.println("第二次查詢(xún)結(jié)果:" + value2);
}

輸出結(jié)果:

第一次查詢(xún)結(jié)果:張三
第二次查詢(xún)結(jié)果:null

三、小結(jié)

從易用性角度看:Guava Cache、Caffeine 和 Encache 都有十分成熟的接入方案,使用簡(jiǎn)單。

從功能性角度看:Guava Cache 和 Caffeine 功能類(lèi)似,都是只支持堆內(nèi)緩存,Encache 相比功能更為豐富,不僅支持堆內(nèi)緩存,還支持磁盤(pán)寫(xiě)入、集群實(shí)現(xiàn)。

從性能角度看:Caffeine 最優(yōu)、GuavaCache 次之,Encache 最差。

以下是網(wǎng)絡(luò)上三者性能對(duì)比的結(jié)果。

圖片

對(duì)于本地緩存的技術(shù)選型, 推薦采用 Caffeine ,性能上毫無(wú)疑問(wèn),遙遙領(lǐng)先。

雖然 Encache 功能非常的豐富,甚至提供了持久化和集群的功能,但是相比更成熟的分布式緩存中間件 redis 來(lái)說(shuō),還是稍遜一些!

關(guān)于 redis 的使用,有興趣的同學(xué)可以查看歷史文章,之前有寫(xiě)過(guò) redis 系列相關(guān)的技術(shù)實(shí)踐介紹。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91870
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9795

    瀏覽量

    87993
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75270
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    246

    瀏覽量

    27175
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    390

    瀏覽量

    25834
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    高并發(fā)系統(tǒng)中的緩存 緩存系統(tǒng)存在的三大問(wèn)題

    緩存在計(jì)算機(jī)系統(tǒng)是無(wú)處不在,在CPU層面有L1-L3的Cache,在Linux中有TLB加速虛擬地址和物理地址的轉(zhuǎn)換,在瀏覽器有本地緩存、手機(jī)有本地
    的頭像 發(fā)表于 07-15 11:03 ?4437次閱讀

    如何選擇合適的本地緩存

    小編最近在使用系統(tǒng)的時(shí)候,發(fā)現(xiàn)盡管應(yīng)用已經(jīng)使用了 redis 緩存提高查詢(xún)效率,但是仍然有進(jìn)一步優(yōu)化的空間,于是想到了比分布式緩存性能更好的本地緩存,因此對(duì)領(lǐng)域內(nèi)常用的
    的頭像 發(fā)表于 01-18 11:19 ?1137次閱讀
    如何選擇合適的<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>?

    基于javaPoet的緩存key優(yōu)化實(shí)踐

    數(shù)據(jù)庫(kù)中的熱數(shù)據(jù)緩存在redis/本地緩存中,代碼如下: ? @Cacheable(value = { "per" }, key="#person.getId
    的頭像 發(fā)表于 01-14 15:18 ?824次閱讀
    基于javaPoet的<b class='flag-5'>緩存</b>key優(yōu)化<b class='flag-5'>實(shí)踐</b>

    157.157、緩存 緩存使用 本地鎖在分布式下的問(wèn)題

    緩存
    充八萬(wàn)
    發(fā)布于 :2023年07月18日 04:44:59

    ASP緩存技術(shù)

    使用ASP中的緩存技術(shù)可以很大程度上提高你的網(wǎng)站性能,其實(shí)這些實(shí)現(xiàn)方法是非常的簡(jiǎn)單,它將說(shuō)明如何在服務(wù)器上的緩存是如何工作以及你如何使用一種被稱(chēng)為斷開(kāi)連接的ADO連接技術(shù)。在介紹這些
    發(fā)表于 11-21 10:53

    緩存的基本原理 緩存的分類(lèi)

    緩存的主要手段有:瀏覽器緩存、CDN、反向代理、本地緩存、分布式緩存、數(shù)據(jù)庫(kù)緩存
    發(fā)表于 06-13 12:04 ?5116次閱讀

    緩存技術(shù)的工作原理

    緩存系統(tǒng)有時(shí)也稱(chēng)為混合存儲(chǔ)網(wǎng)關(guān)設(shè)備,以強(qiáng)調(diào)其作為本地和云基礎(chǔ)架構(gòu)之間橋梁的作用。正如該Gartner定義所指出,與其他嵌入式緩存一樣,這些設(shè)備基于設(shè)備和應(yīng)用程序攔截文件、塊或?qū)ο蟠鎯?chǔ)I / O。
    的頭像 發(fā)表于 08-10 11:51 ?3225次閱讀

    ThingJS平臺(tái)推出3D場(chǎng)景本地緩存技術(shù)

    為提升用戶(hù)訪(fǎng)問(wèn)體驗(yàn),縮短項(xiàng)目加載時(shí)間,ThingJS平臺(tái)推出3D場(chǎng)景本地緩存技術(shù):IndexedDB,也稱(chēng)客戶(hù)端緩存持久化技術(shù)。通俗來(lái)說(shuō),I
    發(fā)表于 03-13 11:19 ?1964次閱讀

    關(guān)于瀏覽器緩存最詳細(xì)解析

    瀏覽器緩存即 http 緩存,將請(qǐng)求過(guò)的數(shù)據(jù)(html、css、js)存在瀏覽器(本地磁盤(pán))中,當(dāng)再次訪(fǎng)問(wèn)這些資源時(shí)可以從本地直接加載,減少服務(wù)端請(qǐng)求。
    的頭像 發(fā)表于 04-16 16:01 ?3005次閱讀

    聊聊本地緩存和分布式緩存

    本地緩存 :應(yīng)用中的緩存組件,緩存組件和應(yīng)用在同一進(jìn)程中,緩存的讀寫(xiě)非常快,沒(méi)有網(wǎng)絡(luò)開(kāi)銷(xiāo)。但各應(yīng)用或集群的各節(jié)點(diǎn)都需要維護(hù)自己的單獨(dú)
    發(fā)表于 06-11 15:12 ?1068次閱讀
    聊聊<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>和分布式<b class='flag-5'>緩存</b>

    如何在 Linux 上查看本地 DNS 緩存

    ? 刷新本地 DNS 緩存可以解決 HTTP 錯(cuò)誤并保護(hù)您免受 DNS 欺騙。以下是在 Linux 上執(zhí)行此操作的方法。 當(dāng)您使用域名訪(fǎng)問(wèn)網(wǎng)站時(shí),您的系統(tǒng)會(huì)向 DNS 服務(wù)器發(fā)送請(qǐng)求以獲取該域
    的頭像 發(fā)表于 06-26 10:52 ?3797次閱讀
    如何在 Linux 上查看<b class='flag-5'>本地</b> DNS <b class='flag-5'>緩存</b>

    Ehcache!這才是Java本地緩存之王!

    就Java而言,其常用的緩存解決方案有很多,例如數(shù)據(jù)庫(kù)緩存框架EhCache,分布式緩存Memcached等,這些緩存方案實(shí)際上都是為了提升吞吐效率,避免持久層壓力過(guò)大。
    的頭像 發(fā)表于 07-29 11:21 ?2366次閱讀
    Ehcache!這才是Java<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>之王!

    緩存之美——如何選擇合適的本地緩存

    Guava cache是Google開(kāi)發(fā)的Guava工具包中一套完善的JVM本地緩存框架,底層實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類(lèi)似于ConcurrentHashMap,但是進(jìn)行了更多的能力拓展,包括緩存過(guò)期時(shí)間設(shè)置、
    的頭像 發(fā)表于 11-17 14:24 ?818次閱讀
    <b class='flag-5'>緩存</b>之美——如何選擇合適的<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>?

    HTTP緩存頭的使用 本地緩存與遠(yuǎn)程緩存的區(qū)別

    HTTP緩存頭是一組HTTP響應(yīng)頭,它們控制瀏覽器和中間代理服務(wù)器如何緩存網(wǎng)頁(yè)內(nèi)容。合理使用HTTP緩存頭可以顯著提高網(wǎng)站的加載速度和性能,減少服務(wù)器的負(fù)載。 1. HTTP緩存頭概述
    的頭像 發(fā)表于 12-18 09:41 ?471次閱讀

    nginx中強(qiáng)緩存和協(xié)商緩存介紹

    強(qiáng)緩存直接告訴瀏覽器:在緩存過(guò)期前,無(wú)需與服務(wù)器通信,直接使用本地緩存
    的頭像 發(fā)表于 04-01 16:01 ?379次閱讀