熱點Key拆分方案實現

熱點Key拆分方案實現

一、核心拆分策略

熱點Key拆分的核心思想是將單個高頻訪問Key分解為多個子Key,分散存儲到不同Redis節點,降低單節點壓力。以下是具體實現方案:

二、實現方式
1. 業務層哈希分片實現

創建Key分片工具類,通過哈希取模方式分散Key:

package plus.gaga.infrastructure.redis;import org.springframework.util.StringUtils;public class KeyShardingUtil {// 分片數量,建議與Redis節點數保持一致private static final int SHARD_COUNT = 16;/*** 生成分片Key* @param originalKey 原始Key* @param shardParam 分片參數(如用戶ID、商品ID等)* @return 分片后的Key*/public static String generateShardingKey(String originalKey, String shardParam) {if (StringUtils.isEmpty(originalKey) || StringUtils.isEmpty(shardParam)) {throw new IllegalArgumentException("Key and shardParam cannot be empty");}// 基于分片參數哈希取模int shardIndex = Math.abs(shardParam.hashCode()) % SHARD_COUNT;return originalKey + ":shard:" + shardIndex;}
}
2. 在服務層應用分片Key

修改,對熱點活動Key進行拆分:

// ... existing code ...
import plus.gaga.infrastructure.redis.KeyShardingUtil;@Slf4j
@Service
public class LotteryStrategyServiceImpl implements LotteryStrategyService {// ... existing code ...@Overridepublic boolean tryAcquire(String activityId, String userId) {// 對熱點活動ID進行分片String shardingKey = KeyShardingUtil.generateShardingKey("limit:strategy:" + activityId, userId);long timestamp = System.currentTimeMillis();String member = userId + "_" + timestamp;Long result = redisTemplate.execute(rateLimitScript,Collections.singletonList(shardingKey),1000, // 每分片QPStimestamp,member,60 // 窗口時間(秒));return result != null && result == 1;}// 熱點數據查詢示例@Overridepublic ActivityVO queryActivity(String activityId, String userId) {// 1. 嘗試從本地緩存獲取ActivityVO localActivity = localCache.get(activityId);if (localActivity != null) {return localActivity;}// 2. 從Redis分片查詢String shardingKey = KeyShardingUtil.generateShardingKey("activity:" + activityId, userId);ActivityPO activityPO = (ActivityPO) redisTemplate.opsForValue().get(shardingKey);// 3. 緩存預熱到本地if (activityPO != null) {localCache.put(activityId, convert(activityPO), Duration.ofMinutes(5));return convert(activityPO);}// 4. 從數據庫查詢并回填緩存activityPO = activityMapper.selectById(activityId);if (activityPO != null) {redisTemplate.opsForValue().set(shardingKey, activityPO, Duration.ofHours(1));localCache.put(activityId, convert(activityPO), Duration.ofMinutes(5));return convert(activityPO);}return null;}
}
3. Redis集群配置

在application.yml中配置Redis集群,確保分片Key分布到不同節點:

spring:redis:cluster:nodes:- 192.168.1.101:6379- 192.168.1.102:6379- 192.168.1.103:6379max-redirects: 3lettuce:pool:max-active: 16max-idle: 8min-idle: 4
三、高級優化策略
1. 動態分片調整

實現分片數量動態調整,應對流量變化:

// 在KeyShardingUtil中添加動態調整方法
public static void setShardCount(int count) {if (count > 0) {SHARD_COUNT = count;}
}
2. 熱點檢測與自動分片

集成熱點Key檢測,自動對超過閾值的Key進行分片:

@Component
public class HotKeyMonitor {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Scheduled(fixedRate = 60000) // 每分鐘檢測一次public void monitorHotKeys() {// 獲取Redis熱點Key列表List<String> hotKeys = getHotKeysFromRedis();for (String key : hotKeys) {if (needSharding(key)) {// 自動分片處理shardHotKey(key);}}}
}
3. 讀寫分離增強

結合讀寫分離,將分片讀請求分散到從節點:

// 配置讀寫分離RedisTemplate
@Bean
public RedisTemplate<String, Object> readWriteSplitRedisTemplate() {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(readWriteSplitConnectionFactory());// 其他配置...return template;
}
四、注意事項
  1. 數據一致性:拆分后的Key需要同步更新,可使用Redis事務或分布式鎖保證
  2. 分片粒度:根據業務場景調整分片數量(SHARD_COUNT),建議設置為Redis節點數的2-4倍
  3. 本地緩存:結合Caffeine等本地緩存框架,減少跨節點查詢
  4. 監控告警:通過Prometheus監控各分片Key的訪問頻率,設置閾值告警
  5. 回滾機制:設計分片失敗的降級方案,確保系統可用性

通過以上方案,可有效將熱點Key的訪問壓力分散到多個Redis節點,提升系統整體吞吐量和穩定性。

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

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

相關文章

程序人生,人生如戲

程序員的出路在哪里 很多計算機科班出身&#xff08;也有轉行的&#xff09;同學&#xff0c;第一份工作都是研發&#xff0c;測試&#xff0c;項目管理之類的工作&#xff0c;這里面最多的應該就是從事研發相關的崗位。那我們就以研發崗來舉例&#xff0c;聊聊我職業生涯從業…

傳感器:基于STM32F103/407系AHT20溫濕度傳感器數據采集

一、IIC總線 1、IIC總線概念 I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;總線是由PHILIPS公司開發的兩線式串行總線&#xff0c;用于連接微控制器及其外圍設備。是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式&#xff0c;具有…

很好,搞搞期末

我要開始啦&#xff01;bulabulabulabulabula. 例題 物理地址DS*16有效地址 1.直接尋址 2.直接尋址&#xff08;允許符號代替數值&#xff0c;變量存的地址&#xff09; 3.基址尋址&#xff08;16位&#xff1a;用寄存器SI、DI、BX、BP存的有效地址&#xff09; 下面是寄存器…

機器人如何實現智能化的自主定位與導航?

機器人實現智能化自主定位與導航&#xff0c;需融合多傳感器數據、高效算法及硬件支撐&#xff0c;以下從技術框架、核心技術、典型應用場景等方面詳細解析&#xff1a; 一、技術框架&#xff1a;定位與導航的核心環節 機器人自主定位導航通常包含三個關鍵步驟&#xff0c;形…

AI醫療行業全景圖

AI醫療是以互聯網為依托&#xff0c;通過基礎設施的搭建及數據的收集&#xff0c;將人工智能技術及大數據服務應用于醫療行業中&#xff0c;提升醫療行業的診斷效率及服務質量&#xff0c;更好的解決醫療資源短缺、人口老齡化的問題AI在醫療領域應用廣泛&#xff0c;覆蓋醫療服…

Meta-KDD2025-RPG-token級別并行生成式提高效率!

文章目錄 1. 背景2. 方法2.1 長語義id2.1.1 獲取 item embedding2.1.2 item embedding 離散化 2.2 并行生成語義 id2.2.1 訓練&#xff08;item串行&#xff0c;token并行&#xff09;2.2.2 高效 logit 打分暴力枚舉式打分&#xff1a;高效實現&#xff1a;復雜度分析&#xff…

快速搭建MySQL8.0本地數據庫,連接idea

1.打開終端&#xff0c;按順序輸入命令&#xff0c;在root用戶下&#xff0c;創建用戶和數據庫 1.進入數據庫 mysql -u root -p 2.創建專用數據庫 create database 數據庫名 character set utf8mb4 3.使用數據庫 use 數據庫名 4.設置此數據庫用戶 create user "用戶名&q…

Docker 常用運維命令

Docker 提供了一系列命令來幫助開發者和運維人員管理容器、鏡像以及其他 Docker 對象。以下是一些常用的 Docker 運維命令&#xff0c;這些命令可以幫助你更高效地進行日常操作&#xff1a; 容器相關命令 啟動容器&#xff1a; docker start <container_id_or_name>停止…

linux下MQTT訂閱發布驗證-mosquitto安裝測試流程

本文詳細介紹了&#xff0c;如何在linux環境搭建一個MQTT server, 并同時安裝 了客戶端 &#xff0c;進行了mqtt消息發布、訂閱驗證。 mosquitto 服務端安裝(ubuntu) #添加源 sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo apt update # install mosquitto su…

Source Insight 的簡單介紹

對 Source Insight 進行一次全面深入的介紹。這款軟件在特定開發者群體中&#xff08;尤其是嵌入式、驅動、系統級編程領域&#xff09;享有極高的聲譽&#xff0c;被譽為“源碼閱讀和分析的神器”。 一、 起源與歷史 誕生背景 (1990年代中后期)&#xff1a; 在1990年代中后期…

Linux 系統中,查詢 JDK 的安裝目錄

在 Linux 系統中&#xff0c;查詢 JDK 的安裝目錄可以通過以下幾種常用方法&#xff1a; 方法 1&#xff1a;通過 update-alternatives 查詢&#xff08;推薦&#xff09; 適用于通過包管理器&#xff08;如 apt/yum&#xff09;安裝的 JDK&#xff1a; sudo update-alternat…

簡單工廠、工廠、抽象工廠模式

簡單工廠、工廠、抽象工廠模式 1. **簡單工廠模式&#xff08;Simple Factory&#xff09;**2. **工廠方法模式&#xff08;Factory Method&#xff09;**3. **抽象工廠模式&#xff08;Abstract Factory&#xff09;**對比總結 以下是三種工廠模式在C#中的實現與對比分析&…

如何在Redis中實現緩存功能

Redis 是一種高性能的鍵值存儲系統&#xff0c;廣泛用于實現緩存功能。它通過將數據存儲在內存中&#xff0c;能夠快速讀寫數據&#xff0c;從而顯著提高應用程序的性能。在Redis中實現緩存功能需要結合數據讀寫策略、失效機制及性能優化方案。 一、Redis作為緩存的核心優勢 …

Kafka消費者客戶端源碼深度解析:從架構到核心流程

在Kafka生態系統中&#xff0c;消費者客戶端作為數據消費的入口&#xff0c;其設計與實現直接影響數據處理的效率和可靠性。本文將深入Kafka消費者客戶端源碼&#xff0c;通過核心組件解析、流程拆解與源碼分析&#xff0c;揭示其高性能消費背后的技術奧秘&#xff0c;并輔以架…

從0開始學習R語言--Day26--因果推斷

很多時候我們在探討數據的相關性問題時&#xff0c;很容易會忽略到底是數據本身的特點還是真的是因為特征的區分導致的不同&#xff0c;從而誤以為是特征起的效果比較大。 這就好比測試一款新藥是否真的能治病&#xff0c;假如吃藥的患者康復的更快&#xff0c;那到底是因為藥…

Python 中布爾值的使用:掌握邏輯判斷的核心

在 Python 中&#xff0c;布爾值&#xff08;bool&#xff09;是進行邏輯判斷的基礎。布爾值只有兩個可能的值&#xff1a;True 和 False。通過布爾值&#xff0c;你可以實現條件判斷、循環控制以及其他邏輯操作。今天&#xff0c;就讓我們一起深入探討如何在 Python 中使用布爾…

IDEA 中 Tomcat 部署 Java Web 項目(Maven 多模塊 非 Maven 通用版)(linux+windows)

引言 Java Web 開發中&#xff0c;Tomcat 是最常用的 Servlet 容器&#xff0c;而項目類型通常分為 Maven 管理&#xff08;依賴自動處理、多模塊聚合&#xff09; 和 非 Maven 純手工管理&#xff08;手動引入 jar 包、配置項目結構&#xff09;。本文覆蓋 兩種項目類型 的 T…

使用 React Native Web 實現三端統一開發

使用 React Native Web 實現三端統一開發 關鍵點 React Native Web 簡介&#xff1a;React Native Web 是一個允許開發者使用 React Native 組件和 API 構建 Web 應用的庫&#xff0c;支持在 iOS、Android 和 Web 上使用同一套代碼。架構&#xff1a;通過 React DOM 渲染 Rea…

分享一個git上基于std::array實現的循環隊列(Cycle Queue)模板類庫

為充分利用向量空間,克服“假溢出”現象的方法是:將向量空間想象為一個首尾相接的圓環,并稱這種向量為循環向量。存儲在其中的隊列稱為循環隊列(Circular Queue)。循環隊列是把順序隊列首尾相連,把存儲隊列元素的表從邏輯上看成一個環,成為循環隊列。 網上有很多關于循…

三維視頻融合平臺:如何構建動態感知的數字空間

分享大綱&#xff1a; 你的三維平臺為何不能承載動態視頻捷碼打造三維視頻融合平臺的三步法則為何選擇捷碼 在智慧城市建設過程中&#xff0c;將實時視頻與三維空間結合&#xff0c;已經成為一種主流趨勢。傳統視頻監控模式&#xff0c;經常面臨視頻分散、操作復雜等問題。然而…