日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

大家好,我是哪吒。

我第一次接觸緩存的時候,是用map做的,當時做一個實時數據同步的功能。

需求看似簡單,一取一傳

  • 當時是通過websocket獲取服務端數據。
  • 然后根據數據類別,將數據緩存到本地map中。
  • 做了一個定時任務,通過ftp上傳給第三方服務器。

當有并發時,map是不行的,數據會錯亂,使用ConcurrentHashMap可以解決并發數據錯亂問題。

  • 現場網絡很不穩定,FTP時好時壞。
  • 做的是一個安全問題的實時監控系統,第三方數據要求還很嚴格,必須100%準確。

這矛盾怎么解決,無解了。

起初,是通過重啟的方式解決的,哈哈,重啟解決一切煩惱。

  • 添加一個心跳功能,實時監控FTP服務的狀態。
  • 如果斷了7秒以上,就采取報警功能,我記得設置的是火警的音樂,提示現場人員排查FTP網絡。
  • 如果斷了1分鐘以上,就將軟件自動重啟。

但是,又出現了一個新的問題,數據丟了。

因為用的是ConcurrentHashMap緩存數據,也就是本地緩存,你重啟了,數據不就沒了嗎?兄弟。

到后來,才發現,當時做的真的是稀爛,本地緩存應該具有很多功能,當時這些,壓根就沒有。

  • 超過最大限制有對應淘汰策略如LRU、LFU。
  • 過期時間淘汰如定時、懶式、定期。
  • 持久化。
  • 統計監控。

下面從緩存、本地緩存、redis緩存、Redis緩存策略幾個維度,全方位、系統的學習一下緩存到底是個啥?

一、緩存

緩存就是把訪問量較高的熱點數據從傳統的關系型數據庫中加載到內存中,當用戶再次訪問熱點數據時,是從內存中加載,減少了對數據庫的訪問量,解決了高并發場景下容易造成數據庫宕機的問題。

緩存有哪些分類:

  1. 操作系統磁盤緩存,減少磁盤機械操作。
  2. 數據庫緩存,減少文件系統 I/O。
  3. 應用程序緩存,減少對數據庫的查詢。
  4. Web 服務器緩存,減少應用程序服務器請求。
  5. 客戶端瀏覽器緩存,減少對網站的訪問。

本地緩存:在客戶端本地的物理內存中劃出一部分空間,來緩存客戶端回寫到服務器的數據。當本地回寫緩存達到緩存閾值時,將數據寫入到服務器中。

二、分析一下本地緩存的優勢

數據緩存帶來了諸多優勢,其中兩個核心優點是:

  • 降低數據庫壓力:通過將常用的數據存儲在快速訪問的內存中,緩存有效地減輕了對后端數據庫的壓力。這意味著數據庫可以更專注地處理復雜的查詢和更新操作,而不必頻繁地處理重復的讀取請求。
  • 提高響應速度:將數據存儲在緩存中,使得系統能夠更迅速地響應用戶的請求。相比每次都從數據庫中獲取數據,緩存可以在毫秒級別內提供所需信息,從而極大地改善用戶體驗。

三、本地緩存解決方案?

上面介紹了ConcurrentHashMap,這里不再贅述。

1、基于Guava Cache實現本地緩存

Guava是google團隊開源的一款 JAVA 核心增強庫,包含集合、并發、緩存、IO、反射等工具箱性能和穩定性上都有保障應用十分廣泛。

Guava Cache支持很多特性:

  • 支持最大容量限制。
  • 支持兩種過期刪除策略插入時間和訪問時間。
  • 支持簡單的統計功能。
  • 基于LRU算法實現。

2、基于Caffeine實現本地緩存

Caffeine是基于java8實現的新一代緩存工具,緩存性能接近理論最優,可以看作是Guava Cache的增強版,功能上兩者類似。

不同的是Caffeine采用了一種結合LRU、LFU優點的算法W-TinyLFU在性能上有明顯的優越性。

3、基于Encache實現本地緩存

Encache是一個純Java的進程內緩存框架具有快速、精干等特點。

同Caffeine和Guava Cache相比,Encache的功能更加豐富擴展性更強。

優點:

  • 支持多種緩存淘汰算法包括LRU、LFU和FIFO。
  • 緩存支持堆內存儲、堆外存儲、磁盤存儲支持持久化三種。
  • 支持多種集群方案解決數據共享問題。

四、引入Redis

后來,因為一次事故,甲方被監管平臺罰了100萬,本質原因就是丟數據問題。

這可如何是好,我也是嚇了一身冷汗,連夜想整改方案,最終的解決方案是,“引入Redis”。

Redis作為一款高性能、內存存儲的緩存數據庫,被廣泛應用于緩存數據的場景。

  • 用戶第一次訪問數據時,緩存中沒有數據,要從數據庫中獲取數據,因為是從磁盤中拿數據讀取數據的過程比較慢。
  • 拿到數據后,將數據存儲在緩存中。
  • 用戶第二次訪問數據時,可以從緩存中直接獲取,因為緩存是直接操作內存的,訪問數據速度比較快。

下面將深入探討Redis的數據緩存策略,重點解析LRU(最近最少使用)、LFU(最不經常使用)等算法,并分享如何通過性能優化來提升緩存系統的效率。

五、Redis數據緩存策略

1、為什么需要數據緩存策略

在現代應用中,數據緩存發揮著至關重要的作用。

通過將頻繁訪問的數據存儲在內存中,我們能夠避免不必要的數據庫查詢,從而顯著提升系統的響應速度和吞吐量。

然而,隨著應用規模和用戶訪問量的不斷增加,有效的數據緩存策略變得尤為重要。

我們需要在性能和資源利用之間找到最佳平衡,以應對不同需求和挑戰。

這進一步引出了一個關鍵問題:如何選擇適合的數據緩存策略來滿足不同的應用場景?

下圖詳細地說明了數據緩存的優勢和選擇適合的數據緩存策略的過程:

通過上圖,我們深入探討了數據緩存的優勢,并展示了在選擇合適的緩存策略時,我們如何在提升性能和資源利用之間找到最佳平衡。

選擇適合的策略能夠有效地降低數據庫壓力,并通過提高響應速度來提供更出色的用戶體驗。

2、Redis作為緩存的優勢

Redis(Remote Dictionary Server)是一款強大的高性能開源內存數據庫,不僅被廣泛應用于緩存場景,還可用作隊列、發布訂閱系統等。作為緩存數據庫,Redis擁有一系列突出的優勢:

(1)高性能特點

Redis的數據存儲在內存中,因此具備出色的讀寫性能。其高效的數據結構和優化的算法使得絕大多數情況下,讀寫操作能夠在微秒級別內完成,滿足了高并發應用的需求。

(2)多樣性的緩存策略

Redis提供了多種數據緩存策略,使開發者可以根據業務特點選擇合適的策略。這種靈活性允許我們根據數據的訪問模式、使用頻率以及其他因素來決定數據何時被清理或保留。

下圖說明緩存策略的選擇過程:

通過分析數據訪問模式,根據數據的訪問頻率選擇合適的緩存策略。根據實際情況不斷地監控數據的訪問情況,并優化緩存策略,在不同的場景中靈活應用這些策略。

六、LRU算法:最近最少使用

LRU(Least Recently Used)算法是一種經典的緩存替換策略,它的核心思想是優先淘汰最近最少使用的數據,以便為新數據騰出空間。在數據緩存場景中,LRU算法能夠保留熱門數據,從而提高緩存的命中率。

1、LRU算法原理解析

LRU算法的原理非常直觀:當緩存空間滿了,系統會優先淘汰最久未被訪問的數據。這個策略的背后思想是,如果某個數據在最近一段時間內沒有被訪問,那么它在未來也可能不會被訪問。這種替換策略有助于保持緩存中的數據是熱數據,即最近被頻繁訪問的數據。

上圖說明了LRU算法如何根據訪問順序來保留緩存中的數據。最近訪問的數據會被保留在緩存中,而最早訪問的數據會被優先替換。

示例代碼如下,展示了如何通過繼承LinkedHashMap來實現LRU緩存:

import java.util.LinkedHashMap;
import java.util.Map;

class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int MAX_CAPACITY;

    public LRUCache(int capacity) {
        super(capacity, 0.75f, true);
        MAX_CAPACITY = capacity;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > MAX_CAPACITY;
    }
}

在這個示例中,我們創建了一個LRUCache類,繼承自LinkedHashMap。通過重寫removeEldestEntry方法,我們指定了當緩存大小超過一定閾值時,自動刪除最久未被訪問的數據。

2、redis中應用LRU算法

在Redis中,我們可以通過配置maxmemory-policy選項來啟用LRU算法的緩存策略。當Redis的內存使用達到限制時,LRU算法將被用于淘汰部分數據,以便騰出空間給新數據。

以下是如何在Redis中啟用LRU緩存策略的示例:

# 啟用LRU緩存策略
CONFIG SET maxmemory-policy allkeys-lru

3、LRU算法的優點與限制

LRU(Least Recently Used)算法是一種常用的數據緩存策略,它在管理緩存數據時有一些明顯的優點和一些限制。

優點

優點

描述

適用于熱數據

LRU算法保留了最近最常訪問的數據,因此非常適用于具有明顯訪問熱點的場景。

簡單有效

LRU算法的實現相對簡單,不需要復雜的計算和維護。

限制

限制

描述

周期性訪問

LRU算法可能會因為數據的周期性訪問而導致不必要的數據替換,特別是在某些特殊業務場景中。

緩存污染

LRU算法容易受到突發的大量訪問影響,可能導致緩存中的“熱·數據被淘汰,從而影響緩存效果。

七、LFU算法:最不經常使用

LFU(Least Frequently Used)算法是一種與LRU相似的緩存替換策略,它的核心思想是優先淘汰最不經常使用的數據,以便為新數據騰出空間。在某些特定場景下,LFU算法能夠更好地適應數據訪問模式的變化。

1、LFU算法原理解析

LFU算法的原理與LRU算法類似,但不同之處在于LFU算法基于數據被訪問的頻率來做出替換決策,而不僅僅是訪問的時間順序。LFU算法維護了一個數據訪問頻率的記錄,當需要淘汰數據時,會優先選擇訪問頻率最低的數據。

上圖說明了LFU算法如何根據數據的訪問頻率來保留緩存中的數據。頻繁訪問的數據會被保留,而不經常訪問的數據會被優先替換。

2、在Redis中應用LFU算法

在Redis中,您可以通過配置maxmemory-policy選項來啟用LFU算法的緩存策略。當Redis的內存使用達到限制時,LFU算法將用于淘汰部分數據,以便為新數據騰出空間。

以下是如何在Redis中啟用LFU緩存策略的示例:

# 啟用LFU緩存策略
CONFIG SET maxmemory-policy allkeys-lfu

3、LFU算法的優點與限制

LFU(Least Frequently Used)算法是一種另類的數據緩存策略,它在不同的場景下具有一些明顯的優點和一些限制。

優點

優點

描述

適用于頻繁刷新

LFU算法能夠優先保留頻繁被刷新的數據,適合某些周期性訪問的場景。

對數據熱度變化敏感

相比于LRU算法,LFU算法更能適應數據訪問模式的變化,能夠更好地反映數據的熱度。

限制

限制

描述

計算復雜性

LFU算法需要維護數據的訪問頻率記錄,這可能導致一定的計算復雜性,特別是在大規模數據場景下。

冷啟動問題

對于剛開始訪問的數據,由于沒有足夠的訪問頻率信息,LFU算法可能難以做出合適的替換決策。

 

八、其他數據緩存策略

1、Least Recently Used with Sampling(LRUS)

除了傳統的LRU算法,還存在一種改進的版本,即LRUS(Least Recently Used with Sampling)算法。LRUS算法通過周期性的采樣來記錄數據的訪問情況,從而更好地估計最近使用的數據,減少了LRU算法中的“冷啟動·問題。

LRUS算法原理

LRUS算法引入了采樣機制,通過周期性地記錄一部分數據的訪問情況,從而更準確地判斷哪些數據是熱數據,哪些是冷數據。與傳統的LRU算法不同,LRUS算法能夠更好地適應數據訪問模式的變化,提高數據緩存的命中率。

上圖LRUS算法通過周期性采樣記錄數據的訪問情況,從而更精確地判斷哪些數據應該被保留,哪些應該被替換。

2、Random Replacement(隨機替換)

隨機替換是一種簡單但有效的緩存策略。與LRU和LFU不同,隨機替換策略不考慮數據的訪問時間或頻率,而是隨機選擇要替換的數據。盡管這聽起來不太智能,但在某些場景下,隨機替換策略表現出意外的優勢。

隨機替換的原理

隨機替換的核心思想是,每次需要替換數據時,從緩存中隨機選擇一條數據進行替換。雖然這種策略沒有考慮數據的熱度或頻率,但在一些特殊情況下,隨機替換能夠避免特定數據被頻繁淘汰,從而維持一定的數據多樣性。

上圖中,隨機替換算法隨機選擇要替換的數據,從而在一些情況下維持了數據多樣性。

九、性能優化與實際應用

1、數據緩存策略的性能考量

在選擇和配置數據緩存策略時,性能是一個關鍵因素。不同的緩存策略適用于不同的業務場景,因此在做出決策時需要綜合考慮多個因素。

(1)緩存大小與命中率的平衡

在配置緩存大小時,需要權衡緩存的總大小和實際存儲的數據量。一個過小的緩存可能導致命中率降低,無法有效減輕數據庫負載,而一個過大的緩存可能浪費內存資源。通常可以通過監控命中率和緩存利用率來優化緩存大小。

(2)數據訪問模式的分析

分析業務的數據訪問模式對于選擇合適的緩存策略至關重要。例如,如果某些數據被頻繁地訪問,而另一些數據則很少被訪問,那么選擇適當的策略可以提高緩存的效果。對于頻繁訪問的熱數據,可以選擇LRU或者LFU策略,而對于較少訪問的冷數據,可以考慮隨機替換策略。

2、實際應用案例:電子商務網站

讓我們通過一個實際的應用案例,來展示如何根據業務需求選擇合適的緩存策略。考慮一個電子商務網站,用戶經常訪問商品列表、商品詳情以及購物車等頁面。針對這個場景,可以選擇不同的緩存策略來優化性能。

(1)電子商務網站的緩存策略選擇

商品列表頁:由于商品列表頁中的商品信息經常變動,可以選擇LRU或者隨機替換策略。這樣可以保留最近的商品數據,提高頁面加載速度。

// 使用LRU算法實現商品列表頁緩存
LRUCache<String, List<Product>> productListCache = new LRUCache<>(1000); // 緩存容量1000

List<Product> cachedProductList = productListCache.get("productList");
if (cachedProductList == null) {
    // 從數據庫獲取商品列表數據
    List<Product> productList = database.getProductList();
    productListCache.put("productList", productList);
    cachedProductList = productList;
}

商品詳情頁:商品詳情頁的數據相對穩定,適合選擇LFU策略。這樣可以保留頻繁訪問的商品詳情數據,提高頁面響應速度。

// 使用LFU算法實現商品詳情頁緩存
LFUCache<String, ProductDetails> productDetailsCache = new LFUCache<>(500); // 緩存容量500

ProductDetails cachedProductDetails = productDetailsCache.get("product123");
if (cachedProductDetails == null) {
    // 從數據庫獲取商品詳情數據
    ProductDetails productDetails = database.getProductDetails("product123");
    productDetailsCache.put("product123", productDetails);
    cachedProductDetails = productDetails;
}

購物車頁:購物車頁的數據與用戶關聯緊密,可以選擇LRU或者LRUS策略。這樣可以保留最近被訪問的購物車數據,提供更好的用戶體驗。

// 使用LRUS算法實現購物車頁緩存
LRUSCache<String, ShoppingCart> shoppingCartCache = new LRUSCache<>(200); // 緩存容量200

ShoppingCart cachedShoppingCart = shoppingCartCache.get("user123");
if (cachedShoppingCart == null) {
    // 從數據庫獲取購物車數據
    ShoppingCart shoppingCart = database.getShoppingCart("user123");
    shoppingCartCache.put("user123", shoppingCart);
    cachedShoppingCart = shoppingCart;
}

(2)性能優化與實際應用改進

在實際應用中,通過合理配置緩存策略以及優化緩存大小,電子商務網站可以顯著提升頁面加載速度和用戶體驗。同時,通過監控數據訪問模式的變化,還可以動態調整緩存策略,進一步優化性能。

十、總結與實踐指導

1、Redis數據緩存策略的重要性

數據緩存不僅可以提升系統性能,還能降低后端數據庫的壓力,從而實現更快的響應時間和更好的用戶體驗。在現代高并發應用中,優化數據緩存策略已經成為系統設計中不可或缺的一環。

2、如何選擇合適的緩存策略

在實際應用中,選擇合適的緩存策略是至關重要的。根據不同的業務場景和數據訪問模式,我們可以靈活地選擇LRU、LFU、LRUS、隨機替換等緩存策略。同時,還可以根據實際需要動態地調整緩存大小,以達到最佳的性能與資源利用率的平衡。

實踐指導:

  • 分析數據訪問模式:在選擇緩存策略之前,首先需要詳細分析數據的訪問模式。哪些數據被頻繁訪問?哪些數據變化較少?根據這些信息,選擇適合的緩存策略。
  • 選擇合適的算法:根據業務需求,選擇合適的緩存算法。LRU適用于保留最近訪問的數據,LFU適用于保留最頻繁訪問的數據,而LRUS則更好地應對訪問模式的變化。
  • 監控與優化:緩存策略不是一成不變的,需要不斷監控數據訪問情況,優化緩存大小和策略。通過監控緩存的命中率和利用率,可以動態地做出調整。
  • 靈活應用:不同的業務模塊可能需要不同的緩存策略。根據實際情況,可以在系統中采用多種緩存策略,以最大程度地提升性能。

分享到:
標簽:緩存 Redis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定