Redis高级
2024-12-25 16:13:12 0 举报
AI智能生成
"Redis高级"是一本深入探讨Redis数据库技术的书籍,它详细解释了Redis的核心概念、数据结构和命令。本书旨在帮助读者掌握Redis的高级用法,包括复制、集群、性能优化和持久化等关键领域。通过丰富的实例和实战经验,本书将带领读者全面掌握Redis,提高开发和运维能力。无论是对于Redis的初学者,还是具有一定基础的开发者,本书都是一本不可多得的参考书籍。
作者其他创作
大纲/内容
持久化
解决数据丢失问题
就是把内存里面的数据保存到磁盘
RDB
本质:redis数据的快照文件
默认有开启
哪几个命令
save
在主线程执行,因此在RDB过程中,会阻塞主线程
Redis在这个过程中,无法对外提供服务
bgsave
生成一个子进程去进行RDB
因此不会阻塞主线程,Redis可以正常对外提供服务
配置
redis.conf
save 60 1000
60s内,有1000次修改,就会触发RDB
save ""
关闭RDB
细节
fork子进程
这个期间主线程会被阻塞
子进程会拷贝主进程的页表
页表存储的是虚拟内存和物理内存的映射关系
利用了copy-on-write的技术去避免并发读写的问题
极端情况,占用内存会翻倍
缺点
内存消耗高,耗时会久一些
数据完整性低
间隔频率不好控制,太短了,就频繁RDB
太长的话,数据实时性就会有问题
优点
恢复速度快
可以压缩,磁盘占用小
压缩需要消耗cpu资源
CPU资源不紧张,可以考虑压缩
AOF
本质:对每一个命令的记录
如何开启
默认是关闭的
开启:appendOnly yes
刷盘的频率
always
一有操作就记录命令
性能最差
数据安全性是最好
everysec
每秒记录一次
no
不管他,系统自己决定
性能最高
数据安全性最差
命令重写
bgrewriteaof
触发时机
增量
文件增长超过了100%,就触发
固定大小
指定固定大小,超过这个大小就触发重写
优点
数据相对完整
资源占有比较低
缺点
磁盘占用大
恢复速度比较慢
主从集群
解决并发能力问题
集群结构
一主多从
读写分离
主节点负责写
从节点负责读
搭建
启动三个Redis实例
选择一个实例作为主节点
去两个从节点执行命令:salveof 主节点ip 端口
数据同步
全量同步
从节点向主节点请求数据同步
主节点根据replicationId判断从节点是否第一次来
是,返回主节点数据版本信息给从节点
从节点保存数据版本信息
不是。那么就会走增量同步的逻辑
主节点执行bgsave命令,生成RDB快照,并发送给从节点
从节点清空本地数据,加载rdb文件
主节点将bgsave后产生的修改记录到repl_baklog
主节点将repl_baklog发送给从节点
从节点根据repl_baklog加载数据
增量同步
从节点断开后又连上来
从节点的replicationId和主节点是一致的,并且offset的差距不是特别大
可以进行增量同步
差距过大,无法进行增量同步,只能走全量同步的逻辑
就是把从节点的offset和主节点目前offset之间差距的数据发送给从节点
从节点执行,数据同步
优化方案
如果网络特别好,无磁盘复制;
修改配置 repl.diskless.resync yes
修改配置 repl.diskless.resync yes
提升repl_baklog大小
控制Redis单节点内存大小,内存不要过大
采用主从从的链式结构,降低主节点的一个压力
完善故障恢复机制,检测从节点宕机后,迅速将其恢复
哨兵集群
故障恢复问题
作用
监控
每1s发送一个ping的请求
回应了,就是正常状态
没有回应,这个哨兵就会认为该节点主观下线
让其他哨兵也ping下这个节点
如果超过半数(可配)的哨兵都认为它下线了,那么就是客观下线了
故障转移
需要挑选一个slave节点,把它变成新的master
怎么挑选呢
先判断断开的时间,断开时间过长的,直接忽略掉
再判断优先级
再去判断offset,offset值越大,优先级越高
判断Runid,runid越小,优先级越高
发送 slaveof noone给这个挑选出来的节点
从节点就变成了master节点
广播给所有从节点,告诉他们master,让他们更换老大
修改故障节点配置,把它变成从节点
通知
客户端并不是直接连接redis集群
客户端连接是哨兵,由哨兵告诉它地址
搭建
3实例的哨兵
配置指向Redis集群的主节点就行了
客户端连接哨兵集群
导redis依赖
配置sentinel的地址
configer配置一下读写分离
分片集群
存储能力问题
集群结构
需要哨兵吗
不需要哨兵
多主多从
每个主节点都有对应的从节点
每个主节点都会存储不同的数据
主节点除了进行数据的写入之外还具备
监控
故障转移
通知
主节点具备了哨兵的所有能力
散列插槽
16384个hash插槽
怎么决定数据要存在哪个分片上?
根据key的有效部分计算hash值
有{},并且{}里面的内容大于1
{}里面的值就是key的有效部分
没有大括号,那么整个key本身都是有效部分
拿着hash值对16384取模,决定数据要存储到哪个插槽上
在判断该插槽属于哪个分片。那么数据就存储在这个分片上
集群的动态伸缩
3台
5台
新增两个Redis实例
把实例加入到分片集群中
查看那台机器负载比较高
对插槽进行分配
迁移到新增的机器上
5台
3台
先转移插槽
移除掉两个master
故障转移
自动
哨兵模式差不多
手动
默认
政权正常变更
force
和平演变
takeover
武装夺取政权
Redis客户端怎么连接
导redis依赖
配置Redis分片集群的地址
把所有的redis节点都写上就行了
configer配置一下读写分离
0 条评论
下一页