xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • Redis 新手指南

    • Redis 概览
    • Redis 基础
    • Redis 高级用法与进阶指南
    • Redis基本事务操作详解

Redis 高级用法与进阶指南

📊 一、高级数据结构应用场景

1. HyperLogLog:海量数据基数统计

  • 原理:12KB 内存可统计数十亿独立元素,误差率仅 0.81%。
  • 场景:
    • 网站 UV 统计(每日独立访客)
    • 用户行为日志去重
  • 示例代码:
    PFADD uv:20240825 "user1" "user2"  # 添加数据
    PFCOUNT uv:20240825                # 估算独立用户数

2. Bitmap:高效位操作

  • 原理:二进制位存储,支持快速布尔运算。
  • 场景:
    • 用户签到记录(每日签到状态)
    • 实时在线状态监控
  • 示例代码:
    SETBIT user:1001:sign:202408 25 1   # 8月25日签到
    BITCOUNT user:1001:sign:202408       # 统计当月签到天数

3. Stream:消息队列与流处理

  • 原理:Redis 5.0+ 支持消费者组、消息持久化。
  • 场景:
    • 替代 Kafka 的轻量级消息队列
    • 实时日志收集(支持多消费者并发)
  • 示例代码:
    # 生产者写入
    XADD orders * product "Phone" price 599
    # 消费者组读取
    XREADGROUP GROUP orders_consumer consumer1 COUNT 1 STREAMS orders >

4. GEO:地理位置服务

  • 原理:基于 Sorted Set 实现坐标存储与距离计算。
  • 场景:
    • 附近门店搜索(5km 内)
    • 物流配送距离计算
  • 示例代码:
    GEOADD stores 116.40 39.90 "Beijing_Store"  # 添加坐标
    GEORADIUS stores 116.41 39.91 5 km          # 5公里内门店

⚙️ 二、分布式系统设计实践

1. 分布式锁实现

  • 关键点:原子设值 + 过期时间避免死锁。
  • Lua 脚本实现(原子操作):
    if redis.call("SETNX", KEYS[1], ARGV[1]) == 1 then
        redis.call("EXPIRE", KEYS[1], ARGV[2])  -- 设置过期时间
        return 1
    else
        return 0
    end
    Java 调用示例:
    Boolean locked = jedis.eval(script, 1, "resource_lock", "uuid123", "10");

2. 滑动窗口限流

  • 原理:限制单位时间内的请求次数,防止系统过载。
  • Lua 脚本实现:
    local key = KEYS[1]
    local limit = tonumber(ARGV[1])
    local current = redis.call("INCR", key)
    if current > limit then
        return 0  -- 请求被限流
    else
        redis.call("EXPIRE", key, ARGV[2])  -- 重置时间窗口
        return 1
    end

3. 分布式任务队列

  • 方案:
    • List 实现简单队列:LPUSH/BRPOP
    • Stream 实现可靠队列:支持消息确认与重试

🚀 三、性能优化与集群管理

1. 内存优化策略

问题解决方案
大 Key 阻塞拆分 Key(单 Value < 10KB)
内存碎片启用 activedefrag yes
数据过期堆积配置混合淘汰策略:maxmemory-policy allkeys-lru

2. 高并发优化技巧

  • Pipeline 批量操作:减少网络往返,提升吞吐量。
    pipe = redis.pipeline()
    for i in range(1000):
        pipe.set(f"key_{i}", f"value_{i}")
    pipe.execute()  # 一次提交所有命令
  • Lazy Free 异步删除:避免大 Key 删除阻塞主线程。
    UNLINK big_key  # 替代 DEL

3. Redis Cluster 分片机制

  • 哈希槽原理:
  • 扩容步骤:
    1. 添加新节点:redis-cli --cluster add-node new_host:port existing_host:port
    2. 迁移槽位:redis-cli --cluster reshard

📜 四、Lua 脚本深度应用

1. 原子性事务操作

  • 场景:账户转账(扣款+充值原子性)。
  • Lua 脚本:
    local from_balance = tonumber(redis.call("GET", KEYS[1]))
    if from_balance >= tonumber(ARGV[1]) then
        redis.call("DECRBY", KEYS[1], ARGV[1])  -- 扣款
        redis.call("INCRBY", KEYS[2], ARGV[1])  -- 充值
        return 1  -- 成功
    else
        return 0  -- 余额不足
    end

2. 热点数据预加载

  • 场景:缓存更新时同步刷新关联数据。
  • Lua 脚本:
    local value = redis.call("GET", KEYS[1])
    if value then
        redis.call("SET", KEYS[1], ARGV[1])          -- 更新主缓存
        redis.call("DEL", "related_cache:" .. KEYS[1]) -- 清理关联缓存
    end
    return value

⚠️ 五、生产环境避坑指南

  1. 热点 Key 问题

    • 现象:单 Key 访问量突增(如秒杀商品)。
    • 解决:
      • 本地缓存 + 随机过期时间
      • 添加随机后缀分散 Key:product_123_{random}
  2. 持久化策略选择

    场景推荐配置
    可容忍分钟级数据丢失RDB(save 900 1)
    要求高可靠性AOF(appendfsync everysec)
    平衡恢复速度与安全性混合模式(aof-use-rdb-preamble yes)
  3. 慢查询监控

    CONFIG SET slowlog-log-slower-than 1000  # 记录超过1ms的查询
    SLOWLOG GET 10                           # 查看最近10条慢查询

💎 总结:Redis 高级技术栈全景图

学习路线建议:
1️⃣ 掌握基础:数据类型 + 持久化机制 2️⃣ 深入集群:Cluster 分片 + 哨兵高可用 3️⃣ 实战优化:Lua 脚本 + 性能调优

推荐资源:

  • 命令手册:https://redis.io/commands
  • 源码解析:https://github.com/huangz1990/redis-3.0-annotated
  • 经典教材:《Redis 设计与实现》
最后更新: 2025/8/26 10:07
Prev
Redis 基础
Next
Redis基本事务操作详解