Redis 03
今天是2025/04/02 19:39 day 17
总路线请移步主页Java大纲相关文章
今天进行Redis 6,7,8 个模块的归纳
首先是Redis的相关内容概括的思维导图
6. 性能优化与问题处理(深度解析)
6.1 常见问题与解决方案
缓存击穿
-
问题描述: 热点Key过期时,高并发请求穿透到数据库,导致数据库压力骤增。
-
解决方案:
-
互斥锁:
SET lock_key unique_value NX EX 5 # 加锁,设置短过期时间 if (获取锁成功) { 从DB加载数据并更新缓存; DEL lock_key; # 释放锁 } else { 重试或返回默认值; }
-
逻辑过期:缓存永不过期,后台异步更新数据。
-
缓存雪崩
-
问题描述: 大量Key同时过期,导致请求集中访问数据库。
-
解决方案:
-
随机过期时间:为Key设置基础过期时间 + 随机偏移量。
EXPIRE key ${base_ttl + random(0, 300)}
-
双层缓存:主缓存设置较长TTL,备份缓存异步更新。
-
缓存穿透
-
问题描述: 查询不存在的数据(如非法ID),绕过缓存频繁访问数据库。
-
解决方案:
-
布隆过滤器:
BF.ADD valid_ids 1001 # 将合法ID存入布隆过滤器 BF.EXISTS valid_ids 1002 # 检查ID是否存在(可能误判)
-
空值缓存:对不存在的Key缓存空值(设置短TTL)。
-
6.2 性能调优
内存优化
-
数据结构选择:
-
小数据Hash使用
ziplist
(配置hash-max-ziplist-entries 512
)。 -
整数集合使用
intset
(配置set-max-intset-entries 512
)。
-
-
内存淘汰策略:
maxmemory-policy volatile-lru # 对有过期时间的Key使用LRU淘汰
连接池配置
-
Jedis示例:
JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(200); // 最大连接数 config.setMaxIdle(50); // 最大空闲连接 config.setMinIdle(10); // 最小空闲连接 JedisPool pool = new JedisPool(config, "redis-host", 6379);
批量操作
-
Pipeline批量写入:
try (Pipeline pipeline = jedis.pipelined()) { for (int i = 0; i < 1000; i++) { pipeline.set("key" + i, "value" + i); } pipeline.sync(); // 一次性提交所有命令 }
7. 应用场景(深度解析)
7.1 缓存
-
实现要点:
-
缓存粒度:按需缓存对象字段(Hash)或完整数据(String)。
-
缓存更新策略:
-
旁路缓存(Cache Aside):先更新DB,再删除缓存。
-
写穿透(Write Through):更新DB后同步更新缓存。
-
-
7.2 分布式锁
-
RedLock算法:
-
向多个Redis实例依次请求锁,半数以上成功视为加锁成功。
-
示例:
SET lock:order_123 uuid NX PX 30000 # 锁键+唯一标识+过期时间
-
释放锁:需结合Lua脚本保证原子性。
-
7.3 消息队列
-
基于Stream的可靠队列:
XADD orders * user_id 1001 product "Book" # 生产者发送消息 XGROUP CREATE orders order_group $ # 创建消费者组 XREADGROUP GROUP order_group consumer1 COUNT 1 BLOCK 5000 STREAMS orders > # 消费者阻塞读取 XACK orders order_group 消息ID # 手动确认消息
7.4 实时排行榜
-
ZSet实现:
ZADD leaderboard 95 "Alice" 88 "Bob" # 插入分数 ZREVRANGE leaderboard 0 9 WITHSCORES # 获取TOP10 ZRANK leaderboard "Bob" # 查询排名
7.5 实时统计
-
HyperLogLog统计UV:
PFADD page:uv:20231001 "user1" "user2" # 记录访问用户 PFCOUNT page:uv:20231001 # 估算UV PFMERGE page:uv:total page:uv:20231001 page:uv:20231002 # 合并多日数据
8. 运维与监控(深度解析)
8.1 配置管理
-
关键配置项:
maxmemory 4gb # 最大内存限制 maxmemory-policy volatile-lru # 内存淘汰策略 timeout 300 # 客户端空闲超时断开(秒) requirepass your_password # 启用密码认证
8.2 监控工具
-
内置命令:
-
INFO
:查看内存、持久化、复制等状态。INFO memory # 内存使用详情 INFO replication # 主从复制状态
-
SLOWLOG
:查询慢查询日志。SLOWLOG GET 10 # 获取最近10条慢查询
-
-
可视化工具:
-
RedisInsight:官方GUI工具,支持性能监控、数据可视化。
-
Prometheus + Grafana:通过
redis_exporter
采集指标并展示。
-
8.3 备份与恢复
-
RDB备份策略:
-
定时任务执行
BGSAVE
并备份dump.rdb
到异地存储(如S3)。 -
恢复时替换
dump.rdb
并重启Redis。
-
-
AOF重写优化:
BGREWRITEAOF # 手动触发AOF重写(避免业务高峰期)
8.4 安全加固
-
禁用危险命令:
rename-command FLUSHDB "" # 禁用FLUSHDB rename-command CONFIG "SECRET_CONFIG" # 重命名CONFIG命令
-
网络隔离:
-
使用防火墙限制Redis端口(默认6379)的访问IP。
-
启用SSL/TLS(Redis 6.0+支持)。
-