亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Redis怎么實現多級緩存

發布時間:2022-07-29 09:54:01 來源:億速云 閱讀:411 作者:iii 欄目:開發技術

這篇文章主要介紹“Redis怎么實現多級緩存”,在日常操作中,相信很多人在Redis怎么實現多級緩存問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis怎么實現多級緩存”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、多級緩存

1. 傳統緩存方案

請求到達tomcat后,先去redis中獲取緩存,不命中則去mysql中獲取

Redis怎么實現多級緩存

2. 多級緩存方案

  • tomcat的請求并發數,是遠小于redis的,因此tomcat會成為瓶頸

  • 利用請求處理每個環節,分別添加緩存,減輕tomcat壓力,提升服務性能

Redis怎么實現多級緩存

二、JVM本地緩存

緩存是存儲在內存中,數據讀取速度較快,能大量減少對數據庫的訪問,減少數據庫壓力

分布式緩存,如redis
 - 優點: 存儲容量大,可靠性好,可以在集群中共享
 - 缺點: 訪問緩存有網絡開銷
 - 場景: 緩存數據量大,可靠性高,需要在集群中共享的數據

進程本地緩存, 如HashMap, GuavaCache
- 優點:讀取本地內存,沒有網絡開銷,速度更快
- 缺點:存儲容量有限,可靠性低(如重啟后丟失),無法在集群中共享
- 場景:性能要求高,緩存數據量少

1. 實用案例

Caffeine是一個基于java8開發的,提供了近乎最佳命中率的高性能的本地緩存庫
目前spring內部的緩存用的就是這個

<dependency>
     <groupId>com.github.ben-manes.caffeine</groupId>
     <artifactId>caffeine</artifactId>
     <version>3.0.5</version>
 </dependency>
package com.erick.cache;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.time.Duration;

public final class CacheUtil {
    private static int expireSeconds = 2;
    public static Cache<String, String> cacheWithExpireSeconds;

    private static int maxPairs = 1;
    public static Cache<String, String> cacheWithMaxPairs;

    static {
        /*過期策略,寫完60s后過期*/
        cacheWithExpireSeconds = Caffeine.newBuilder()
                .expireAfterWrite(Duration.ofSeconds(expireSeconds))
                .build();

        /*過期策略,達到最大值后刪除
         * 1. 并不會立即刪除,等一會兒才會刪除
         * 2. 會將之前存儲的數據刪除掉*/
        cacheWithMaxPairs = Caffeine.newBuilder()
                .maximumSize(maxPairs)
                .build();
    }

    /*從緩存中獲取數據
     * 1. 如果緩存中有,則直接從緩存中返回
     * 2. 如果緩存中沒有,則去數據查詢并返回結果*/
    public static String getKeyWithExpire(String key) {
        return cacheWithExpireSeconds.get(key, value -> {
            return getResultFromDB();
        });
    }

    public static String getKeyWithMaxPair(String key) {
        return cacheWithMaxPairs.get(key, value -> {
            return getResultFromDB();
        });
    }

    private static String getResultFromDB() {
        System.out.println("數據庫查詢");
        return "db result";
    }
}
package com.erick.cache;

import java.util.concurrent.TimeUnit;

public class Test {

    @org.junit.Test
    public void test01() throws InterruptedException {
        CacheUtil.cacheWithExpireSeconds.put("name", "erick");
        System.out.println(CacheUtil.getKeyWithExpire("name"));
        TimeUnit.SECONDS.sleep(3);
        System.out.println(CacheUtil.getKeyWithExpire("name"));
    }

    @org.junit.Test
    public void test02() throws InterruptedException {
        CacheUtil.cacheWithMaxPairs.put("name", "erick");
        CacheUtil.cacheWithMaxPairs.put("age", "12");

        System.out.println(CacheUtil.getKeyWithMaxPair("name"));
        System.out.println(CacheUtil.getKeyWithMaxPair("age"));

        TimeUnit.SECONDS.sleep(2);

        System.out.println(CacheUtil.getKeyWithMaxPair("name")); // 查詢不到了
        System.out.println(CacheUtil.getKeyWithMaxPair("age"));
    }
}

三、緩存一致性

1. 常見方案

1.1 設置有效期

  • 給緩存設置有效期,到期后自動刪除。再次查詢時可以更新

  • 優勢:簡單,方便

  • 缺點:時效性差,緩存過期之前可能不一致

  • 場景:更新頻率低,時效性要求比較低的業務

1.2 同步雙寫

  • 在修改數據庫的同時,直接修改緩存

  • 優勢:有代碼侵入,緩存與數據庫強一致性

  • 缺點:代碼進入,耦合性高

  • 場景:對一致性,失效性要求較高的緩存數據

1.3 異步通知

  • 修改數據庫時發送事件通知,相關服務監聽到后修改緩存數據

  • 優勢:低耦合,可以同時通知多個緩存服務

  • 缺點:時效性一把,可能存在緩存不一致問題

  • 場景:時效性一般,有多個服務需要同步

Redis怎么實現多級緩存

2. 基于Canal的異步通知

  • 是阿里旗下的一款開源項目,基于java開發

  • 基于數據庫增量日志解析,提供增量數據訂閱和消費

  • 基于mysql的主從備份的思想

2.1 mysql主從復制

Redis怎么實現多級緩存

2.2 canal 工作原理

canal 模擬 MySQL slave 的交互協議,偽裝自己為 MySQL slave ,向 MySQL master 發送dump 協議
MySQL master 收到 dump 請求, 開始推送 binary log 給 slave (即 canal )
canal 解析 binary log 對象(原始為 byte 流)

到此,關于“Redis怎么實現多級緩存”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

大关县| 深州市| 广昌县| 宁安市| 紫金县| 玉门市| 景泰县| 繁昌县| 霍城县| 唐山市| 苏尼特右旗| 靖江市| 永登县| 三明市| 江华| 连江县| 阳朔县| 绥芬河市| 循化| 晋州市| 山东省| 广汉市| 呼伦贝尔市| 岐山县| 永吉县| 丰县| 辛集市| 抚顺县| 南皮县| 延边| 贡觉县| 宾阳县| 吉水县| 鱼台县| 阳江市| 分宜县| 林甸县| 陆丰市| 中方县| 运城市| 云梦县|