Redis 03

   今天是2025/04/02 19:39 day 17

总路线请移步主页Java大纲相关文章

今天进行Redis 6,7,8 个模块的归纳

首先是Redis的相关内容概括的思维导图

Redis 03_第1张图片

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+支持)。


你可能感兴趣的:(redis,数据库,缓存)