在这里插入图片描述

Redis在电商热点数据缓存中的最佳实践


一、热点数据定义与识别

1. 热点数据特征

  • 高频访问(QPS > 1000)
  • 数据规模适中(单条 < 10KB)
  • 数据变化频率低(更新间隔 > 5分钟)
  • 业务关键性高(直接影响核心流程)

2. 典型电商热点数据

数据类型示例访问特征
商品基础信息iPhone 15详情秒级千次访问
库存数据剩余库存数毫秒级万次查询
用户会话信息登录状态、购物车每次请求必查
热门商品列表首页热销排行榜每分钟万次访问
秒杀活动信息双11秒杀场次详情活动期间百万级QPS

3. 动态热点识别方案

// 基于滑动窗口的热点发现
public class HotKeyDetector {private final Map<String, AtomicLong> counter = new ConcurrentHashMap<>();private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();private static final int THRESHOLD = 1000; // 阈值:1000次/秒public void init() {executor.scheduleAtFixedRate(() -> {counter.entrySet().removeIf(entry -> {if (entry.getValue().get() > THRESHOLD) {reportHotKey(entry.getKey());return true;}return false;});}, 1, 1, TimeUnit.SECONDS);}public void increment(String key) {counter.computeIfAbsent(key, k -> new AtomicLong()).incrementAndGet();}
}

二、缓存架构设计

1. 多级缓存架构

首次访问
缓存穿透
缓存未命中
缓存命中
缓存命中
回写
回写
客户端
请求
本地缓存
分布式缓存
数据库
返回数据

2. 各层缓存配置

缓存层级技术选型容量过期策略
本地缓存Caffeine10万对象基于大小+访问时间(1分钟)
分布式缓存Redis Cluster1TB内存动态TTL+LRU淘汰
持久化存储MySQL+TiDB无限扩展事务保障

三、核心缓存策略实现

1. 缓存加载策略

// 三级缓存加载流程
public Product getProduct(String productId) {// 1. 检查本地缓存Product product = localCache.getIfPresent(productId);if (product != null) return product;// 2. 检查Redis缓存product = redisTemplate.opsForValue().get(productKey(productId));if (product != null) {localCache.put(productId, product);return product;}// 3. 回源数据库并写入缓存product = productDAO.get(productId);if (product != null) {redisTemplate.opsForValue().set(productKey(productId), product, 5, TimeUnit.MINUTES);localCache.put(productId, product);}return product;
}

2. 热点数据预热

// 定时任务预热Top100商品
@Scheduled(cron = "0 0 3 * * ?")
public void preloadHotProducts() {List<Product> hotProducts = productDAO.getTop100HotProducts();hotProducts.parallelStream().forEach(p -> {redisTemplate.opsForValue().set(productKey(p.getId()), p);localCache.put(p.getId(), p);});
}

3. 缓存更新策略

Database Message Queue Redis App 数据变更事件 通知变更 删除旧缓存 异步更新缓存 更新本地缓存 Database Message Queue Redis App

四、高性能存储方案

1. 数据结构优化
商品信息存储方案

// Hash结构存储商品详情
public void cacheProduct(Product product) {String key = productKey(product.getId());Map<String, String> hash = new HashMap<>();hash.put("name", product.getName());hash.put("price", product.getPrice().toString());hash.put("stock", String.valueOf(product.getStock()));redisTemplate.opsForHash().putAll(key, hash);redisTemplate.expire(key, 30, TimeUnit.MINUTES);
}// Pipeline批量获取
public List<Product> batchGetProducts(List<String> ids) {List<Product> products = new ArrayList<>();redisTemplate.executePipelined((RedisCallback<Object>) connection -> {ids.forEach(id -> connection.hGetAll(productKey(id).getBytes()));return null;}).forEach(rawData -> {products.add(parseProduct((Map<byte[], byte[]>) rawData));});return products;
}

2. 内存优化技巧

  • 数据压缩:启用Redis的LZF压缩
    # redis.conf
    rdbcompression yes
    
  • 编码优化:使用ziplist编码
    # 配置Hash使用ziplist
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    

3. 热点分片方案

// 基于商品ID的分片策略
public String shardedKey(String productId) {int shard = Math.abs(productId.hashCode()) % 1024;return "product:" + shard + ":" + productId;
}

五、异常场景处理

1. 缓存穿透防护

// 布隆过滤器实现
public class BloomFilter {private final RedisTemplate<String, Object> redisTemplate;private final String filterKey;private final int expectedInsertions;private final double fpp;public boolean mightContain(String key) {long[] hashes = hash(key);return redisTemplate.execute(conn -> {for (long hash : hashes) {if (!conn.getBit(filterKey, hash)) return false;}return true;});}private long[] hash(String key) {// 使用MurmurHash生成多个哈希值}
}

2. 缓存雪崩预防

// 随机过期时间
public void setWithRandomExpire(String key, Object value) {int baseExpire = 300; // 5分钟int randomRange = 120; // 2分钟int expire = baseExpire + new Random().nextInt(randomRange);redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
}

3. 缓存击穿处理

// 分布式锁保护
public Product getProductWithLock(String productId) {String lockKey = "lock:product:" + productId;RLock lock = redissonClient.getLock(lockKey);try {if (lock.tryLock(1, 5, TimeUnit.SECONDS)) {// 二次检查缓存Product product = getFromCache(productId);if (product != null) return product;// 数据库查询product = productDAO.get(productId);updateCache(product);return product;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}return null;
}

六、监控与调优

1. 关键监控指标

指标监控命令告警阈值
缓存命中率info stats keyspace_hits< 95%
内存使用率info memory used_memory> 80%
网络流量info stats total_net_input> 100MB/s
慢查询数量slowlog get> 50/分钟

2. 性能调优参数

# redis.conf优化配置
maxmemory 24gb
maxmemory-policy allkeys-lfu
timeout 300
tcp-keepalive 60
client-output-buffer-limit normal 0 0 0

3. JVM连接池配置

@Bean
public LettuceConnectionFactory redisConnectionFactory() {LettuceClientConfiguration config = LettuceClientConfiguration.builder().commandTimeout(Duration.ofMillis(500)).clientOptions(ClientOptions.builder().autoReconnect(true).publishOnScheduler(true).build()).clientResources(ClientResources.builder().ioThreadPoolSize(8).computationThreadPoolSize(4).build()).build();return new LettuceConnectionFactory(new RedisStandaloneConfiguration("redis-cluster", 6379), config);
}

七、生产环境验证

1. 压测数据

场景请求量平均延迟成功率
纯数据库查询500/s250ms98%
仅Redis缓存10万/s2ms100%
多级缓存架构20万/s0.5ms100%

2. 容灾演练方案

哨兵机制
失败
成功
模拟Redis宕机
故障检测
主从切换
客户端重连
验证数据完整性
熔断降级
恢复报警

八、最佳实践总结
  1. 数据分层存储:本地缓存+Redis+数据库的三层架构
  2. 动态热点发现:实时监控+自动缓存预热
  3. 高效数据结构:Hash存储商品信息,ZSET维护排行榜
  4. 智能过期策略:基础TTL+随机抖动防止雪崩
  5. 多级防护体系:布隆过滤器+分布式锁+熔断机制
  6. 持续监控调优:内存、命中率、网络流量三位一体监控

通过上述方案,可实现:

  • 99.99%可用性:完善的故障转移机制
  • 毫秒级响应:热点数据访问<1ms
  • 百万级QPS:支持大促峰值流量
  • 智能弹性:自动扩容缩容应对流量波动

更多资源:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文发表于【纪元A梦】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/85770.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85770.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85770.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8088单板机C语言sprintf()格式化串口输出---Prj04

#include "tiny_stdarg.h" // 使用自定义可变参数实现#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函数 / char str[]"Hello World! 20250531 Ve…

【面试】音视频面试

H.264 与 H.265 有什么区别&#xff1f; 1&#xff09;主要区别 H.265 也称为高效视频编码 (HEVC)&#xff0c;是 H.264 的升级和更高级的版本&#xff1b;H.265 的编码架构大致上 和 H.264 的架构相似&#xff0c;主要也包含&#xff1a;帧内预测&#xff08;intra predicti…

Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法

感谢原博主&#xff0c;此文参考网址&#xff1a;https://zhuanlan.zhihu.com/p/398279220 确保已经安装node.js &#xff08;官方网址&#xff1a;https://nodejs.org/zh-cn/download&#xff09; 首先在命令窗口执行命令安装windows-build-tools&#xff1a; npm install -…

git stash命令用法

git stash 是 Git 中一个非常有用的命令&#xff0c;它可以临时保存当前工作区的修改&#xff0c;让你可以切换到其他分支或者处理其他任务&#xff0c;而不需要提交这些还未完成的修改。 一、基本用法 1. 保存当前修改&#xff08;包括暂存区和工作区的内容&#xff09; git…

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…

2025年目前最新版本Android Studio自定义xml预览的屏幕分辨率

一、前言 在实际开发项目当中&#xff0c;我们的设备的分辨率可能会比较特殊&#xff0c;AS并没有自带这种屏幕分辨率的设备&#xff0c;但是我们又想一边编写XML界面&#xff0c;一边实时看到较为真实的预览效果&#xff0c;该怎么办呢&#xff1f;在早期的AS版本中&#xff…

Edge Databases:赋能分布式计算环境

Edge 计算通过将数据处理推向数据源头彻底改变了传统计算范式。随着物联网设备、移动应用和分布式系统的大规模部署&#xff0c;面向边缘场景优化的数据库解决方案已成为关键技术需求。这类专用数据库能够在算力有限、内存受限且网络连接不稳定的终端设备上稳定运行&#xff0c…

Pluto论文阅读笔记

主要还是参考了这一篇论文笔记&#xff1a;https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三个创新点&#xff1a; 横向纵向用lane的query来做将轨迹投回栅格化地图&#xff0c;计算碰撞loss对数据进行正增强和负增强&#xff0c;让正增强的结果也无增强的结果相近&a…

【计算机网络】传输层UDP协议

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【计算机网络】应用层协议Http——构建Http服务服务器 &#x1f516;流水不争&#xff0c;争的是滔滔不…

「Java教案」顺序结构

课程目标 1&#xff0e;知识目标 能够正确使用Java顺序结构的基本语法&#xff0c;例如变量的声明、变量的赋值、表达式的计算、数据的输出。能够正确使用顺序结构的执行规则及其在程序中的作用&#xff0c;解决实际问题。 2&#xff0e;能力目标 能够独立完成顺序结构程序…

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…

GO语言----基础类型取别名

文章目录 取别名示例注意事项 Go语言中使用type关键字为基础类型取别名。 type是Go语言中用于定义新类型的关键字&#xff0c;它提供了强大的类型定义能力。 取别名示例 type MyInt int注意事项 这创建了一个新类型MyInt&#xff0c;它底层是int类型&#xff0c;但与int是不同…

服务端定时器的学习(一)

一、定时器 1、定时器是什么&#xff1f; 定时器不仅存在于硬件领域&#xff0c;在软件层面&#xff08;客户端、网页和服务端&#xff09;也普遍应用&#xff0c;核心功能都是高效管理大量延时任务。不同应用场景下&#xff0c;其实现方式和使用方法有所差异。 2、定时器解…

Mac版本Android Studio配置LeetCode插件

第一步&#xff1a;Android Studio里面找到Settings&#xff0c;找到Plugins&#xff0c;在Marketplace里面搜索LeetCode Editor。 第二步&#xff1a;安装对应插件&#xff0c;并在Tools->LeetCode Plugin页面输入帐号和密码。 理论上&#xff0c;应该就可以使用了。但是&a…

【ISP算法精粹】动手实战:用 Python 实现 Bayer 图像的黑电平校正

在数字成像领域&#xff0c;图像信号处理器&#xff08;ISP&#xff09;如同幕后英雄&#xff0c;默默将传感器捕获的原始数据转化为精美的图像。而黑电平校正&#xff0c;作为ISP预处理流程中的关键一环&#xff0c;直接影响着最终图像的质量。今天&#xff0c;我们就通过Pyth…

Oracle OCP与MySQL OCP认证如何选?

认证本质与定位差异 Oracle OCP Oracle OCP是Oracle公司推出的旗舰级数据库专家认证&#xff0c;专注于其核心的闭源商业数据库技术体系。核心领域包括RAC&#xff08;Real Application Clusters&#xff09;高可用集群、Data Guard容灾解决方案、Exadata数据库一体机集成以及…

MVVM、MVC的区别、什么是MVVM

一、什么是MVVM &#xff08;一&#xff09;定义 MVVM是Model - View - ViewModel的缩写&#xff0c;它是一种软件架构设计模式&#xff0c;主要用于构建用户界面。这种模式将应用程序分为三个主要部分&#xff1a; Model&#xff08;模型层&#xff09; 它是应用程序中负责…

【SpringCache 提供的一套基于注解的缓存抽象机制】

Spring 缓存&#xff08;Spring Cache&#xff09;是 Spring 提供的一套基于注解的缓存抽象机制&#xff0c;常用于提升系统性能、减少重复查询数据库或接口调用。 ✅ 一、基本原理 Spring Cache 通过对方法的返回结果进行缓存&#xff0c;后续相同参数的调用将直接从缓存中读…

HRI-2025 | 大模型驱动的个性化可解释机器人人机交互研究

作者&#xff1a;Ferran Gebelli 1 ^{1} 1, Lavinia Hriscu 2 ^{2} 2, Raquel Ros 1 ^{1} 1, Sverin Lemaignan 1 ^{1} 1, Alberto Sanfeliu 2 ^{2} 2, Anais Garrell 2 ^{2} 2单位&#xff1a; 1 ^{1} 1PAL Robotics&#xff0c; 2 ^{2} 2IRI (UPC-CSIC)论文标题&#xff1a;P…

Gitee Wiki:重塑关键领域软件研发的知识管理范式

在数字化转型浪潮席卷全球的当下&#xff0c;关键领域软件研发正面临前所未有的知识管理挑战。传统文档管理模式的局限性日益凸显&#xff0c;知识传承的断层问题愈发严重&#xff0c;团队协作效率的瓶颈亟待突破。Gitee Wiki作为新一代知识管理平台&#xff0c;正在通过技术创…