Redis

  • 内存K-V 型数据库

内存占用

redis 的数据保存在内存中,数据变多,内存占用更大。当 redis 服务器停止运行时,数据便会消失。

使用 savebgsave 命令可以将内存中的数据存储在硬盘上(rdb 和 aof)

RDB:通过rdb文件恢复数据比较快

AOF:追加日志文件,备份速度较快,但数据恢复速度较慢

当 redis 服务启动时,会把 rdb 中的数据再次放在内存中使用(因此要考虑 redis 内存占用的问题)

下载:https://github.com/MicrosoftArchive/redis/releases

主从模式

应用场景:可以实现读写分离

参考:https://www.cnblogs.com/cang12138/p/9132288.html

参考:https://blog.csdn.net/ITLTX1024/article/details/100665452

  • 开启主 redis 服务
./redis-server.exe redis.windows.conf // 开启服务
./redis-cli.exe -h 127.0.0.1 -p 6379 // 在服务中执行操作

默认配置运行在 127.0.0.0:6379 上,可以在 redis.windows.conf 中修改此配置

  • 开启从 redis 服务

复制 redis 安装目录至新的文件夹,如 ./redis6380

修改 redis.windows.conf 和 redis.windows.service.conf 的配置,端口号改为 6380

./redis-server.exe redis.windows.conf // 开启服务
./redis-cli.exe -h 127.0.0.1 -p 6380 // 在服务中执行操作

同步到主服务的数据

127.0.0.1:6380> slaveof 127.0.0.1 6379
// slaveof host port 同步到某主服务,将主服务所有数据一起同步过来
// slaveof no one 取消同步
// 主服务发送 rdb 文件 → 主服务发送缓冲区数据 → 从服务删除老数据 → 加载新的 rdb 数据和缓冲区数据
// 如果同步的过程中,连接断开,则会在下次连接之后继续同步
  • 读写

主服务:可读、可写

从服务:只读、不可写

当主服务停止运行后,从服务 **不会 ** 自动成为主服务

  • 永久保持主从关系

修改从 redis 服务的配置 redis.windows.config ,搜索 slaveof ,加入 slaveof 127.0.0.1 6379 即可

哨兵模式

  • 每个哨兵会定时向其他哨兵、Master、slave发送消息,以确定对方是否存活,若如果发现对方在指定时间(可配置)内未回应,则认为 master 挂了,会采用 vote 算法,选出一个新的 master

哨兵监控原理:https://blog.csdn.net/xiaoxiaole0313/article/details/103813759

主服务目录中建立 sentinel.conf 哨兵配置

#当前Sentinel服务运行的端口
port 26381
#master
#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,
#而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 127.0.0.1 6379 1
#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。
#只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds mymaster 5000
#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel config-epoch mymaster 12
#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel leader-epoch mymaster 13

从服务目录中建立 sentinel.conf 哨兵配置

port 26382
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 12
sentinel leader-epoch mymaster 13

在两个服务的目录中启动两个 sentinel

redis-server.exe sentinel.conf --sentinel

查看 sentinel 信息

主服务目录下:

./redis-cli.exe -p 26381
info sentinel

此时,主服务器关闭,查看 sentinel ,主服务器从 6379 变成 6380

PS D:\redis\redis> ./redis-cli.exe -p 26381
127.0.0.1:26381> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=2
127.0.0.1:26381> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=1,sentinels=2
127.0.0.1:26381>

注:如果原主服务器修好了,那么也只能作为从服务器听从新的主服务器

  • 哨兵监控:每隔一段时间,每个哨兵会向主节点和从节点发送 info 命令( ping ),获取各个节点的信息,以判断节点的存活状态。

    如:向主节点发送 info replication

    node01:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.239.102,port=6379,state=online,offset=18621889,lag=1
    slave1:ip=192.168.239.103,port=6379,state=online,offset=18621889,lag=1
    

    每个哨兵会订阅 __sentinel__:hello 这个频道,并定时发送以下信息

    <sentinel ip> <sentinel port> <sentinel runId> <Sentinel 配置版本> <master name> <master ip> <master port> <master 配置版本>
    

    以此来定时了解其他哨兵的信息,哨兵之间也会互相交换主节点的状态。

  • 确认下线(Gossip协议)

    • 主观下线:每个 sentinel 会向其他节点和 sentinel 定时发送信息( ping ),若没有收到响应,则判断为主观下线
    • 客观下线:多个 sentinel 都判定某个节点下线,则该节点为客观下线
  • 故障转移 leader

    ​ 若 sentinel-0 率先发现某个节点下线,则会先申请成为 leader,其他 sentinel 负责投票。其他 sentinel 发现节点下线后也可以申请 leader ,正常情况下,哪个 sentinel 节点最先确认 master 客观下线,哪个 sentinel 节点就会成为执行故障转移的 leader。

  • Master 节点选举:不选择不健康的节点

    • 主观下线的 slave
    • 大于等于5秒没有回复过 sentinel 节点 ping 响应的 slave
    • 与 master 失联超过down-after-milliseconds * 10秒的 slave

    ————————————————————————————————

    • 对节点进行排序:priority 最小的(从节点优先级,可以设置)→ 复制偏移量最大的 → 选择 runid 最小的从节点(runid:每个redis服务器的唯一标志id)
  • 故障转移

    ​ sentinel leader 对新的 Master 执行 slaveof no one,

    ​ 对其他节点执行 slaveof

cluster 模式:多个 redis 实例,把数据分布到不同位置

配置: https://www.cnblogs.com/vettel0329/p/11843342.html

虚拟槽分区 slots:redis cluster 默认有 0-16383 虚拟槽,每个槽可以存放一定的数据。

哈希槽:每个槽可以当成是一个分区,当使用 redis 单个节点时,只有一个分区。当使用 cluster 模式时,会生成 16384 个分区,每个分区中都可以存储很多 k-v。数据存储在哪个槽则是由 key 值计算后决定。

把某些范围的 key 存到某些槽里

redis cluster 集群会平均分配一定数量的槽,由各个 redis 节点进行管理。

  • cluster 集群模式

    • 由多个 redis 服务器组成的分布式网络服务集群
    • 多个主节点,每个节点都可写可读
    • 节点之间可以互相通信
  • cluster 应用场景
    • 数据量特别大

1、安装Ruby:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.3.3-x64.exe

2、下载 redis-trib.rb https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 下载 Source code(zip) 源码包

3、配置 Ruby :在cmd命令行执行 gem install redis

4、复制6份Redis作为6个节点,分别命名为8081、8082、8083、8084、8085 和 8086

5、修改 Redis 各节点中的 redis.windows.conf 配置文件

#端口号改为8081,其他5个端口号分别为 8082、8083、8084、8085、8086
port 8081
#开启集群模式
cluster-enabled yes
#保存节点配置,自动创建,自动更新(建议命名时加上端口号)
cluster-config-file nodes-8081.conf
#集群超时时间,节点超过这个时间没反应就断定是宕机
cluster-node-timeout 15000
#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 yes表示:存储方式,aof,将写操作记录保存到日志中
appendonly yes

6、在每个节点目录下创建 start.bat 来启动 redis

title redis-8081
redis-server.exe redis.windows.conf

7、redis-trib.rb 文件复制到 redis 集群的目录下

8、双击各节点文件夹下的 start.bat 文件启动各Redis节点

9、到 redis 集群目录下执行cmd命令:ruby redis-trib.rb create --replicas 1 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083 127.0.0.1:8084 127.0.0.1:8085 127.0.0.1:8086

redis-trib:创建集群的工具
1、每个节点要独立,且db为空
2、检查 master 节点数目必须大于三个
3、计算每个 master 要分配的 slot 数量,以及给 master 分配 slave

参考:https://www.cnblogs.com/kevingrace/p/9868366.html

:redis-trib 集群命令只需要执行一次,以后只需要执行各节点的 start.bat 即可

10、yes( 配置主节点和从节点)

Cluster 中的主从模式,从节点默认不具备 读和写 的功能,读写操作会默认重定向给主节点

从节点 : port>readonly 在从节点上使用 readonly 命令,可以让从节点允许 get 功能(相当于告诉从节点,只读不写)

127.0.0.1:8084> readonly
OK
127.0.0.1:8084> get aa
"m"

11、分配各个槽点至各个节点,配置完毕

12、./redis-cli.exe -c -p port 进入某个节点

// set
127.0.0.1:8081> set name 44
-> Redirected to slot [5798] located at 127.0.0.1:8082
OK
127.0.0.1:8082>// get
127.0.0.1:8083> get name
-> Redirected to slot [5798] located at 127.0.0.1:8082
"44"
127.0.0.1:8082>

cluster 集群命令:https://www.cnblogs.com/mumian2/p/10626509.html

cluster info
cluser nodes

redis & mysql

  • redis 存放一些用户最常用到的数据,如最新消息、排行榜等,用户在查看消息时,可以先从 redis 中查询是否存在,若不存在,则去 mysql 中查询,并将查询的结果放在 redis 中(放在 redis 中的数据最好设置过期时间,若 redis 数据量太大会占用较多内存)

redis数据库的主从、哨兵和cluster模式的实现原理与搭建详解(win10系统)相关推荐

  1. 图文详解 epoll 原理【Redis,Netty,Nginx实现高性能IO的核心原理】epoll 详解

    [Redis,Netty,Nginx 等实现高性能IO的核心原理] I/O 输入输出(input/output)的对象可以是文件(file), 网络(socket),进程之间的管道(pipe).在li ...

  2. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统

    一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...

  3. redis队列优先级java实现_Redis 实现队列原理的实例详解

    Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后 ...

  4. mysql cluster rpm包的作用_MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包)

    1.下载MySQL-cluster 7.3.7 http://dev.mysql.com/downloads/cluster/ 2.环境清理及安装 1)清理CentOS6.5自带的mysql服务,其中 ...

  5. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  6. 工程之星android版使用,安卓版工程之星软件网络1+1模式及网络cors连接操作详解...

    原标题:安卓版工程之星软件网络1+1模式及网络cors连接操作详解 现在,越来越多用户开始使用安卓版工程之星进行作业,科力达技术工程师总结了安卓版工程之星网络1+1模式及网络CORS连接方式操作步骤, ...

  7. java 配置jmstemplate_SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解...

    1.导入jar包: org.springframework.boot spring-boot-starter-activemq org.apache.activemq activemq-pool 2. ...

  8. 命令行模式下几个网络命令详解

    命令行模式下几个网络命令详解 上一篇 / 下一篇  2007-05-16 16:20:55 查看( 166 ) / 评论( 0 ) / 评分( 0 / 0 ) 命令行模式下几个网络命令详解 一.pin ...

  9. 并网模式微电网逆变器VSG控制_SIMULINK_模型搭建详解

    背景 在微电网中,采用电压控制型VSG可以实现并网.离网.以及两种模式的无缝切换,能够为微电网系统提供电压和频率支撑:就应用范围而言,电压控制型相较于电流控制型的VSG适用范围更广.基于电压控制型VS ...

最新文章

  1. Spring+Mybatis多数据源配置
  2. 视频操作_02视频追踪:meanshift算法+Camshift算法
  3. java 内部类 作用_java内部类的作用分析
  4. 递归总结 By greenhand
  5. linux shell解析1
  6. 3种方法实现http虚拟主机
  7. 作业车间调度问题特征与调度效率相关性的研究Correlation of job-shop scheduling problem features with scheduling efficiency
  8. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day33】—— 手撸算法2
  9. 随便举个例子,说明单线程比多线程编程提高性能
  10. Superset航班数据可视化实战
  11. 三国合肥会战\孙仲谋二战张文远\张辽威震逍遥津\张辽八百骑打破孙仲谋
  12. 实现点击按钮 复制文本内容
  13. matlab自带电机案例,MATLAB电机仿真精华50例,源代码
  14. 【区块链】深入剖析免费赚钱app的本质
  15. 非计算机类专业毕业生五年程序员职业生涯的回顾和思考
  16. 【原创】Ubuntu 下使用 NCverilog 仿真 Verilog 工程
  17. 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等
  18. 电化学微量元素分析仪的执行标准
  19. 滴滴技术牛逼吗?看它开源了哪些有意思的项目
  20. How to Perfectly Uninstall Nero 11

热门文章

  1. No executable code found at line。。。
  2. 带你走进 SVG 世界,成为 SVG 头号玩家
  3. 我的世界-0----计算机简史(2):从穿孔制表机到计算机
  4. 基于无线发射接收的物体远离报警器的设计
  5. 2013年手机处理器终极指南(上)
  6. Android 通过基站进行定位
  7. 【黑马课程笔记】webAPI
  8. 初学者——Java之实现简易俄罗斯方块
  9. 程序中所不需要访问到的功能,别忘了从WMAppManifest.xml文件中的Capabilities的小节将它们去掉。
  10. 深度学习数学基础-概率与信息论