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

Redis 02

  今天是2025/04/01 20:13 day 16

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

今天进行Redis 3,4,5 个模块的归纳

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


3. 持久化机制(深度解析)

3.1 RDB(快照)

  • 核心机制

    • 触发条件

      • 手动触发:SAVE(阻塞主线程)或BGSAVE(后台fork子进程生成快照)。

      • 自动触发:根据配置规则(如save 900 1表示900秒内至少1次修改)。

    • 文件生成:生成二进制文件dump.rdb,包含某一时刻的数据全集。

    • 内存优化:子进程通过写时复制(Copy-On-Write)技术避免全量内存拷贝。

  • 优缺点

    • 优点

      • 文件紧凑,恢复速度快。

      • 适合冷备和灾难恢复。

    • 缺点

      • 可能丢失最后一次快照后的数据(取决于触发频率)。

      • 大数据量时BGSAVE的fork操作可能阻塞主线程(内存越大阻塞时间越长)。

  • 配置优化

    # redis.conf
    dbfilename dump.rdb        # RDB文件名
    dir /var/lib/redis         # 存储路径
    stop-writes-on-bgsave-error yes  # 磁盘满时禁止写入
    rdbcompression yes         # 启用压缩

3.2 AOF(追加日志)

  • 核心机制

    • 日志记录:以文本格式记录所有写操作命令(如SETHSET)。

    • 重写机制:通过BGREWRITEAOF压缩日志,删除冗余命令(如多次INCR合并为最终值)。

    • 同步策略

      • appendfsync always:每次写操作同步到磁盘(数据最安全,性能最低)。

      • appendfsync everysec:每秒同步(默认,平衡安全与性能)。

      • appendfsync no:由操作系统决定(性能最高,可能丢失最多数据)。

  • 优缺点

    • 优点:数据丢失风险低(最多丢失1秒数据)。

    • 缺点

      • 文件体积大,恢复速度慢。

      • 频繁写入可能影响性能(尤其是always模式)。

  • 配置优化

    # redis.conf
    appendonly yes             # 启用AOF
    appendfilename "appendonly.aof"
    auto-aof-rewrite-percentage 100  # 文件增长100%后触发重写
    auto-aof-rewrite-min-size 64mb   # 最小重写文件大小

3.3 混合持久化(Redis 4.0+)

  • 工作机制

    • 快照数据(RDB格式) + 增量AOF日志,保存在同一个AOF文件中。

    • 重启时先加载RDB快照,再重放后续AOF命令。

  • 优势

    • 结合RDB的快速恢复和AOF的低数据丢失风险。

    • AOF文件可读性增强(RDB头部 + 文本日志)。

  • 启用方式

    aof-use-rdb-preamble yes  # 在redis.conf中配置

4. 高可用与集群(深度解析)

4.1 主从复制

  • 核心流程

    1. 全量同步

    • Slave发送PSYNC命令请求同步。

    • Master fork子进程生成RDB文件并发送给Slave。

    • Slave清空旧数据,加载RDB文件。

    1. 增量同步

    • Master将后续写命令存入复制缓冲区(Replication Buffer)。

    • Slave持续接收并执行缓冲区中的命令。

  • 配置示例

    # Slave节点配置
    replicaof 192.168.1.100 6379  # 指定Master地址
    replica-read-only yes         # Slave只读
  • 常见问题

    • 复制延迟:网络波动或Master写入量过大导致缓冲区溢出(需监控repl_backlog)。

    • 脑裂问题:网络分区时出现多个Master(需结合哨兵解决)。


4.2 哨兵(Sentinel)

  • 核心功能

    • 监控:定期检查Master/Slave健康状态。

    • 故障转移:Master宕机时,自动选举新Master。

    • 通知:通过Pub/Sub频道向客户端发送故障事件。

  • 选举机制

    1. Sentinel通过Raft协议选举Leader。

    2. Leader Sentinel从Slave中选出新Master(优先级 + 复制偏移量)。

  • 配置示例

    # sentinel.conf
    sentinel monitor mymaster 192.168.1.100 6379 2  # 监控名为mymaster的集群,2表示至少2个Sentinel同意故障判定
    sentinel down-after-milliseconds mymaster 5000   # 5秒无响应判定为宕机
    sentinel failover-timeout mymaster 60000         # 故障转移超时时间

4.3 Cluster集群

  • 数据分片

    • 哈希槽分配:16384个槽,通过CRC16(key) % 16384计算所属槽位。

    • 节点管理:每个节点负责部分槽位,支持动态迁移(CLUSTER ADDSLOTS)。

  • 节点通信

    • Gossip协议:节点间交换槽位、状态信息,最终一致性。

    • 重定向机制:客户端访问错误节点时,返回MOVEDASK错误引导重试。

  • 故障转移

    • 从节点通过选举升级为主节点(类似哨兵机制)。

    • 集群需至少包含3主3从以保证高可用。

  • 操作命令

    CLUSTER NODES                  # 查看集群节点信息
    CLUSTER FAILOVER [FORCE]       # 手动触发故障转移
    CLUSTER RESET HARD/SOFT        # 重置集群节点

5. 事务与Lua脚本(深度解析)

5.1 事务

  • 执行流程

    1. MULTI开启事务。

    2. 缓存命令(命令不会立即执行)。

    3. EXEC提交事务(原子性执行所有命令)。

    4. DISCARD取消事务。

  • 特性与限制

    • 非原子性:单条命令原子执行,但事务可能部分失败(如语法错误)。

    • 无回滚机制:需开发者自行处理错误(如通过WATCH实现乐观锁)。

  • 乐观锁示例

    WATCH balance               # 监控balance键
    MULTI
    DECRBY balance 100         # 扣减余额
    EXEC                       # 如果balance被其他客户端修改,此处返回nil

5.2 Lua脚本

  • 核心优势

    • 原子性:脚本执行期间不会被其他命令打断。

    • 减少网络开销:复杂逻辑单次提交,避免多次RTT(Round-Trip Time)。

  • 典型场景

    • 分布式锁续期

      -- KEYS[1]=锁名称,ARGV[1]=线程标识,ARGV[2]=过期时间
      if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("EXPIRE", KEYS[1], ARGV[2])
      elsereturn 0
      end
    • 限流算法(令牌桶)

      -- KEYS[1]=限流key,ARGV[1]=令牌容量,ARGV[2]=填充速率(秒)
      local tokens = tonumber(redis.call("HGET", KEYS[1], "tokens") or ARGV[1])
      local last_time = tonumber(redis.call("HGET", KEYS[1], "last_time") or os.time())
      local now = os.time()
      local new_tokens = math.min(ARGV[1], tokens + (now - last_time) * ARGV[2])
      if new_tokens < 1 thenreturn 0  # 无可用令牌
      elseredis.call("HSET", KEYS[1], "tokens", new_tokens - 1)redis.call("HSET", KEYS[1], "last_time", now)return 1
      end
      
  • 注意事项

    • 脚本复杂度:避免长耗时操作(如KEYS命令),防止阻塞主线程。

    • 沙盒安全:Lua脚本无法直接调用系统命令或文件操作。


相关文章:

Redis 02

今天是2025/04/01 20:13 day 16 总路线请移步主页Java大纲相关文章 今天进行Redis 3,4,5 个模块的归纳 首先是Redis的相关内容概括的思维导图 3. 持久化机制&#xff08;深度解析&#xff09; 3.1 RDB&#xff08;快照&#xff09; 核心机制&#xff1a; 触发条件&#xff…...

unity UI管理器

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events;// UI界面基类 public abstract class UIBase : MonoBehaviour {[Header("UI Settings")]public bool keepInStack true; // 是否保留在界面栈中public …...

PyTorch深度学习框架60天进阶学习计划-第29天:自监督学习-问题解答(一)

PyTorch深度学习框架60天进阶学习计划-第29天&#xff1a;自监督学习-问题解答&#xff08;一&#xff09; 问题&#xff1a; 关于自监督的目标检测模型&#xff0c;怎么联动yolo。 一、 如何与YOLOv7联动&#xff1f; 步骤概述 确定自监督模块的接入位置 在YOLOv7的主干网络…...

GIT 撤销上次推送

注意&#xff1a;在执行下述操作之前先备份现有工作进度&#xff0c;如果不慎未保存&#xff0c;在代码编辑器中正在修改的文件下&#xff0c;使用CtrlZ 撤销试试 撤销推送的方法 情况 1&#xff1a;您刚刚推送到远程仓库 如果您的推送操作刚刚完成&#xff0c;并且没有其他…...

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近&#xff0c;预训练语言模型BERT&#xff08;及其经过稳健优化的版本RoBERTa&#xff09;在自然语言理解&#xff08;NLU&#xff09;领域引起了广泛关注&#xff0c;并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...

【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破

构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…...

单例模式(懒汉模式/饿汉模式)

相关概念参考&#xff1a;【C】C 单例模式总结&#xff08;5种单例实现方法&#xff09;_单例模式c实现-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…...

16-CSS3新增选择器

知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义&#xff0c;使文档变得更加简洁&#xff1f; 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…...

C语言pthread库的线程休眠和唤醒的案例

一、代码如下 #include<stdio.h> #include<pthread.h> // 定义独占锁 pthread_mutex_t mutex; // 定义条件信号对象 pthread_cond_t condition; // 初始化函数 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享锁初…...

Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇

前言 随着 Spring Boot 3.x 的发布&#xff0c;其对 Java 17 的支持和 模块化架构 的深化&#xff0c;Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化 一、Redis 配置前缀的模块化演进&#xff1a;从 spring.redis 到 spring.data.redis 1.1 Spring Boot 2.x&…...

SQL Server:用户权限

目录 创建 & 删除1. 创建用户命令整理创建 admin2 用户创建 admin_super 用户 2. 删除用户命令删除 admin2 用户删除 admin_super 用户 3. 创建时权限的区别admin2 用户权限admin_super 用户权限 查看方法一&#xff1a;使用对象资源管理器&#xff08;图形化界面&#xff…...

Windows .gitignore文件不生效的情况排查

概述 今天下班在家里捣腾自己的代码&#xff0c;在配置.gitignore文件忽略部分文件的时候&#xff0c;发现死活不生效 问题根源 经过一通分析和排查才发现&#xff0c;是.gitignore文件的编码错了&#xff0c;刚开始还没注意到&#xff0c;因为是在Windows下开发&#xff0c…...

cJSON 处理 JSON(轻量级 C 语言库)(二)

第二部分:cJSON 处理 JSON(轻量级 C 语言库) 📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示…...

服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍

NTFS文件系统下格式化在理论上不会对数据造成太大影响&#xff0c;但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到一台备份…...

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、环境信息 环境信息如下&#xff1a; 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...

华为云对象存储服务(OBS)

华为云对象存储服务&#xff08;OBS&#xff09; 前言 华为云为开发者提供了丰富的 Java SDK&#xff0c;借助这些 SDK 能够方便地与华为云的各类服务进行交互。下面以 华为云对象存储服务&#xff08;OBS&#xff09; 的 Java SDK 为例&#xff0c;介绍其使用步骤。 华为云…...

【3】数据结构的双向链表章

目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成&#xff1a;数据域&#xff08;data&#xff09;、指针域&#xff08;pre&#xff09;、指针域&#xff08;next&#xff09;。其中&#xff0c; da…...

分布式环境下的主从数据同步

目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...

蓝桥杯杯赛-日期模拟

知识点 处理日期 1. 按天枚举日期&#xff1a;逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年&#xff1a;正确判断闰年条件。闰年定义为&#xff1a;年份 满足以下任意一个条件&#xff1a;(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…...

【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器

文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表&#xff0c;它是动态检索的部分。使用视图的原因&#xff1a;避免重复的SQL语句&#xff1b;使用表的部分而…...

【TS学习】(15)分布式条件特性

在 TypeScript 中&#xff0c;分布式条件类型&#xff08;Distributive Conditional Types&#xff09; 是一种特殊的行为&#xff0c;发生在条件类型作用于裸类型参数&#xff08;Naked Type Parameter&#xff09; 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...

Android 小组件

小部件的布局文件支持如下布局&#xff1a; FrameLayout LinearLayout RelativeLayout GridLayout 以及如下控件 AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 应该不止这些有空…...

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台&#xff1f;没理由&#xff0c;就是突然想试试。有时候突然有个想法&#xff0c;搜了一下正好有合适的方案&#xff0c;就顺手试一下。 其实已经有很多成熟的笔记软件&#xff0c;例如Notion/OneNote&#xff0c;但谁不想要一个数据完…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具&#xff0c;帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API&#xff0c;或者叫做一个工具类&#xff0c;包含一系列静态…...

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…...

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的&#xff0c;只不过语法和关键子有点不同&#xff0c;如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...

MySQL 5.7 Online DDL 技术深度解析

14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息&#xff0c;请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...

【汽车功能安全:软件与硬件缺一不可】

随着汽车变得越来越智能&#xff0c;功能安全就成为汽车电子系统不可回避的标准体系&#xff0c;日益复杂的功能导致了汽车中电子元件的数量和复杂性的指数级增长&#xff08;Leen&#xff09;。如今高级别汽车拥有多达90个电子控制单元&#xff08;ECU&#xff09;&#xff0c…...

docker打包使用有头模式playwright

1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip&#xff08;修复时区阻塞问题&#xff09; RUN apt-g…...

TCP/IP协议的应用层与传输层

TCP/IP协议簇是互联网的核心通信框架&#xff0c;定义了数据如何在网络中封装、寻址、传输和路由&#xff08;确定数据包从源主机到目标主机的传输路径的过程&#xff09;。 应用层 直接面向用户和应用&#xff0c;负责实现网络服务的具体功能&#xff08;如网页浏览、文件传输…...