Java中緩存的使用淺講

Java中緩存的使用淺講

在Java中,緩存系統的使用對于提升應用性能至關重要。緩存的作用主要是減少訪問慢速存儲(如數據庫或文件系統)的頻率,從而提高應用的響應速度。以下是對Java中緩存系統的全面講解,包括緩存的類型、實現方式以及使用場景

一. 緩存的概念

緩存(Cache)是一個存儲臨時數據的地方,它可以快速訪問,并用于存儲頻繁訪問的數據。緩存系統能夠減少數據訪問延遲,減輕后端系統的負擔,提升性能。

二. 緩存的工作原理

緩存的工作原理通常如下:

1、查找緩存:應用請求數據時,首先查找緩存。
2、緩存命中:如果數據存在于緩存中,直接返回。
3、緩存未命中:如果數據不存在于緩存中,查詢數據源(如數據庫),并將查詢結果緩存。
4、緩存失效:緩存中的數據通常有過期時間(TTL,Time-To-Live),當數據過期時需要重新加載。

三. 緩存類型

1、本地緩存(Local Cache)

  • 存儲在應用的內存中。

  • 適用于小型應用,避免了外部依賴。

  • 缺點:只能被單一實例訪問,無法橫向擴展

2、分布式緩存(Distributed Cache)

  • 存儲在多個節點中,支持跨多個應用實例共享緩存。

  • 常見的分布式緩存系統:Redis、Memcached。

  • 優點:可擴展性強,適用于大規模分布式應用

四. Java中緩存的實現方式

4.1 基于內存的緩存(如 HashMap、ConcurrentHashMap)

對于簡單的緩存需求,可以使用Java的內存結構如 HashMap 或 ConcurrentHashMap。例如:


import java.util.concurrent.ConcurrentHashMap;
public class InMemoryCache {private ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();// 添加數據到緩存public void put(String key, Object value) {cache.put(key, value);}// 從緩存中獲取數據public Object get(String key) {return cache.get(key);}// 刪除緩存數據public void remove(String key) {cache.remove(key);}
}

這種方法簡單且快速,但缺乏過期策略和跨進程共享功能。

4.2 使用Guava緩存(本地緩存)

Guava是Google提供的一個開源Java庫,提供了一個非常強大的本地緩存功能。Guava的緩存實現支持自動過期、最大大小限制、異步加載等功能

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;public class GuavaCache {private Cache<String, Object> cache = CacheBuilder.newBuilder().maximumSize(100) // 最大緩存大小.expireAfterWrite(10, TimeUnit.MINUTES) // 過期時間.build();// 添加數據到緩存public void put(String key, Object value) {cache.put(key, value);}// 從緩存中獲取數據public Object get(String key) {return cache.getIfPresent(key);}// 刪除緩存數據public void remove(String key) {cache.invalidate(key);}
}

4.3 使用Ehcache(本地緩存)

Ehcache 是一個開源的Java緩存框架,適用于Java應用中復雜的緩存需求。它支持內存緩存、磁盤緩存和分布式緩存等

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

Ehcache 配置文件示例:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd"xmlns="http://www.ehcache.org/v3"><cache alias="sampleCache"><heap unit="entries">1000</heap><expiry><ttl>10</ttl> <!-- 過期時間10秒 --></expiry></cache>
</ehcache>

4.4 使用Redis(分布式緩存)

Redis 是一個高性能的分布式緩存系統,廣泛用于跨多臺服務器的緩存。它提供了豐富的數據結構和緩存功能,如字符串、哈希、列表、集合、排序集合等。

使用Java連接Redis的常見方式是通過 Jedis 或 Lettuce 庫

Jedis 示例:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.0</version>
</dependency>
import redis.clients.jedis.Jedis;
public class RedisCache {private Jedis jedis = new Jedis("localhost");public void put(String key, String value) {jedis.set(key, value);}public String get(String key) {return jedis.get(key);}public void remove(String key) {jedis.del(key);}
}

Redis緩存適用于需要高可用性、跨服務器訪問、并發控制等場景。

4.5 Spring Cache(集成緩存)

Spring 提供了一個緩存抽象層,允許你使用不同的緩存實現(如 Ehcache、Redis、Caffeine 等)而無需修改代碼。Spring Cache提供了一些注解,簡化了緩存操作

例如,使用注解 @Cacheable 和 @CacheEvict 來緩存方法結果:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CacheEvict;public class CacheService {@Cacheable(value = "users", key = "#userId")public User getUserById(String userId) {// 模擬數據庫查詢return new User(userId, "John Doe");}@CacheEvict(value = "users", key = "#userId")public void evictCache(String userId) {// 清除緩存}
}

要啟用Spring緩存功能,需要在配置類中添加 @EnableCaching 注解,并配置緩存管理器。

@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("users");}
}

五. 緩存的應用場景

  • 數據庫查詢緩存:對于數據庫查詢頻繁的數據,可以將查詢結果緩存。

  • Session緩存:用戶會話信息存儲在緩存中,提高獲取速度。

  • 頁面緩存:對靜態頁面或不常變動的內容進行緩存。

  • API響應緩存:對于API響應結果可以進行緩存,減少API調用的延遲

總結

緩存是提高系統性能的常用手段,但其實現和使用需要根據具體需求來選擇合適的緩存類型和工具。在Java中,常見的緩存工具包括本地緩存(如 HashMap、Guava)、分布式緩存(如 Redis)、以及集成式緩存(如 Spring Cache)。通過合理的緩存策略,可以有效減輕數據庫負擔,提高系統的響應速度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89599.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷 P10264 [GESP202403 八級] 接竹竿 普及+/提高

題目描述 小楊同學想用卡牌玩一種叫做“接竹竿”的游戲。 游戲規則是&#xff1a;每張牌上有一個點數 vvv&#xff0c;將給定的牌依次放入一列牌的末端。若放入之前這列牌中已有與這張牌點數相 同的牌&#xff0c;則小楊同學會將這張牌和點數相同的牌之間的所有牌全部取出隊列&…

windows docker-02-docker 最常用的命令匯總

一、鏡像管理命令說明常用參數示例docker pull <鏡像名>:<標簽>拉取鏡像docker pull nginx:latestdocker images查看本地鏡像docker images -a&#xff08;含中間層鏡像&#xff09;docker rmi <鏡像ID>刪除鏡像docker rmi -f $(docker images -q)&#xff0…

前端react項目目錄詳解

1. 項目根目錄文件??文件/目錄作用??package.json??定義項目依賴、腳本命令&#xff08;如 start/build&#xff09;、版本信息等??.env??基礎環境變量配置&#xff08;所有環境共享&#xff09;??.env.development??開發環境專用變量&#xff08;如本地API地址&…

前端-CSS (樣式引入、選擇器)

文章目錄大綱前端三大件常用樣式顏色px:像素1.CSS三種引入方式1.1 行內樣式1.2 頁內樣式1.3 引入外部樣式表文件&#xff08;常見&#xff09;基礎選擇器1. 標記選擇器2. id選擇器3. 類選擇器 最常用4 * 選擇器 使用頻率較低復合選擇器偽類選擇器1.超鏈接偽類&#xff1a;2.子元…

7月19日 臺風“韋帕“強勢逼近:一場與時間賽跑的防御戰

中央氣象臺7月19日10時繼續發布臺風黃色預警,今年第6號臺風"韋帕"正以每小時20-25公里的速度向西偏北方向移動,強度逐漸加強。這個來自海洋的"不速之客"中心附近最大風力已達10級(25米/秒),預計將于20日下午至夜間在廣東深圳到海南文昌一帶沿海登陸,…

學習 Python 爬蟲需要哪些基礎知識?

學習 Python 爬蟲需要掌握一些基礎技術和概念。 1. Python 基礎語法 這是最根本的前提&#xff0c;需要熟悉&#xff1a; - 變量、數據類型&#xff08;字符串、列表、字典等&#xff09; - 條件判斷、循環語句 - 函數、類與對象 - 模塊和包的使用&#xff08;如 import 語…

IELTS 閱讀C15-Test 2-Passage 2

繼續雅思上分實驗。這次正確率是10/13&#xff0c;還是挺讓我吃驚的&#xff0c;因為我又沒有完全讀懂&#xff01; 題型1-填空題這道題目很簡單&#xff0c;同樣地去原文段落里找就好&#xff0c;最后一個空填錯了是因為我不知道mitigate就是decrease同義詞。 題型2-人物匹配題…

7.18 Java基礎 |

以下內容&#xff0c;參考Java 教程 | 菜鳥教程&#xff0c;下邊是我邊看邊記的內容&#xff0c;以便后續復習使用。 多態&#xff1a; 繼承&#xff0c;接口就是多態的具體體現方式。生物學上&#xff0c;生物體或物質可以具有許多不同的形式或者階段。 多態分為運行時多態&…

網絡安全知識學習總結 Section 11

一、實驗知識總結&#xff08;模擬&#xff09;等價路由配置實驗并抓包分析按流分析實驗拓撲圖&#xff1a;AR1配置&#xff1a;<Huawei>sys [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 30 [Huawei-GigabitEthernet0/0/0]int g0/0/1 [Huaw…

VBA 運用LISTBOX插件,選擇多個選項,并將選中的選項回車錄入當前選中的單元格

維護好數據&#xff0c;并新增一個activeX列表框插件Private Sub Worksheet_SelectionChange(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf Target.Row > 2 And Target.Row < 10 And Target.Column 2 Then 選擇操作范圍With ListBox1.MultiSelect 1 …

ASP .NET Core 8實現實時Web功能

ASP.NET Core SignalR 是一個開放源代碼庫&#xff0c;可用于簡化向應用添加實時 Web 功能。 實時 Web 功能使服務器端代碼能夠將內容推送到客戶端。以下是 ASP.NET Core SignalR 的一些主要功能&#xff1a;自動處理連接管理同時向所有連接的客戶端發送消息。 例如聊天室向特定…

最新版谷歌瀏覽器 內網安裝 pdf無法預覽

最新版谷歌瀏覽器 內網安裝 pdf無法預覽 谷歌下載地址 谷歌下載地址 不同的瀏覽器版本&#xff0c;兼容的js標準不一樣 js標準也在不斷升級&#xff0c;增加新的方法。

NX二次開發常用函數坐標轉化UF_MTX4_csys_to_csys和UF_MTX4_vec3_multipl

一、UF_MTX4_csys_to_csys 1.1 函數名稱 UF_MTX4_csys_to_csys1.2 函數中各參數解釋&#xff1a;函數參數解釋&#xff1a; 第1個參數為輸入&#xff1a; 輸入const double 雙精度類型的參數&#xff0c;參數的變量格式為from_origin [ 3 ]&#xff0c;坐標系&#xff…

JAVA中的Collections 類

文章目錄前言一、 排序方法 sort() 和 reverseOrder()1. sort(List<T> list)2.sort(List<T> list, Comparator<? super T> c)二、查找方法 max(), min()1.max(Collection<? extends T> coll)2.min(Collection<? extends T> coll)3.max(Collec…

統計學習方法

一、統計學習方法步驟 得到一個有限的訓練數據集合確定學習模型的集合-假設空間確定模型選擇的準則-策略實現求解最優模型的算法-算法通過學習方法選擇最優模型利用學習的最優模型對新數據進行預測或分析 二、統計學習方法分類 三、統計學習的基本分類&#xff08;監督學習&a…

windows docker-01-desktop install windows10 + wls2 啟用

windows10 安裝 docker 版本信息確認 需要區分 windows 是 amd64 還是 arm64 powershell 中執行&#xff1a; > echo $env:PROCESSOR_ARCHITECTURE AMD64下載 官方 https://www.docker.com/products/docker-desktop/ 下載 windows amd64 下載好了直接安裝。 如何驗證…

Elasticsearch集群出現腦裂(Split-Brain)如何排查原因和處理?

Elasticsearch集群出現腦裂(Split-Brain)如何排查原因和處理? 1. 腦裂(Split-Brain)背景 定義:腦裂是指 Elasticsearch 集群由于網絡分區(network partition)或其他原因分裂成多個獨立的子集群,每個子集群認為自己是主集群,導致不同的子集群可能獨立處理請求,造成數…

Apache Ignite 的 Pages Writes Throttling(頁面寫入節流)

&#x1f31f; 一、什么是 Checkpointing&#xff08;檢查點機制&#xff09;&#xff1f; 在 Apache Ignite 中&#xff1a; 數據是先保存在內存中&#xff08;RAM&#xff09;&#xff0c;然后異步寫入磁盤。當數據被修改時&#xff0c;它首先被更新在內存中的“頁”上&#…

uni-app 學習筆記:使用深度選擇器修改第三方庫組件的樣式

在uni-app中&#xff0c;深度選擇器&#xff08;Deep Selector&#xff09;是一個非常重要的概念&#xff0c;它允許父組件穿透樣式隔離&#xff0c;從而修改子組件的內部樣式。1.什么是uni-app深度選擇器深度選擇器是一種CSS選擇器&#xff0c;用于穿透組件的樣式隔離機制&…

物聯網IOT平臺到底是啥

物聯網IOT平臺&#xff1a;萬物互聯的智慧中樞清晨&#xff0c;智能鬧鐘輕柔喚醒你&#xff0c;咖啡機自動開始沖泡&#xff1b;離家時&#xff0c;空調自動關閉&#xff0c;安防攝像頭啟動&#xff1b;辦公室內&#xff0c;生產線傳感器實時回傳設備狀態&#xff0c;倉庫管理系…