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

Redis實現(xiàn)多級緩存

 更新時間:2022年07月28日 16:35:18   作者:飛翔荷蘭號  
這篇文章主要為大家詳細介紹了Redis實現(xiàn)多級緩存,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Redis實現(xiàn)多級緩存的具體代碼,供大家參考,具體內(nèi)容如下

一、多級緩存

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

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

2. 多級緩存方案

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

二、JVM本地緩存

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

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

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

1. 實用案例

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

<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. 會將之前存儲的數(shù)據(jù)刪除掉*/
? ? ? ? cacheWithMaxPairs = Caffeine.newBuilder()
? ? ? ? ? ? ? ? .maximumSize(maxPairs)
? ? ? ? ? ? ? ? .build();
? ? }

? ? /*從緩存中獲取數(shù)據(jù)
? ? ?* 1. 如果緩存中有,則直接從緩存中返回
? ? ?* 2. 如果緩存中沒有,則去數(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ù)庫查詢");
? ? ? ? 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 設(shè)置有效期

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

1.2 同步雙寫

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

1.3 異步通知

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

2. 基于Canal的異步通知

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

2.1 mysql主從復(fù)制

2.2 canal 工作原理

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一步步教會你redis如何配置密碼

    一步步教會你redis如何配置密碼

    Redis的配置文件中可以設(shè)置密碼來保護訪問,下面這篇文章主要給大家介紹了關(guān)于redis如何配置密碼的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • php結(jié)合redis實現(xiàn)高并發(fā)下的搶購、秒殺功能的實例

    php結(jié)合redis實現(xiàn)高并發(fā)下的搶購、秒殺功能的實例

    下面小編就為大家?guī)硪黄猵hp結(jié)合redis實現(xiàn)高并發(fā)下的搶購、秒殺功能的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 詳解Redis Stream做消息隊列

    詳解Redis Stream做消息隊列

    這篇文章主要介紹了詳解Redis Stream做消息隊列,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • redis通過位圖法記錄在線用戶的狀態(tài)詳解

    redis通過位圖法記錄在線用戶的狀態(tài)詳解

    這篇文章主要給大家介紹了關(guān)于redis如何通過位圖法記錄在線用戶的狀態(tài)的相關(guān)資料,文中先對位圖進行了一個簡單的介紹,而后通過示例代碼將實現(xiàn)的方法介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Redis過期Key刪除策略和內(nèi)存淘汰策略的實現(xiàn)

    Redis過期Key刪除策略和內(nèi)存淘汰策略的實現(xiàn)

    當內(nèi)存使用達到上限,就無法存儲更多數(shù)據(jù)了,為了解決這個問題,Redis內(nèi)部會有兩套內(nèi)存回收的策略,過期Key刪除策略和內(nèi)存淘汰策略,本文就來詳細的介紹一下這兩種方法,感興趣的可以了解一下
    2024-02-02
  • Redisson實現(xiàn)Redis分布式鎖的幾種方式

    Redisson實現(xiàn)Redis分布式鎖的幾種方式

    本文在講解如何使用Redisson實現(xiàn)Redis普通分布式鎖,以及Redlock算法分布式鎖的幾種方式的同時,也附帶解答這些同學(xué)的一些疑問,感興趣的可以了解一下
    2021-08-08
  • redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例

    redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例

    這篇文章主要為大家介紹了redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    點贊是我們現(xiàn)在經(jīng)常見到的一個效果,如朋友圈、微博都有點贊的效果,下面這篇文章主要跟大家分享了基于redis實現(xiàn)的點贊功能設(shè)計思路的相關(guān)資料,文中介紹的非常詳細,對大家實現(xiàn)點贊功能具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 關(guān)于在Redis中使用Pipelining加速查詢的問題

    關(guān)于在Redis中使用Pipelining加速查詢的問題

    這篇文章主要介紹了在Redis中使用Pipelining加速查詢,Redis是一個client-server模式的TCP服務(wù),也被稱為Request/Response協(xié)議的實現(xiàn),本文通過一個例子給大家詳細介紹,感興趣的朋友一起看看吧
    2022-05-05
  • Redis分布式鎖的幾種實現(xiàn)方法

    Redis分布式鎖的幾種實現(xiàn)方法

    本文主要介紹了Redis分布式鎖的幾種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評論

清新县| 茶陵县| 蒲城县| 新野县| 北票市| 屯昌县| 霍山县| 文安县| 宝应县| 微山县| 日土县| 体育| 宜兰县| 洪江市| 海门市| 余庆县| 阿巴嘎旗| 常山县| 无为县| 光泽县| 宁阳县| 中方县| 平武县| 湟中县| 平谷区| 康乐县| 古交市| 汉中市| 阳朔县| 昔阳县| 隆化县| 谷城县| 佛教| 富蕴县| 大方县| 南华县| 攀枝花市| 高要市| 土默特左旗| 琼结县| 长兴县|