基於Java怎麼實作Redis多層緩存
一、多層快取
1. 傳統快取方案
請求到達tomcat後,先去redis中取得緩存,不命中則去mysql取得
2. 多層快取方案
tomcat
的請求並發數,是遠小於redis的,因此tomcat會變成瓶頸利用請求處理每個環節,分別加入緩存,減輕tomcat壓力,提升服務效能
- 優點: 儲存容量大,可靠度好,可在叢集中共用進程本地緩存, 如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 非同步通知
修改資料庫時發送事件通知,相關服務監聽到後修改快取資料
- 優勢:低耦合,可以同時通知多個快取服務
- 缺點:時效性一把,可能有快取不一致問題
- 場景:時效性一般,有多個服務需要同步
2. 基於Canal的非同步通知
- 基於資料庫增量日誌解析,提供增量資料訂閱和消費
- 基於mysql的主從備份的想法
- 2.1 mysql主從複製
#2.2 canal 工作原理
- MySQL master 收到dump 請求, 開始推送binary log 給slave (即canal )
- canal 解析binary log 物件(原始為byte 流)
#
以上是基於Java怎麼實作Redis多層緩存的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

SpringBoot中使用Redis緩存OAuth2Authorization對像在SpringBoot應用中,使用SpringSecurityOAuth2AuthorizationServer...

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

使用RedisTemplate進行批量查詢時為何返回值為空?在使用RedisTemplate進行批量查詢操作時,可能會遇到返回的結果�...

SpringBoot定時任務在多節點環境下的優化方案在開發Spring...

關於RedisTemplate.opsForList().leftPop()不支持傳個數的原因在使用Redis時,很多開發者會遇到一個問題:為什麼redisTempl...

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。
