热点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;经常面临视频分散、操作复杂等问题。然而…