当前位置: 首页 > news >正文

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 <timestamp> "task_data"  # 按执行时间排序  
      ZRANGEBYSCORE delay_queue 0 <now>         # 获取到期任务  

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 >  # 消费消息  

相关文章:

  • 09-SpringBoot3入门-整合Mybatis
  • 青少年软件编程(C语言)等级考试试卷(三级)
  • WP Mail 邮件发送:WordPress Mail SMTP设置
  • Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
  • 《剑指数据库:MySQL玄阶查术秘典·下卷》
  • C++——类和对象
  • Dear ImGui for Unity 常见问题解决方案
  • 【Agent】OpenManus-Prompt组件详细分析
  • 【安全运营】关于攻击面管理相关概念的梳理(一)
  • Burp Suite从入门到实战之配置启动
  • 【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
  • 如何高效备考蓝桥杯(c/c++)组
  • 蓝桥杯python编程每日刷题 day 21
  • 我的机器学习学习之路
  • 手机蓝牙项目
  • 《构建有效的AI代理》学习笔记
  • QT五 文件系统,QFile,QfileInfo
  • Go 语言规范学习(5)
  • 关于gige与MFC的界面交互
  • 【Python3.12.9安装llama-cpp-python遇到编译报错问题解决】
  • 怎样搜网站/网页优化包括什么
  • 58同城推广技巧/搜索引擎优化什么意思
  • 河北精品网站建设/合肥seo快排扣费
  • 17做网店网站/青岛关键词网站排名
  • 提高怎样做网站的外链/南昌seo专业团队
  • 苏州招聘网站制作/企业网站建设