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

Redis 主从同步与对象模型(四)

目录

1.淘汰策略

1.1 expire/pexpire(设置键的过期时间)

1.2 配置

1.maxmemory

2.maxmemory-policy

3.maxmemory-samples

2.持久化

2.1背景

2.2 fork 的写时复制机制

2.3 大 key

3.持久化方式

3.1 aof(Apped Only File)

3.2 aof-rewrite

3.3 rdb(Redis DataBase)

3.4 rdb-aof 混用

3.5 大 key 对持久化影响

4.高可用

4.1 redis 主从复制

 4.2 哨兵模式

4.3Redis cluster集群


1.淘汰策略

redis 是内存数据库

1.1 expire/pexpire(设置键的过期时间)
命令说明
EXPIRE  key  seconds设置 key 在 seconds 秒后过期
PEXPIRE  key milliseconds设置 key 在 milliseconds 毫秒后过期
TTL key /  PTTL  key查看 key 剩余过期时间
PERSIST  key移除 key 的过期时间,使其永久存在
1.2 配置
1.maxmemory
  • 设置 Redis 最大可用内存限制
  • 单位支持 : bytes,kb,mb,gb
  • 例如:   maxmemory   4gb
2.maxmemory-policy
策略含义
noeviction不删除任何数据,写操作会报错
allkeys-lru所有 key 中,淘汰最近最少使用的 key
volatile-lru仅在设置了过期时间的 key 中,淘汰最近最少使用的
allkeys-random所有 key 中,随机选择 key 进行淘汰
volatile-random仅在设置了过期时间的 key 中,随机淘汰
allkeys-lfu所有 key 中,淘汰使用频率最低的 key
volatile-lfu仅在设置了过期时间的 key 中,淘汰使用频率最低的
volatile-ttl仅在设置了过期时间的 key 中,淘汰即将过期的 key

 注:volatile 策略只作用于设置了过期时间的键

        allkeys 策略作用于所有的键

3.maxmemory-samples

        在执行策略时,从样本中采样,然后从中选出最符合淘汰机制的key

例如: 设置allkeys-lru,并设定  maxmemory-samples 10

Redis 会从所有 key 中随机采样 10 个,然后选出最近最少访问的那个key来淘汰


2.持久化

2.1背景

        redis是内存数据库,重启需要加载回来原来的数据

2.2 fork 的写时复制机制

        为了提高效率而采用的一种延迟复制优化策略

父子进程最初共享同一块物理内存,只有当任一方尝试修改内存时,才会复制对应页到新的物理内存,从而实现真正的“独立”

父进程对数据修改,触发写保护中断,从而进行物理内存的复制,父进程的页表指向新的物理内存(谁修改谁指向新的物理内存)

发生写操作时候才会去复制物理内存
避免物理内存复制时间过长导致父进程长时间阻塞

2.3 大 key

        占用内存较大或成员数量非常多的 Key,比如 v 中存储的时 hash 或者 zset 这种数量比较多的类型


3.持久化方式
3.1 aof(Apped Only File)

        AOF持久化通过记录服务器所执行的所有写操作命令来记录数据库状态。这些命令会被追加到AOF文件的末尾,支持:

  • always:每次写命令都会同步(sync)写入到磁盘
  • everysec:每秒将aof缓冲区内容同步到磁盘中(由后台线程执行,是默认的方式)
  • no:Redis 只负责写入 aof 缓存,不主动同步到磁盘,由系统决定同步或手动同步

优点:

  • 数据更安全
  • 命令可读,易于恢复/调试

缺点:

  • 文件体积大,性能开销高于 rdb
  • 数据存在一定冗余
3.2 aof-rewrite

        处理 aof 文件过大,减少 aof 数据恢复速度过慢

工作原理:

        fork进程,根据内存数据生成 aof 文件,避免同一个 key 历史冗余,在重写 aof 期间,对 redis 的写操作记录到重写缓存区,当重写 aof 结束后,附加到 aof 文件末尾

3.3 rdb(Redis DataBase)
  • 周期性将内存数据写入磁盘(.rdb文件)
  • 通过 fork 子进程来执行,不影响主线程
  • rdb 存储的是经过压缩的二进制数据

优点:

文件小,恢复速度块

缺点:

有数据丢失的风险(最近一次快照之后的修改会丢失)

3.4 rdb-aof 混用

通过 fork 子进程,根据内存数据生成 rdb 文件,在rdb持久化期间,对redis 的写操作记录到重写缓冲区,当rdb 持久化结束后,附加到 aof 文件末尾

对比项RDB(快照)AOF(追加日志)
方式定时保存内存数据的快照每次写操作记录命令到日志文件
触发时机定时或手动触发每次写命令(可配置是否每次/fsync)
启动恢复时间快(直接加载快照)慢(需要回放全部命令)
数据完整性可能丢失几分钟数据最多丢失1秒(默认 everysec)
文件大小紧凑、体积小文件可能较大,命令多会膨胀
性能影响运行中 fork 子进程保存快照,影响小持续写磁盘,影响相对大
可读性二进制文件,不可读文本命令,可直接读懂、重放
使用场景数据量大,恢复速度优先数据安全要求高的业务
3.5 大 key 对持久化影响
  • 对 RDB:fork 期间,写时复制(COW)会导致 内存急剧增长
  • 对 AOF:每次修改都写入完整命令,大 key 会让文件迅速膨胀,AOF 重写成本高
  • 会导致重启时间变长,甚至服务阻塞

4.高可用

4.1 redis 主从复制
  •  异步复制:主节点将写操作同步到从节点,但不是实时同步(存在数据延迟)。
  • 环形缓冲区:主节点维护一个固定大小的缓冲区保存最近的写命令,用于断线后快速增量同步。
  • 复制偏移量:主从节点维护一个偏移量,表示同步的数据位置,用于比对是否需要全量(主从节点之间的数据全部重新同步的过程)或增量复制(主从节点之间同步断开期间 丢失的数据部分补充同步,无需全量)。
  • runid:每个 Redis 实例有唯一运行 ID,复制过程中标识主节点身份。

作用:

  • 解决了单点故障
  • 高可用性的基础
 4.2 哨兵模式

        目的:实现 Redis 故障自动转移。仅仅保障了单节点的高可用(主节点宕机可自动切换,从节点提升为主)

流程:

  1. 主观下线:
  2. 客观下线
  3. 烧饼选举
  4. 从库选主
  5. 故障转移

如何使用

 一个 Redis 哨兵(Sentinel)模式的配置与使用示例,包含:

  • 1 个主节点(master)
  • 2 个从节点(slave)
  • 3 个哨兵(sentinel)
  • 1 个客户端访问配置方式

 1.主从配置

#主节点 redis-master.conf(6379)
port 6379
dir /data/redis/master
appendonly yes#从节点 redis-slave1.conf(6380)
port 6380
dir /data/redis/slave1
replicaof 127.0.0.1 6379
appendonly yes#从节点 redis-slave2.conf(6381)
port 6381
dir /data/redis/slave2
replicaof 127.0.0.1 6379
appendonly yes

 2.哨兵配置(sentinel.conf)
每个哨兵配置几乎一样,只需修改端口和自身 IP

#哨兵1 sentinel1.conf(26379)
port 26379
dir /data/redis/sentinel1
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
#其他两个哨兵只改端口和目录,比如:
sentinel2.conf: 端口 26380,目录 /data/redis/sentinel2
sentinel3.conf: 端口 26381,目录 /data/redis/sentinel3

 3.启动
放到一个文件比如start下面,然后chmod +x,最后./start

# 启动主从
redis-server redis-master.conf
redis-server redis-slave1.conf
redis-server redis-slave2.conf# 启动哨兵
redis-sentinel sentinel1.conf
redis-sentinel sentinel2.conf
redis-sentinel sentinel3.conf

缺点:

  • 主观宕机存在误判风险
  • 部署麻烦
  • 没有避免数据丢失问题
  • 没有数据扩展
4.3Redis cluster集群

        去中心化结构,每个节点互相通信,无集中式主控节点,解决了数据扩展

特征:

  • 客户端与服务端缓存槽位信息,以服务器为主,客户节点缓存主要为了避免连接切换
  • 自动分片,16384(2^14)个哈希槽分配给不同节点
  • 每个主节点可挂载一个或多个从节点实现高可用

流程:

  1. 客户端根据 key 计算哈希槽值。
  2. 连接对应槽所属的主节点。
  3. 若节点不对,返回 MOVED 重定向信息,客户端重新连接目标节点

缺点:

  1. 不支持多 key 操作跨槽执行(除非通过 hash tags)。
  2. 集群节点间通讯复杂,部署维护成本高。
  3. 客户端需支持 Redis Cluster 协议
http://www.xdnf.cn/news/5257.html

相关文章:

  • 出现 SEGMENT: ?C_INITSEG 的原因:
  • ERP学习(一): 用友u8安装
  • 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘
  • smbd:快速拉取服務端SMB共享文件脚本工具
  • 从0开始学linux韦东山教程第三章问题小结(2)
  • 长短期记忆网络(LSTM)深度解析:理论、技术与应用全景
  • 每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
  • MySQL索引详解(上)(结构/分类/语法篇)
  • Excel里面怎样批量去掉字串包含的标点符号
  • Qt解决自定义窗口样式不生效问题
  • 基于ssm+mysql的快递管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • Linux 离线安装 Docker 和 Docker Compose 最新版 的完整指南
  • 【Linux基础】程序和软件安装管理命令
  • Python爬虫学习路径与实战指南 06
  • Java基础 集合框架 Collection接口和抽象类AbstractCollection
  • Java Spring 常用注解详解
  • 算法-贪婪算法
  • en33网络配置文件未托管
  • 【MyBatis-7】深入理解MyBatis二级缓存:提升应用性能的利器
  • Python核心编程深度解析:作用域、递归与匿名函数的工程实践
  • 17.Excel:实用的 VBA 自动化程序
  • # YOLOv3:深度学习中的目标检测利器
  • linux-----------Ext系列⽂件系统(上)
  • # Java List完全指南:从入门到高阶应用
  • 栈应用:辅助站(c++)
  • C#异步Task,await,async和Unity同步协程
  • 玩转Docker | 使用Docker部署Note Mark笔记应用程序
  • [架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)
  • 求两个正整数的最大公约数和最小公倍数:方法1:辗转相除法
  • 01 | 大模型微调 | 从0学习到实战微调 | AI发展与模型技术介绍