当下热点词再学:redis缓存预热、更新、降级,限流

本文深入探讨缓存预热、更新及降级策略,解析系统冷启动解决方案,详解缓存更新中数据一致性问题,以及在高并发场景下如何通过缓存降级和限流保障核心服务稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

愿打开此篇对你有所帮助。

在这里插入图片描述

依然还在考试,但是想着不能一直水,所以就写这一篇。

之前写的带上问题来学redis,看到不吃亏(什么是redis?缓存问题、数据一致性、redis配置文件汉化版) 反响还不错,不过我发现少了预热和降级,这不,补上。

缓存预热

系统冷启动

当系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,很有可能在上线当天就会宕机,这种情况就叫“系统冷启动”,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为"缓存预热"。

解决方案

提前给redis中嵌入部分数据,再提供服务。 这宛如一句feihua,但是却也是行之有效的好办法。
那如何实施?

肯定不可能将所有数据都写入redis,因为数据量太大了,第一耗费的时间太长了,第二redis根本就容纳不下所有的数据。

所以,就.需要更具当天的具体访问情况,统计出频率较高的热数据。

然后将访问频率较高的热数据写入到redis,如果说热数据也比较多,我们也得多个服务并行的读取数据去写,并行的分布式的缓存预热。

然后将嵌入的热数据的redis对外提供服务,这样就不至于冷启动,直接让数据库崩溃了。

缓存更新

缓存服务(Redis)和数据服务(底层数据库)是相互独立且异构的系统,在更新缓存或更新数据的时候无法做到原子性的同时更新两边的数据,因此在并发读写或第二步操作异常时会遇到各种数据不一致的问题。如何解决并发场景下更新操作的双写一致是缓存系统的一个重要知识点。

即数据一致性,在开头的那篇博客里已经讲得挺详尽了。

那就再提一嘴,延时双删,这里就不展开了,挺多的。

缓存降级

巴拉巴拉一大堆,就是压力过大服务器扛不住了呗,需要适当的取舍。

降级:就是在高并发高负载情况下,选择动态的关闭一下不重要的服务,拒绝访问等,来为重要的服务节省资源,比如电商平台秒杀当天可关闭推荐等功能。

降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。

在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:

(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

(2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;

(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;

(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

限流

如果降级解决不了的压力,那就只有限流了。
限流之前在MQ的那篇文章里面有讲过:消息队列:解耦、异步、削峰,现有MQ对比以及新手入门该如何选择MQ?

限流:就相当于调整水龙头的大小,使得访问请求量控制在一定范围。
对于比较关键又高并发的服务,比如秒杀,不能通过缓存和降级方式解决,至少不够解决太大并发量。这时候就需要限流了。

上面那篇已经详尽,就不多说啦。



今天的分享就到这里,又要苦哈哈的去复习准备考试了,,,

各位若不嫌,可以赞评关注,那我就极大的开心啦!!!

在这里插入图片描述
在这里插入图片描述

### **Redis 缓存预热的实现方法与最佳实践** #### **一、缓存预热核心概念** 缓存预热指**系统启动前/高峰期前**,提前将热点数据加载到Redis,避免首请求直接击穿数据库。 #### **二、常见预热方案** 1. **定时任务预热** - **实现方式**: ```python # 示例:用Celery定时预热 @periodic_task(run_every=crontab(hour=3)) # 每天凌晨3点执行 def cache_warmup(): hot_data = db.query("SELECT * FROM products WHERE is_hot = 1") redis.hmset("hot_products", {item.id: json.dumps(item) for item in hot_data}) ``` - **适用场景**:已知热点数据(如每日榜单) 2. **启动时全量预热** - **实现方式**: ```java // Spring Boot启动时执行 @PostConstruct public void initCache() { List<Product> products = productMapper.selectTop100(); products.forEach(p -> redisTemplate.opsForValue().set("product:" + p.getId(), p) ); } ``` - **注意**:需控制批次大小,避免OOM 3. **消息队列异步预热** - **流程**: ``` 用户行为日志 → Kafka → 消费程序 → 分析热点Key → 写入Redis ``` - **优势**:动态识别实时热点 4. **Lua脚本批量预热** ```lua -- 批量导入1000条数据 for i=1,1000 do redis.call('SET', 'preheat:'..i, ARGV[i]) end ``` #### **三、关键实现细节** 1. **数据筛选策略** - 基于历史访问日志(ELK分析TopN) - 业务规则指定(如新品、促销商品) - 机器习预测热点(LSTM模型) 2. **预热性能优化** - 使用Pipeline批量操作 ```python with redis.pipeline() as pipe: for item in hot_items: pipe.set(f"item:{item.id}", item.json()) pipe.execute() ``` - 多线程并行加载(注意连接池配置) 3. **防雪崩设计** - 阶梯式TTL设置(基础300s + 随机120s) - 预热完成标记(设置`warmup:done`键) #### **四、监控与兜底方案** 1. **监控指标** - 缓存命中率(`info stats`中的keyspace_hits) - 预热覆盖率(预热量/总热数据量) 2. **兜底措施** - 首次请求时同步加载+本地缓存 - 降级开关(直接读DB) #### **五、经典业务场景** 1. **电商大促** - 提前1小时预热秒杀商品库存 - 使用`Hash`存储SKU详情 2. **新闻热点** - 实时监控搜索,Top10自动预热 - 结合布隆过滤器防穿透 3. **社交 feed流** - 用户登录时预热关注列表 - 采用ZSET维护时间序 > **📌 最佳实践建议** > - 预热数据量控制在Redis内存的30%以内 > - 结合`slowlog`监控预热性能 > - 灰度发布时同步预热新版本数据
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看,未来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值