读书笔记 《Redis开发与运维 》

Redis使用场景

  • 作为缓存层 减少对Mysql的压力
  • 计数功能 比如使用原子命令incr
  • 共享Session
  • 设置过期时间 可以限制短信接口等调用
  • 使用hash类型存储一些关系型数据库表中的数据 如用户信息 可以通过表名+id的方式
  • 列表类型的数据 可以用来模拟队列或者栈 或者最新的新闻信息等
  • 实现发布、订阅

命令执行过程

Redis使用了单线程架构和IO多路复用模型来实现高性能内存数据库服务
  • 1.发送命令
  • 2.排队
  • 3.执行命令
  • 4.返回命令执行结果

Pipeline

由于网络或者连接redis服务端比较占用很多时间 redis提供Pipeline机制来加快Redis对数据的操作 它通过一组Redis命令进行组装 通过一次RTT传输给Redis 再将这组Redis命令的执行结果按照顺序返回给客户端

事务

Redis提供简单的事务功能 将一组要执行的命令放到multi和exec两个命令之间 multi代表事务开始 exec代表事务结束

如果执行事务的时候出错,语法级别的错误 将会导致事务回滚 命令不会被执行
如果是运行时错误 则Redis不会回滚

redis提供了watch命令 来确保事务中的key没有被其它应用修改过

持久化

支持RDB和AOF两种持久化机制  AOF持久化开启之后且存在AOF文件则会优先加载AOF文件 否则加载RDB文件

RDB

将当前进程数据生成快照保存到硬盘的过程 默认使用LZF算法对生成的RDB文件做压缩 RDB是一个紧凑的二进制文件 代表Redis在某个时间点上的数据快照 适合全备 而且恢复数据比较快

缺点 没办法做到实时持久化、秒级持久化 因为 bgsave 每次运行都需要执行fork操作创建子进程 属于重量级操作
127.0.0.1:6379> bgsave
Background saving started
执行bgsave命令之后 父进程执行fork命令创建子进程 此时父进程是阻塞的 fork完成之后 bgsave命令返回并不再阻塞父进程 可以继续执行其他命令 新生生成的rdb文件会对原有文件进行原子替换
127.0.0.1:6379> lastsave  #查看文件最后保存时间
(integer) 1517474265

AOF

以独立日志的方式记录每次写命令 重启时再重新执行AOF文件中的命令达到恢复数据的目的 可以达到数据持久化的实时性 提供了多种AOF缓存策略 由参数 appendfsync控制
appendonly yes #开启AOF功能 默认文件名是 appendonly.aof
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

流程

  • 首先将命令追加到aof_buffer中
  • AOF缓冲区根据不同的策略将数据同步到磁盘中
  • Redis重启之后 如果AOF配置打开 并且存在AOF文件 则优先加载

AOF重写机制

随着命令不断写入AOF 文件会变得越来越大 Redis引入AOF重写机制压缩文件体积 文件重写是Redis进程内的数据进行转化 然后同步到新的AOF文件中 文件变小的原因如下
  • 超时的数据不再写入文件
  • 旧的del,重复的操作 都不再写入文件 只会保留最终数据的写入命令
  • 多条写命令可以合并成一个 比如多次 lpush操作

数据删除策略

删除策略主要有两种 分别是惰性删除和定时删除
  • 被动删除 主节点读取数据之后 会判断键是否超时 如果超时 则执行 del命令删除数据
  • 主动删除 主节点内部定时会采样部分键 当发现采样的键过期 则执行del命令

复制

slaveof 命令

默认情况下 redis都是主节点 主节点可以有多个从节点 而从节点只能有一个主节点
可以通过slavof的方式配置 且只能在从节点发起 有下面三种方式
  • 在配置文件中添加slaveof masterHost masterPort
  • redis-server启动命令之后加入 --slaveof masterHost masterPort
  • 直接使用命令 slaveof masterHost masterPort
info replication ##命令查看复制的状态
slaveof no one ##断开与主节点的复制关系

复制过程简介

  • 保存主节点地址 之后 就直接返回
  • 主从建立socket关系 专门用于主从节点建立通信
  • 发生ping命令 测试网络且判断当前是否可接受处理的命令
  • 权限验证 如果主节点设置了masterauth 则需要密码验证 从节点需要配置 requirepass参数保证与主节点相同的密码才可以通过验证
  • 同步数据集 主从直接正常通信之后 如果是首次建立复制关系 则主节点会将所有的数据发送给从节点

Redis集群相关

Gossip协议工作原理

随机向集群内其它节点发送信息 节点彼此不断通讯  交换信息 理论上一段时间之后 所有的节点都会知道集群的完整信息 类似流言蜚语一样传播
  • 集群内每个节点都会单独开辟一个TCP连接,通讯端口会在基础端口上加上10000
  • 每个节点会在固定时间内 随机向其它节点发送PING消息
  • 收到消息的节点 会用PONG消息 作为相应
  • 到集群内节点出现故障 新节点加入 主从角色变化 槽位消息变化 都需要不断的通过PING/PONG消息通讯

Gossip消息分类

  • PING 用于检测节点是否在线和交换彼此信息 封装了自己和部分其它节点的状态数据
  • PONG 当收到PING MEET消息时 座位相应消息 回复给发送方用于确认通信正常 封装了自身状态的数据 也可以通过PONG广播自身状态 来通知集群内其它节点
  • FAIL 节点判断集群内另外一个节点下线 会向集群内广播一个FAIL消息
  • 数据分区规则采用虚拟槽的方式 所有的键 映射到16384个槽中
  • 搭建集群分为三个步骤 准备节点 节点握手 分配槽

故障转移

故障发现是通过消息传播机制来实现的 主要包括 主观下线和客观下线
  • 主观下线:节点定时向其它节点发送PING消息 接收节点如果在cluster-node-timeoute时间内回复POONG消息 则认为通信成功 否则会标记该节点有故障 但是某个节点认为另外一个节点不可用 只能代表一个节点的意见可能存在误判
  • 客观下线 当某个节点判断另外一个节点主观下线 则故障节点信息会随着PING/PONG消息 在集群内传播 集群内多个节点都认为该节点下线 那么这个故障节点才真正下线 如果持有槽的主节点故障 需要为该节点进行故障转义

Redis原理及集群相关知识的更多相关文章

  1. redis原理及集群主从配置

    一.简介 存储系统背景 存储系统有三类: RDBMS oracle,dh2,postgresql,mysql,sql server NoSQL: KV NoSQL:redis,memcached 列式 ...

  2. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  4. 分布式缓存技术redis系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  5. redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

  6. 进阶的Redis之哈希分片原理与集群实战

    前面介绍了<进阶的Redis之数据持久化RDB与AOF>和<进阶的Redis之Sentinel原理及实战>,这次来了解下Redis的集群功能,以及其中哈希分片原理. 集群分片模 ...

  7. redis系列之4----redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

  8. Redis实战——redis主从复制和集群实现原理

    出自:https://blog.csdn.net/nuli888/article/details/52136822 redis主从复制redis主从配置比较简单,基本就是在从节点配置文件加上:slav ...

  9. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

随机推荐

  1. AOP 应用

    AOP 的核心:解耦 1. 权限认证2. 事务3. 日志4. Lazy loading 懒加载5. Context Process 上下文处理6. Error Handler 错误追踪(异常捕获)7. ...

  2. PAT甲级——1135 Is It A Red-Black Tree (30 分)

    我先在CSDN上面发表了同样的文章,见https://blog.csdn.net/weixin_44385565/article/details/88863693 排版比博客园要好一些.. 1135 ...

  3. Other Linker Flags里加上所需的参数

    在Other Linker Flags里加上所需的参数,用到的参数一般有以下3个: -ObjC -all_load -force_load 下面来说说每个参数存在的意义和具体做的事情. 首先是-Obj ...

  4. css-原理详解

    语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器一般使用id或者class选择器,声明由{}包含,每条声明由一个属性和一个值组成. .city { float:left; ...

  5. c# 参数传递问题(形参与实参)

    形参是指被调用方法中的参数 实参是指传递给方法的参数 (1)值类型传参是按值传递 值类型传参,形参接受到的是实参的一个副本,即形参发生变化,实参不会发生任何变化 (2)引用类型参数按值传递 当参数传递 ...

  6. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

  7. vue 中的router 配置问题 导致的内存溢出~~~

    最近的项目用到 vue, 各种踩坑中. 其中一个就是router映射表写的稍有不慎,就会出现内存溢出的问题, 而且也不会具体告诉你哪里出错,所以很是头疼~~~ 出错多了,发现了一些router的一些规 ...

  8. 关于css中父元素与子元素之间margin-top的问题

    之前在使用经常遇到下面的问题: html: <div class="top"> <div class="one">I'm the fir ...

  9. simhash与重复信息识别

    在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分享给大家,就好比说:“老婆,出来看上帝”…… 随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地 ...

  10. JavaScript实现的9大排序算法

    笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现. 1.插入排序 1)算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原 ...