Redis怎么避免熱點數據問題

使用 RedisTemplate 避免熱點數據問題的解決方案、場景及示例:


1. 數據分片(Sharding)

場景:高頻讀寫的計數器(如文章閱讀量統計)
?原理?:將數據分散到多個子鍵,降低單個 Key 的壓力。
?代碼示例?:

// 寫入分片數據
public void incrementShardedCounter(String entityId, int shardCount, long delta) {String baseKey = "counter:" + entityId;int shardIndex = Math.abs(entityId.hashCode()) % shardCount;String shardKey = baseKey + ":shard:" + shardIndex;redisTemplate.opsForValue().increment(shardKey, delta);
}// 讀取總分片數據(需遍歷所有分片)
public long getTotalCounter(String entityId, int shardCount) {String baseKey = "counter:" + entityId;long total = 0;for (int i = 0; i < shardCount; i++) {String shardKey = baseKey + ":shard:" + i;total += redisTemplate.opsForValue().get(shardKey) != null ? (long) redisTemplate.opsForValue().get(shardKey) : 0;}return total;
}

2. 本地緩存 + 異步更新

場景:低頻更新的熱點數據(如商品詳情頁配置)
?原理?:應用層緩存熱點數據,異步同步到 Redis。
?代碼示例?:

// 使用 Caffeine 本地緩存
@Component
public class HotDataCache {private final Cache<String, String> cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).maximumSize(1000).build();@Autowiredprivate RedisTemplate<String, String> redisTemplate;// 讀取數據(優先本地緩存)public String getData(String key) {return cache.get(key, k -> redisTemplate.opsForValue().get(k));}// 異步刷新數據@Scheduled(fixedRate = 5000)public void refreshData() {String hotKey = "product:detail:1001";String value = redisTemplate.opsForValue().get(hotKey);cache.put(hotKey, value); // 更新本地緩存}
}

3. Lua 腳本原子操作

場景:高并發庫存扣減(如秒殺場景)
?原理?:通過 Lua 腳本在 Redis 服務端原子執行操作,減少網絡開銷。
?代碼示例?:

// 定義 Lua 腳本
private static final String SECKILL_SCRIPT = "local stock = tonumber(redis.call('GET', KEYS[1]) or 0)\n" +"if stock >= tonumber(ARGV[1]) then\n" +"    redis.call('DECRBY', KEYS[1], ARGV[1])\n" +"    return 1\n" +"else\n" +"    return 0\n" +"end";// 執行扣減
public boolean seckill(String itemId, int quantity) {DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(SECKILL_SCRIPT, Long.class);String key = "seckill:stock:" + itemId;Long result = redisTemplate.execute(redisScript, Collections.singletonList(key), String.valueOf(quantity));return result == 1;
}

4. Redis Cluster 自動分片

場景:海量數據和高可用需求(如實時排行榜)
?原理?:利用 Redis 集群自動分片數據,分散壓力。
?代碼示例?(需配置 RedisClusterConfiguration):

@Configuration
public class RedisClusterConfig {@Beanpublic RedisTemplate<String, Object> redisClusterTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}// 使用方式(與單機操作一致)
redisTemplate.opsForValue().increment("leaderboard:score:" + userId, 10);

總結

方案適用場景優點注意事項
數據分片高頻計數器、分布式統計水平擴展,降低單點壓力需手動聚合數據,一致性需處理
本地緩存+異步更新低頻更新的熱點數據(如配置)減少 Redis 直接訪問壓力需處理緩存與數據庫一致性
Lua 腳本高并發原子操作(如庫存扣減)服務端原子性,減少網絡延遲需預加載腳本,復雜邏輯難維護
Redis Cluster海量數據、高可用場景自動分片,無縫擴展需集群環境,運維成本較高

根據業務場景選擇合適的方案,可有效避免 Redis 熱點數據問題。

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

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

相關文章

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_8 消息緩沖區

Message Buffer&#xff08;消息緩沖區&#xff09;與Stream Buffer&#xff08;流數據緩沖區&#xff09;類似&#xff0c;但有2點不同&#xff1a; Message Buffer每次只接收1次完整的Message;Message Buffer接收緩沖區小于1條Message大小時&#xff0c;會接收不到數據&#…

【計算機網絡網絡層深度解析】從IP協議到路由優化

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心實驗實現實驗1&#xff1a;IPv6地址配置實驗2&#xff1a;OSPF路由配置實驗3&#xff1a;NAT轉換驗證 運行…

【Hive入門】Hive性能調優:小文件問題與動態分區合并策略詳解

目錄 引言 1 Hive小文件問題概述 1.1 什么是小文件問題 1.2 小文件產生的原因 2 Hive小文件合并機制 2.1 hive.merge.smallfiles參數詳解 2.2 小文件合并流程 2.3 合并策略選擇 3 動態分區與小文件問題 3.1 動態分區原理 3.2 動態分區合并策略 3.3 動態分區合并流程…

如何讓Steam下載速度解除封印?!

平時一直沒注意到家里的路由器在偷懶。最近成功榨干家里的帶寬&#xff0c;把平時一直20mb/s左右下載速度的路由器一番改造后成功steam下載速度穩定85Mb/s。平時一直都只發揮了他的1/3不到&#xff0c;真是太可惜了。 硬件 首先檢查硬件&#xff0c;就千兆路由器而言&#xf…

通信原理第七版與第六版的區別附pdf

介紹 我用夸克網盤分享了「通信原理 第7版》樊昌信」&#xff0c; 鏈接&#xff1a;https://pan.quark.cn/s/be7c5af4cdce 《通信原理&#xff08;第7版&#xff09;》是在第6版的基礎上&#xff0c;為了適應當前通信技術發展和教學需求&#xff0c;并吸取了數十所院校教師的反…

【2025五一數學建模競賽A題】 支路車流量推測問題|建模過程+完整代碼論文全解全析

你是否在尋找數學建模比賽的突破點&#xff1f;數學建模進階思路&#xff01; 作為經驗豐富的美賽O獎、國賽國一的數學建模團隊&#xff0c;我們將為你帶來本次數學建模競賽的全面解析。這個解決方案包不僅包括完整的代碼實現&#xff0c;還有詳盡的建模過程和解析&#xff0c…

Python爬蟲實戰:獲取彼岸網高清素材圖片

一、引言 在數字化時代,圖片素材的需求持續增長。彼岸網提供了豐富的高質量圖片資源,其中 4K 風景圖片備受用戶青睞。借助 Python 爬蟲技術,可自動化地從彼岸網獲取這些圖片,為用戶提供便捷的圖片素材服務。然而,爬取過程中會遭遇登錄驗證、反爬機制等問題,需采用相應技…

深入理解 C++ 數據類型:從基礎到高級應用

C 是一種強類型語言&#xff0c;這意味著每個變量都必須有明確的數據類型&#xff0c;以便編譯器知道如何存儲和操作數據。數據類型決定了變量的內存占用、取值范圍以及可以執行的操作。理解 C 的數據類型是編寫高效、安全代碼的基礎。本文將全面介紹 C 的數據類型&#xff0c;…

補題:K - Magic Tree (Gym - 105231K)

來源&#xff1a;問題 - K - Codeforceshttps://codeforces.com/gym/105231/problem/K 題目描述&#xff1a; 一、題目分析 本題給定一個2行m列的網格&#xff0c;從(1, 1)格子開始進行深度優先搜索&#xff0c;每個格子可到達至少一個邊相鄰的格子且不重復訪問&#xff0c;…

【Prometheus-OracleDB Exporter安裝配置指南,開機自啟】

目錄 1. 安裝Oracle Instant Client1.1 解壓安裝包1.2 創建運行時鏈接 2. 環境配置2.1 設置環境變量2.2 驗證配置 3. 安裝Oracle DB Exporter3.1 創建工作目錄3.2 解壓安裝包3.3 添加執行權限 4. 數據庫監控配置4.1 創建監控用戶&#xff08;切換到Oracle所屬用戶&#xff09; …

溯因推理思維——AI與思維模型【92】

一、定義 溯因推理思維模型是一種從結果出發,通過分析、推測和驗證,尋找導致該結果的可能原因的思維方式。它試圖在已知的現象或結果基礎上,逆向追溯可能的原因,構建合理的解釋框架,以理解事物的本質和內在機制。 二、由來 溯因推理的思想可以追溯到古希臘哲學家亞里士…

Git 基本操作(二)

目錄 撤銷修改操作 情況一 情況二 情況三 刪除文件 升級git 撤銷修改操作 在日常編碼過程中&#xff0c;有些時候&#xff0c;我們可能寫著寫著發現目前的版本的代碼越寫越挫&#xff0c;越不符合標準&#xff0c;想讓我們當前的文件去恢復到上一次提交的版本…

java使用CMU sphinx語音識別

java使用CMU sphinx語音識別 一、pom依賴1、依賴dependency2、配置倉庫repository 二、下載中文資源包1、下載中文資源包&#xff08;需要其他語言的選擇對應的文件夾即可&#xff09;&#xff0c;中文選擇Mandarin2、將下載后的文件放到項目中3、代碼-識別wav語音文件4、代碼-…

企業內訓|智能駕駛與智能座艙技術——某汽車廠商

4月25日&#xff0c;東北某市&#xff0c;TsingtaoAI團隊為某汽車廠商的智能駕駛業務和研發團隊交付“智能駕駛與智能座艙技術”課程。本課程系統講解智能汽車兩大核心領域技術架構與實現路徑。課程涵蓋智能駕駛感知層&#xff08;激光雷達/毫米波雷達/視覺融合&#xff09;、決…

【數學建模國獎速成系列】優秀論文繪圖復現代碼(二)

文章目錄 國獎論文繪圖復現代碼&#xff0c;可直接運行柱狀圖橫向柱狀圖分組柱狀圖堆疊柱狀圖堆疊柱狀圖2三維柱狀圖完整復現代碼 國獎論文繪圖復現代碼&#xff0c;可直接運行 數模比賽的繪圖是非常重要得&#xff0c;這篇文章給大家分享我自己復現的國獎優秀論文的代碼&…

GitLab CVE-2024-12444 安全漏洞解決方案

本文分享極狐GitLab 補丁版本 17.11.1, 17.10.5, 17.9.7 的詳細內容。這幾個版本包含重要的缺陷和安全修復代碼&#xff0c;我們強烈建議所有私有化部署用戶應該立即升級到上述的某一個版本。對于極狐GitLab SaaS&#xff0c;技術團隊已經進行了升級&#xff0c;無需用戶采取任…

隨機微分方程(SDE):股票價格模型、利率模型的構建

隨機微分方程&#xff08;SDE&#xff09;&#xff1a;股票價格模型、利率模型的構建 一、隨機微分方程&#xff08;SDE&#xff09;基礎&#xff1a;從確定性到隨機性的擴展 1. 定義與一般形式 隨機微分方程&#xff08;SDE&#xff09;是包含布朗運動&#xff08;隨機項&am…

【MCP Node.js SDK 全棧進階指南】高級篇(1):MCP多服務器協作架構

隨著業務規模的不斷擴大和系統復雜度的提升,單一服務器架構往往無法滿足高并發、高可用性和彈性擴展的需求。在MCP生態系統中,多服務器協作架構成為構建大規模應用的必然選擇。本文將深入探討MCP TypeScript-SDK在多服務器環境下的部署、協作和管理,以及如何構建高可用、高性…

git 修改用戶名和郵箱

在 Git 中修改用戶名和郵箱地址是常見的任務&#xff0c;這可以確保你的提交記錄使用正確的身份信息。你可以通過簡單的命令來完成這一操作。 全局配置 修改全局用戶名 要修改全局的用戶名&#xff0c;請執行以下命令&#xff1a; git config --global user.name "New…

[算法學習]——通過RMQ與dfs序實現O(1)求LCA(含封裝板子)

每周五篇博客&#xff1a;&#xff08;3/5&#xff09; 碎碎念 其實不是我想多水一篇博客&#xff0c;本來這篇是歐拉序的博客&#xff0c;結果dfs序也是可以O1求lca的&#xff0c;而且常數更優&#xff0c;結果就變成這樣了。。。 前置知識 [算法學習]——dfs序 思想 分…