最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java實(shí)現(xiàn)Redis多級(jí)緩存方案

 更新時(shí)間:2022年03月22日 17:20:27   作者:飛翔荷蘭號(hào)  
這篇文章主要介紹了Redis多級(jí)緩存方案分享,傳統(tǒng)緩存方案、多級(jí)緩存方案、JVM本地緩存,舉例說(shuō)明這些方案,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

一、多級(jí)緩存

1. 傳統(tǒng)緩存方案

請(qǐng)求到達(dá)tomcat后,先去redis中獲取緩存,不命中則去mysql中獲取

2. 多級(jí)緩存方案

  • tomcat的請(qǐng)求并發(fā)數(shù),是遠(yuǎn)小于redis的,因此tomcat會(huì)成為瓶頸
  • 利用請(qǐng)求處理每個(gè)環(huán)節(jié),分別添加緩存,減輕tomcat壓力,提升服務(wù)性能

二、JVM本地緩存

緩存是存儲(chǔ)在內(nèi)存中,數(shù)據(jù)讀取速度較快,能大量減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),減少數(shù)據(jù)庫(kù)壓力

分布式緩存,如redis
 - 優(yōu)點(diǎn): 存儲(chǔ)容量大,可靠性好,可以在集群中共享
 - 缺點(diǎn): 訪問(wèn)緩存有網(wǎng)絡(luò)開(kāi)銷
 - 場(chǎng)景: 緩存數(shù)據(jù)量大,可靠性高,需要在集群中共享的數(shù)據(jù)

進(jìn)程本地緩存, 如HashMap, GuavaCache
- 優(yōu)點(diǎn):讀取本地內(nèi)存,沒(méi)有網(wǎng)絡(luò)開(kāi)銷,速度更快
- 缺點(diǎn):存儲(chǔ)容量有限,可靠性低(如重啟后丟失),無(wú)法在集群中共享
- 場(chǎng)景:性能要求高,緩存數(shù)據(jù)量少

1. 實(shí)用案例

  • Caffeine是一個(gè)基于java8開(kāi)發(fā)的,提供了近乎最佳命中率的高性能的本地緩存庫(kù)
  • 目前spring內(nèi)部的緩存用的就是這個(gè)
<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 {
? ? ? ? /*過(guò)期策略,寫完60s后過(guò)期*/
? ? ? ? cacheWithExpireSeconds = Caffeine.newBuilder()
? ? ? ? ? ? ? ? .expireAfterWrite(Duration.ofSeconds(expireSeconds))
? ? ? ? ? ? ? ? .build();

? ? ? ? /*過(guò)期策略,達(dá)到最大值后刪除
? ? ? ? ?* 1. 并不會(huì)立即刪除,等一會(huì)兒才會(huì)刪除
? ? ? ? ?* 2. 會(huì)將之前存儲(chǔ)的數(shù)據(jù)刪除掉*/
? ? ? ? cacheWithMaxPairs = Caffeine.newBuilder()
? ? ? ? ? ? ? ? .maximumSize(maxPairs)
? ? ? ? ? ? ? ? .build();
? ? }

? ? /*從緩存中獲取數(shù)據(jù)
? ? ?* 1. 如果緩存中有,則直接從緩存中返回
? ? ?* 2. 如果緩存中沒(méi)有,則去數(shù)據(jù)查詢并返回結(jié)果*/
? ? 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("數(shù)據(jù)庫(kù)查詢");
? ? ? ? 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. 常見(jiàn)方案

1.1 設(shè)置有效期

  • 給緩存設(shè)置有效期,到期后自動(dòng)刪除。再次查詢時(shí)可以更新
  • 優(yōu)勢(shì):簡(jiǎn)單,方便
  • 缺點(diǎn):時(shí)效性差,緩存過(guò)期之前可能不一致
  • 場(chǎng)景:更新頻率低,時(shí)效性要求比較低的業(yè)務(wù)

1.2 同步雙寫

  • 在修改數(shù)據(jù)庫(kù)的同時(shí),直接修改緩存
  • 優(yōu)勢(shì):有代碼侵入,緩存與數(shù)據(jù)庫(kù)強(qiáng)一致性
  • 缺點(diǎn):代碼進(jìn)入,耦合性高
  • 場(chǎng)景:對(duì)一致性,失效性要求較高的緩存數(shù)據(jù)

1.3 異步通知

  • 修改數(shù)據(jù)庫(kù)時(shí)發(fā)送事件通知,相關(guān)服務(wù)監(jiān)聽(tīng)到后修改緩存數(shù)據(jù)
  • 優(yōu)勢(shì):低耦合,可以同時(shí)通知多個(gè)緩存服務(wù)
  • 缺點(diǎn):時(shí)效性一把,可能存在緩存不一致問(wèn)題
  • 場(chǎng)景:時(shí)效性一般,有多個(gè)服務(wù)需要同步

2. 基于Canal的異步通知

  • 是阿里旗下的一款開(kāi)源項(xiàng)目,基于java開(kāi)發(fā)
  • 基于數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi)
  • 基于mysql的主從備份的思想

2.1 mysql主從復(fù)制

2.2 canal 工作原理

  • canal 模擬 MySQL slave 的交互協(xié)議,偽裝自己為 MySQL slave ,向 MySQL master 發(fā)送dump 協(xié)議
  • MySQL master 收到 dump 請(qǐng)求, 開(kāi)始推送 binary log 給 slave (即 canal )
  • canal 解析 binary log 對(duì)象(原始為 byte 流)

到此這篇關(guān)于Redis多級(jí)緩存方案分享的文章就介紹到這了,更多相關(guān)Redis多級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java搭建簡(jiǎn)單Netty開(kāi)發(fā)環(huán)境入門教程

    Java搭建簡(jiǎn)單Netty開(kāi)發(fā)環(huán)境入門教程

    這篇文章主要介紹了Java搭建簡(jiǎn)單Netty開(kāi)發(fā)環(huán)境入門教程,有詳細(xì)的代碼展示和maven依賴,能夠幫助你快速上手Netty開(kāi)發(fā)框架,需要的朋友可以參考下
    2021-06-06
  • java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析

    java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析

    這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過(guò)示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解

    SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解

    這篇文章主要介紹了SpringBoot利用自定義json序列化器實(shí)現(xiàn)敏感字段數(shù)據(jù)脫敏詳解,因?yàn)榘咐a用到了hutool提供的DesensitizedUtil數(shù)據(jù)脫敏工具類,這里要引入hutool的依賴,如果你需要自定義 數(shù)據(jù)脫敏的邏輯,可以不引入這個(gè)依賴,需要的朋友可以參考下
    2024-01-01
  • Java方法重載和重寫原理區(qū)別解析

    Java方法重載和重寫原理區(qū)別解析

    這篇文章主要介紹了Java方法重載和重寫原理區(qū)別解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java開(kāi)發(fā)神器Lombok安裝與使用詳解

    Java開(kāi)發(fā)神器Lombok安裝與使用詳解

    Lombok的安裝分兩部分:Idea插件的安裝和maven中pom文件的導(dǎo)入,本文重點(diǎn)給大家介紹Java開(kāi)發(fā)神器Lombok安裝與使用詳解,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • spring中前端明明傳了值后端卻接收不到問(wèn)題解決辦法

    spring中前端明明傳了值后端卻接收不到問(wèn)題解決辦法

    在學(xué)習(xí)Spring的時(shí)候遇到了一個(gè)問(wèn)題,后臺(tái)一直接收不到前臺(tái)傳遞過(guò)來(lái)的參數(shù),耽誤了好長(zhǎng)時(shí)間終于找到了原因,這篇文章主要給大家介紹了關(guān)于spring中前端明明傳了值后端卻接收不到問(wèn)題的解決辦法,需要的朋友可以參考下
    2024-05-05
  • 詳解JAVA 連等賦值問(wèn)題

    詳解JAVA 連等賦值問(wèn)題

    這篇文章主要介紹了JAVA 連等賦值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java連接Mongodb實(shí)現(xiàn)增刪改查

    java連接Mongodb實(shí)現(xiàn)增刪改查

    這篇文章主要為大家詳細(xì)介紹了java連接Mongodb實(shí)現(xiàn)增刪改查,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • SpringBoot+redis配置及測(cè)試的方法

    SpringBoot+redis配置及測(cè)試的方法

    這篇文章主要介紹了SpringBoot+redis配置及測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解通過(guò)maven運(yùn)行項(xiàng)目的兩種方式

    詳解通過(guò)maven運(yùn)行項(xiàng)目的兩種方式

    這篇文章主要介紹了通過(guò)maven運(yùn)行項(xiàng)目的兩種方式,給大家提到了通過(guò)tomcat的方式來(lái)啟動(dòng)maven項(xiàng)目的方法,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12

最新評(píng)論

大英县| 济阳县| 辉县市| 唐山市| 依兰县| 吉林市| 广汉市| 丹江口市| 白水县| 晴隆县| 四川省| 津市市| 沧州市| 临洮县| 望谟县| 高密市| 军事| 三台县| 舒城县| 台东市| 满城县| 红原县| 洞头县| 商洛市| 江山市| 长顺县| 安达市| 望谟县| 东光县| 会昌县| 崇州市| 宁武县| 枝江市| 武威市| 岳西县| 绥阳县| 区。| 彰化县| 通化县| 铜鼓县| 临沭县|