您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Redis中雪崩和穿透是什么意思
## 引言
在分布式系统中,Redis作为高性能的缓存中间件被广泛使用。然而在实际应用中,缓存系统可能面临"雪崩"(Avalanche)和"穿透"(Penetration)两类典型问题。本文将深入解析这两种现象的形成机制、危害表现以及行业通用的解决方案。
## 一、缓存雪崩(Cache Avalanche)
### 1.1 基本定义
缓存雪崩是指**大量缓存数据在同一时间集中过期**,导致所有请求直接穿透到数据库,引发数据库瞬时压力激增甚至崩溃的现象。
### 1.2 典型场景
- 电商平台促销活动结束时,所有商品缓存同时失效
- 每日凌晨批量更新的缓存数据采用相同的TTL值
- Redis集群整体重启后所有缓存丢失
### 1.3 危害表现
1. 数据库CPU和内存使用率瞬间飙升
2. 应用响应时间呈指数级增长
3. 可能引发连锁反应导致整个系统瘫痪
### 1.4 解决方案
#### 1.4.1 过期时间随机化
```python
# 设置基础过期时间(1小时)±随机偏移量(10分钟)
expire_time = 3600 + random.randint(-600, 600)
redis_client.set("key", "value", ex=expire_time)
用户请求 → CDN缓存 → 本地缓存 → Redis集群 → 数据库
在系统低峰期预先加载热点数据:
SELECT * FROM hot_items ORDER BY view_count DESC LIMIT 1000
缓存穿透是指查询不存在的数据,导致请求每次都绕过缓存直接访问数据库的现象。
特征 | 缓存雪崩 | 缓存穿透 |
---|---|---|
触发条件 | 大量缓存同时失效 | 查询不存在的数据 |
数据状态 | 实际存在但暂时不可用 | 根本不存在 |
攻击性 | 通常为系统设计缺陷 | 可能遭受恶意攻击 |
// 初始化布隆过滤器
BloomFilter<String> filter = BloomFilter.create(
Funnels.stringFunnel(),
1000000,
0.01);
// 写入有效key
for(String validKey : allValidKeys) {
filter.put(validKey);
}
// 查询前校验
if(!filter.mightContain(key)) {
return null;
}
SET non_exist_key "NULL" EX 300 # 缓存空值5分钟
local value = redis.call('GET', KEYS[1])
if not value then
value = db_query(KEYS[1])
if value then
redis.call('SET', KEYS[1], value)
else
redis.call('SETEX', KEYS[1], 300, 'NULL')
end
end
return value
缓存雪崩和穿透是Redis使用中的典型问题,其核心差异在于: - 雪崩关注有效数据的大规模失效 - 穿透应对无效数据的持续攻击
建议的防御组合拳: 1. 雪崩防护:过期时间分散 + 多级缓存 + 熔断机制 2. 穿透防护:布隆过滤器 + 空值缓存 + 参数校验
通过合理的架构设计和运维策略,可以显著提升Redis缓存系统的稳定性和安全性。
注:本文讨论的方案需要根据实际业务场景进行调整,建议在测试环境充分验证后再上线生产环境。 “`
该文档共约1150字,采用Markdown格式编写,包含: - 分级标题结构 - 对比表格可视化 - 多语言代码示例 - 防御方案的具体实现 - 最新技术版本特性说明 - 总结性对比说明
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。