当前位置: 首页 > news >正文

分布式缓存实战:Redis与多级缓存架构的完整指南

分布式缓存实战Redis与多级缓存架构的完整指南大家好我是迪哥。缓存是提升系统性能的关键组件从本地缓存到分布式缓存从 Redis 到多级缓存架构我们经历了多次优化。今天就聊聊分布式缓存的最佳实践。多级缓存架构┌─────────────────────────────────────────────────────────────┐ │ 多级缓存架构 │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 本地缓存 │ │ Redis │ │ 数据库 │ │ │ │ Caffeine │ │ 分布式缓存 │ │ MySQL │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 应用层 │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘本地缓存Caffeine配置示例Configuration public class CaffeineConfig { Bean public CacheString, Object localCache() { return Caffeine.newBuilder() .initialCapacity(1000) .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .expireAfterAccess(5, TimeUnit.MINUTES) .recordStats() .build(); } }使用示例Service public class UserService { Autowired private CacheString, User localCache; Autowired private StringRedisTemplate redisTemplate; Autowired private UserMapper userMapper; public User getUser(Long userId) { String key user: userId; // 1. 先查本地缓存 User user localCache.getIfPresent(key); if (user ! null) { return user; } // 2. 再查 Redis String json redisTemplate.opsForValue().get(key); if (json ! null) { user JSON.parseObject(json, User.class); localCache.put(key, user); return user; } // 3. 最后查数据库 user userMapper.selectById(userId); if (user ! null) { redisTemplate.opsForValue().set(key, JSON.toJSONString(user), 30, TimeUnit.MINUTES); localCache.put(key, user); } return user; } }Redis 缓存优化缓存策略public enum CacheStrategy { READ_THROUGH, // 读穿透 WRITE_THROUGH, // 写穿透 WRITE_BEHIND, // 写回 CACHE_ASIDE; // 旁路缓存最常用 }缓存更新模式Service public class CacheService { Autowired private StringRedisTemplate redisTemplate; // 模式1先更新数据库再删除缓存 public void updateUser1(User user) { userMapper.updateById(user); redisTemplate.delete(user: user.getId()); } // 模式2先删除缓存再更新数据库 public void updateUser2(User user) { redisTemplate.delete(user: user.getId()); userMapper.updateById(user); } // 模式3延迟双删解决并发问题 Async public void updateUser3(User user) { redisTemplate.delete(user: user.getId()); userMapper.updateById(user); // 延迟一段时间后再次删除 try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } redisTemplate.delete(user: user.getId()); } }缓存问题解决问题 1缓存穿透// 使用布隆过滤器 Component public class BloomFilterService { private final BloomFilterLong userFilter; public BloomFilterService() { userFilter BloomFilter.create( Funnels.longFunnel(), 1000000, // 预计元素数量 0.01 // 误判率 ); // 初始化过滤器 ListLong userIds userMapper.selectAllIds(); userIds.forEach(userFilter::put); } public boolean mightContain(Long userId) { return userFilter.mightContain(userId); } }问题 2缓存击穿Service public class ProductService { Autowired private StringRedisTemplate redisTemplate; private final MapString, Object locks new ConcurrentHashMap(); public Product getProduct(Long productId) { String key product: productId; // 先查缓存 String json redisTemplate.opsForValue().get(key); if (json ! null) { return JSON.parseObject(json, Product.class); } // 加锁防止缓存击穿 synchronized (locks.computeIfAbsent(key, k - new Object())) { try { // 双重检查 json redisTemplate.opsForValue().get(key); if (json ! null) { return JSON.parseObject(json, Product.class); } // 查数据库 Product product productMapper.selectById(productId); if (product ! null) { redisTemplate.opsForValue().set(key, JSON.toJSONString(product), 5, TimeUnit.MINUTES); } return product; } finally { locks.remove(key); } } } }问题 3缓存雪崩// 解决方案设置随机过期时间 public void setCacheWithRandomTTL(String key, Object value) { int ttl 30 ThreadLocalRandom.current().nextInt(30); // 30-60分钟 redisTemplate.opsForValue().set(key, JSON.toJSONString(value), ttl, TimeUnit.MINUTES); }最佳实践清单维度最佳实践多级缓存本地缓存 Redis 数据库缓存策略旁路缓存模式更新模式先更新数据库再删除缓存并发问题延迟双删 分布式锁监控监控缓存命中率、热点Key说到缓存我家那只叫 Docker 的哈士奇最近学会了缓存策略——把喜欢的玩具藏在沙发底下本地缓存饿了才去狗粮碗数据库找吃的这缓存命中率比我们的 Redis 还高 我是迪哥我们下期再见
http://www.rkmt.cn/news/1301631.html

相关文章:

  • 多智能体元学习框架Metaclaw:原理、实现与工程实践
  • 3个关键技术解决Linux硬件监控难题:lm-sensors项目深度解析
  • 从零到一:用winget-install解锁Windows命令行包管理新体验
  • 从零构建AI智能体:核心架构、ReAct模式与工程实践全解析
  • 为什么有些面试问得很细,最后没结果;有些聊得很轻松,却很快发 Offer?
  • 从零构建开源智能体:基于LangChain与Playwright的网页监控实战
  • NVIDIA NemoClaw:一键自动化部署AI大模型,从Hugging Face到生产级推理服务
  • 自托管链接管理平台Linko:Go+React技术栈部署与核心功能解析
  • 基于GitHub Actions的自动化代码质量守护:CodeBuddy实战指南
  • VSCode插件技术债务清理:提升开发环境性能的实践指南
  • Claude思维链=人类前额叶模拟?神经符号AI专家首曝其3层隐式认知架构
  • 2026年4月市面上优秀的316L不锈钢工字钢厂商推荐,316L不锈钢工字钢,316L不锈钢工字钢生产厂家有哪些 - 品牌推荐师
  • 【STC8H】GPIO模式深度解析:从准双向到推挽,如何精准控制外设
  • CFD工程师必看:TVD格式选型指南——从SUPERBEE到UMIST,哪个才是你的菜?
  • 生物医学NER技术:编码器与LLM模型对比分析
  • 大模型自学习实践:从数据构建到QLoRA微调的完整闭环
  • CircuitPython嵌入式开发实战:从环境搭建到I2C通信与电源管理
  • 构建高可用游戏自动化技能库:从图像识别到工程化实践
  • 86.人工智能实战:LLM 成本异常怎么排查?从账单暴涨到 Token、模型、租户、任务四维归因
  • 飞书自动化工具feishu-atuo:Python积木式开发与实战指南
  • faah:轻量级自动化任务编排器,简化运维与数据处理工作流
  • 伴侣情绪不稳定,经常忽冷忽热折磨你怎么办?
  • 微软RPG-ZeroRepo:零仓库架构与AI驱动游戏开发实践
  • 基于Feather M0与DotStar LED打造可穿戴动态光效护腕全攻略
  • 基于Claude 3的智能体编排框架:构建复杂AI工作流的核心原理与实践
  • 【Midjourney图像生成黑科技】:树胶重铬酸盐工艺原理、复刻难点与AI艺术胶片质感还原全流程指南
  • Lua-RTOS-ESP32:用脚本语言快速开发物联网硬件的实践指南
  • 第9篇 消息不丢:三端协同防丢失方案
  • 基于MCP协议构建本地化技术文档翻译服务器实战指南
  • 基于nRF52与BLE实现无线MIDI控制器:从原理到实践