JAVA语言企业项目实战(四)

简介: 教程来源 http://oplhc.cn/category/artificial-intelligence.html 本节详解秒杀系统缓存优化:通过Redis预热热点数据降低数据库压力;针对缓存穿透(空值缓存)、击穿(分布式锁+双重检查)、雪崩(随机过期时间)三大问题,提供可落地的解决方案,全面提升系统并发性能与稳定性。

第四部分:缓存与性能优化:让系统飞起来

4.1 Redis缓存策略:热点数据预热
秒杀活动开始前,需要将商品信息预热到Redis中。

@Service
public class CacheService {

    @PostConstruct
    public void initCache() {
        log.info("开始预热商品缓存...");
        List<SeckillGoods> goodsList = seckillGoodsMapper.selectList(null);

        for (SeckillGoods goods : goodsList) {
            // 缓存商品详情
            String goodsKey = "seckill:goods:" + goods.getId();
            redisTemplate.opsForValue().set(goodsKey, goods, 1, TimeUnit.HOURS);

            // 缓存商品库存(用于秒杀预减)
            String stockKey = "seckill:stock:" + goods.getId();
            redisTemplate.opsForValue().set(stockKey, goods.getStockCount());

            log.info("缓存商品: id={}, stock={}", goods.getId(), goods.getStockCount());
        }
    }
}

为什么需要预热?
秒杀开始时,大量请求会查询商品信息
如果缓存是空的,所有请求都会打到数据库,数据库瞬间被打垮
预热让缓存提前准备好,数据库压力大大降低

4.2 缓存三大问题及解决方案
问题一:缓存穿透
缓存穿透是指查询一个不存在的数据。由于缓存中没有,请求会直接打到数据库。恶意攻击者可以利用这一点,用大量不存在的key攻击系统。
解决方案:缓存空值

public SeckillGoods getGoods(Long goodsId) {
    // 先从缓存获取
    SeckillGoods goods = redisTemplate.opsForValue().get("goods:" + goodsId);
    if (goods != null) {
        return goods;
    }

    // 缓存没有,查询数据库
    goods = seckillGoodsMapper.selectById(goodsId);

    if (goods != null) {
        // 存在,写入缓存
        redisTemplate.opsForValue().set("goods:" + goodsId, goods);
    } else {
        // 不存在,缓存空对象(设置较短过期时间)
        redisTemplate.opsForValue().set("goods:" + goodsId, new SeckillGoods(), 60);
    }

    return goods;
}

问题二:缓存击穿

缓存击穿是指一个热点key过期瞬间,大量请求同时打到数据库。

解决方案:分布式锁

public SeckillGoods getGoodsWithLock(Long goodsId) {
    SeckillGoods goods = redisTemplate.opsForValue().get("goods:" + goodsId);
    if (goods != null) {
        return goods;
    }

    // 尝试获取锁
    RLock lock = redissonClient.getLock("goods:lock:" + goodsId);
    if (lock.tryLock()) {
        try {
            // 双重检查
            goods = redisTemplate.opsForValue().get("goods:" + goodsId);
            if (goods != null) {
                return goods;
            }

            // 查询数据库
            goods = seckillGoodsMapper.selectById(goodsId);
            redisTemplate.opsForValue().set("goods:" + goodsId, goods);
        } finally {
            lock.unlock();
        }
    } else {
        // 等待一小段时间后重试
        Thread.sleep(100);
        return getGoodsWithLock(goodsId);
    }

    return goods;
}

问题三:缓存雪崩

缓存雪崩是指大量缓存同时过期,导致数据库压力骤增。

解决方案:随机过期时间

// 设置随机过期时间,避免同时失效
int randomTtl = 3600 + new Random().nextInt(600);  // 3600~4200秒
redisTemplate.opsForValue().set(key, value, randomTtl, TimeUnit.SECONDS);

来源:
http://oplhc.cn/

相关文章
|
1月前
|
消息中间件 缓存 NoSQL
JAVA语言企业项目实战(一)
教程来源 http://oplhc.cn/ 本文深入剖析电商秒杀系统的设计与实现,直击高并发、数据一致性、系统稳定性等Java企业级开发核心挑战。涵盖单体→缓存→异步→微服务四阶段架构演进,详解库存防超卖、热点优化、限流降级等关键技术,助你打造高性能、高可用的实战级系统。
|
1月前
|
NoSQL Java Redis
JAVA语言企业项目实战(六)
教程来源 http://qcycj.cn/category/jiujieshao.html 本文详解秒杀系统部署与运维实践:涵盖Docker容器化、Docker Compose一键编排、Prometheus监控告警;总结核心思想——流量控制、缓存为王、最终一致性;解析超卖防护、高可用保障等面试要点,并探讨架构演进的务实原则。
|
1月前
|
消息中间件 NoSQL Java
JAVA语言企业项目实战(三)
教程来源 http://oplhc.cn/category/tech-trends.html 本文详解秒杀系统核心实现:对比数据库乐观锁、Redis预减库存+异步下单、分布式锁+Lua脚本三种方案,涵盖高并发选型与一致性权衡;统一响应格式、全局异常处理保障健壮性;结合消息队列削峰填谷,确保高性能与数据最终一致。
|
1月前
|
存储 Java 数据库
JAVA语言企业项目实战(二)
教程来源 http://oplhc.cn/category/hardware-review.html 本节详解秒杀系统数据库设计:强调读写分离、热点隔离、冗余字段与索引优化;详述用户、秒杀商品、订单及记录四张核心表结构,含BCrypt加密、乐观锁、唯一约束等关键设计;并给出HikariCP连接池合理配置策略。
|
1月前
|
存储 运维 监控
智算中心建设项目一般过程解析
智算中心是支撑AI、大数据发展的新型算力基础设施。九章云极主导建设运营,覆盖立项、设计、部署等六阶段全流程,3年内目标纳管10万P算力。(239字)
|
2月前
|
消息中间件 弹性计算 监控
在阿里云上搭建低延迟行情监控系统(WebSocket实战)
本文详解如何在阿里云ECS(Ubuntu 22.04)上用Python构建生产级WebSocket行情客户端:支持自动重连、心跳保活、多市场(股票/加密货币)实时订阅,并通过消息队列解耦处理,显著提升稳定性与低延迟。
|
1月前
|
缓存 自然语言处理 API
企业为什么还要继续评估 Claude
在多模型时代,Claude并未淡出企业视野,反而因其在长上下文理解、复杂分析、代码辅助等关键任务中的稳定表现,持续承担核心链路角色。企业评估重点已从“单次效果”转向“系统位置与长期价值”,更关注其在知识处理、治理兼容性及架构适配中的不可替代性。
|
1月前
|
人工智能 Prometheus 监控
Python+AI实战:从零构建智能图像识别系统(三)
教程来源 https://yyvgt.cn/category/jiuwenhua.html 本文构建了完整的智能商品分类系统,涵盖数据处理、EfficientNet模型训练(支持AMP、EMA、早停)、ONNX/TensorRT优化、FastAPI部署、Celery异步任务、Prometheus监控、A/B测试及主动学习等全链路AI工程实践。
|
1月前
|
缓存 Java 数据库
Java进阶之路:从初级开发到高级工程师的能力提升指南
很多Java初学者在掌握了基础语法和核心特性后,都会陷入一个困惑:如何从初级开发工程师,逐步成长为高级Java开发工程师?
162 1
|
1月前
|
存储 架构师 前端开发
鸿蒙架构师修炼之道-B/S与C/S架构
鸿蒙架构师修炼之道-B/S与C/S架构 鸿蒙架构师修炼之道-B/S与C/S架构 鸿蒙架构师修炼之道-B/S与C/S架构
245 0
鸿蒙架构师修炼之道-B/S与C/S架构