Redis 01

 今天是2025/03/30 20:57 day 15

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

今天进行Redis 1,2 个模块的归纳

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

1. 核心特性(深度解析)

1.1 内存存储

  • 原理: 所有数据存储在内存中,通过异步持久化(RDB/AOF)将数据写入磁盘。

  • 优势

    • 读写性能极高(10万+ QPS)。

    • 支持复杂数据结构直接操作,无需序列化。

  • 挑战

    • 内存成本高,需合理设置淘汰策略(如maxmemory-policy volatile-lru)。

    • 持久化时可能引发性能波动(如BGSAVE生成快照时的内存拷贝)。

1.2 单线程模型

  • 工作机制: 基于事件驱动的Reactor模式,单线程处理所有网络I/O和命令执行。

  • 高性能原因

    • 无锁设计:避免线程切换和竞态条件。

    • I/O多路复用:通过epoll/kqueue高效管理连接。

  • 局限性

    • 长耗时命令(如KEYS *)会阻塞其他请求。

    • 多核CPU利用率不足(需通过分片或集群解决)。

1.3 数据结构丰富性

  • 设计哲学: 每种数据结构针对特定场景优化,例如:

    • String:简单KV,支持二进制安全。

    • ZSet:跳表 + 哈希表,实现O(logN)范围查询。

  • 内存优化

    • ziplist压缩列表:小数据时Hash/List/ZSet的底层实现。

    • intset整数集合:Set元素全为整数时的紧凑存储。

1.4 高扩展性

  • 主从复制

    • 同步流程

      1. Slave发送SYNC命令。

      2. Master生成RDB快照并发送给Slave。

      3. Slave加载RDB后,Master推送增量命令。

    • 读写分离:Slave处理读请求,Master专注写操作。

  • Cluster集群

    • 数据分片:16384个槽(Slot),通过CRC16(key) % 16384计算归属。

    • 节点通信:Gossip协议交换节点状态,维护最终一致性。


2. 数据结构与使用场景(深度解析)

2.1 String

  • 底层实现

    • 动态字符串(SDS),预分配冗余空间减少内存重分配。

    • 数值类型存储为整数,非数值存储为二进制安全字节数组。

  • 高级用法

    • 分布式锁

      SET lock_key unique_value NX EX 30  # 原子性加锁
      DEL lock_key                       # 需结合Lua脚本保证原子性释放
    • 限流器

      # 每秒允许10次操作
      CL.THROTTLE user_api 10 10 60 1    # 使用Redis-Cell模块

2.2 List

  • 底层实现

    • 快速链表(QuickList):多个ziplist通过双向指针连接。

  • 典型场景

    • 消息队列

      LPUSH task_queue "task1"          # 生产者推送任务
      BRPOP task_queue 30              # 消费者阻塞获取(避免轮询)
    • 最新消息列表

      LPUSH news "latest_news"         # 插入新消息  
      LTRIM news 0 9                   # 仅保留最新10条  

2.3 Hash

  • 底层实现

    • ziplist(字段少时) + 哈希表(字段多时)。

  • 最佳实践

    • 存储用户信息

      HSET user:1001 name "Alice" age 28       # 更新字段  
      HINCRBY user:1001 score 10               # 原子递增  
    • 避免大Key

      • 拆分策略:user:1001:base(基础信息) + user:1001:ext(扩展信息)。

2.4 Set

  • 底层实现

    • intset(整数集合)或哈希表。

  • 高级应用

    • 共同好友

      SINTER user:1001:friends user:1002:friends  # 交集  
    • 随机抽奖

      SADD lottery "user1" "user2" "user3"        # 添加参与者  
      SPOP lottery 1                             # 随机抽取1名  

2.5 ZSet(Sorted Set)

  • 底层实现

    • 跳表(SkipList) + 哈希表,支持O(1)单查和O(logN)范围查询。

  • 典型场景

    • 排行榜

      ZADD leaderboard 100 "Alice" 90 "Bob"      # 插入分数  
      ZREVRANGE leaderboard 0 9 WITHSCORES      # 获取TOP10  
    • 延迟队列

      ZADD delay_queue  "task_data"  # 按执行时间排序  
      ZRANGEBYSCORE delay_queue 0          # 获取到期任务  

2.6 其他数据结构

  • Bitmaps

    • 日活统计

      SETBIT active:20231001 1001 1       # 用户1001在2023-10-01活跃  
      BITCOUNT active:20231001            # 统计当日活跃用户数  
  • HyperLogLog

    • 误差率:0.81%,适合海量数据UV统计。

    PFADD page:uv "user1" "user2"        # 添加访问用户  
    PFCOUNT page:uv                      # 估算UV  
  • Stream

    • 消费者组

      XGROUP CREATE orders mygroup $     # 创建消费者组  
      XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS orders >  # 消费消息  

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