zoukankan      html  css  js  c++  java
  • Redis设计与实现:读书笔记之二

    1.数据库

    • Redis服务器一般包含多个db,默认16个。

    clip_image001

    • 切换数据库

    每个redis客户端都有自己的目标数据库,默认为0,可以通过select 1,切换数据库。

    • 设置键的生存周期和过期时间

    PTTL key

    获取key的有效毫秒数

    TTL key

    获取key的有效时间(单位:秒)

    PERSIST key

    移除key的过期时间

    EXPIREAT key timestamp

    设置一个UNIX时间戳的过期时间

    PEXPIRE key milliseconds

    设置一个key的过期的毫秒数

    PEXPIREAT key milliseconds-timestamp

    设置一个带毫秒的UNIX时间戳的过期时间

    • 过期键的删除策略
      • 定时删除:设置键的过期时间时,自动创建timer,让定时器自动立即删除。
      • 惰性删除:在获取键值时,判断是否过期,如果过期,则删除。
      • 定期删除:每隔一段时间对数据库做一次检测,删除过期键值
    • Redis的删除策略:惰性删除+定期删除

    clip_image002

    2.RDB持久化

    RDB持久化是对数据库状态磁盘存储。

    RDB文件是一个经过压缩的二进制文件。

    通过RDB文件可以恢复数据库状态。

    通过SAVE、BGSAVE命令可以备份数据库

    Save命令会阻塞Redis服务器进程。

    BGSave会派生一个子进程进行备份,原有进程继续提供服务。

    RDB文件在还原时,服务是阻塞的。

    可以在Redis配置文件中,设置BGSAVE的自动备份策略。例如:

    Save 900 1 --服务器在900s内,如果有大于1次修改,触发自动备份

    Save 300 10 --服务器在300s内,如果有大于10次的修改,触发自动备份

    Save 60 10000 --服务器在60s内,如果有大于10000次的修改,触发自动备份

    Redis服务器每个100毫秒(默认)会检测一次自动备份策略是否满足

    因为AOF的更新频率比RDB要高,如果Redis开启了两个备份策略,那么AOF会先于RDB还原数据库状态。支持关闭AOF的时候,RDB才有效。

    RDB文件结构:其中REDIS、EOF是常量

    clip_image003

    clip_image004

    3.AOF持久化

    AOF:Appent only file

    原理:通过保存数据库的写命令来记录数据库状态的。

    clip_image005

    Redis服务器会在内存中保存一个写命令缓冲区,通过appendfsync可配置写入AOF文件的频率。

    clip_image006

    clip_image007

    AOF文件还原过程

    clip_image008

    AOF重写:AOF是通过保存写命令来记录数据库状态的。随着时间的变化,AOF文件会越来越大,会存在很多垃圾命令。AOF重写就是解决此问题的。AOF重写不是对就文件的整理,而是对数据库状态的重新备份。

    4.事件

    文件事件:Redis客户端与服务器的通讯会产生文件事件。文件事件就是服务器对socket操作的抽象。

    clip_image009

    clip_image010

    时间事件:特定时间指定特定动作。

    5.发布订阅

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。

    pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能

    订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。

    当发布者通过publish命令向redis server发送特定类型的消息时

    订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息

    redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持。

    clip_image011

    6.事物

    Redis事物提供了一种将多个命令请求打包,然后一次性、按顺序的执行多个命令的机制。并且在事物执行期间,服务器不会中断事物,而去响应其他客户端的命令请求。

    clip_image012

    事物从开始到结束经过三个阶段:

    • 事物开始:multi命令,将执行命令的客户端从非事物状态转为事物状态
    • 命令入队:当客户端处于非事物状态时,客户端命令是被服务器立即执行的,但是客户端处于事物状态时,服务端收到的命令不会立即执行,而是进入一个队列(Exec、discard、watch、multi命令除外)。

    clip_image013

    • 事物执行:当收到exec命令后,服务端会立即执行队列中的命令。

    Watch:给指定的key加锁,只有当前客户端可以修改,其他客户端的修改都会导致事物不被执行(注意不是执行失败)。

    clip_image014

    事物的原子性:Redis事物中的命令要么全部执行,不要一个都不执行,是具有原子性的。但是,没有回滚机制,在命令列表中,即使第一个命令执行失败了,后面命令也会被执行到。

    事物的一致性:Redis通过谨慎的错误检查和简单的设计来保证事物的一致性。

    入队错误:命令语法错误,将导致事物无法执行。(2.6.5之前版本不支持)

    执行错误:执行过程中出现错误的,出错的命令不执行回滚,不影响其他命令。

    服务端停机:RDB模式无影响、AOF模式无影响、不持久化模式无影响。

    事物的隔离线:Redis使用单线程模式执行事务,Redis的事物总是串行执行的。

    事物的耐久性:(耐久性:当一个事物执行完毕后,数据是存储到磁盘中的)与具体的持久化策略有关系。

    7.慢查询日志

    Redis慢查询日志用于记录执行时间超过给定值的命令请求。

    Slowlog-log-slower-than:执行时间超过多少微秒,记录日志

    Slowlog-max-len:最多保存多少条慢日志。

    慢日志查看:通过slowlog get命令可以获取到

    8.Monitor

    redis客户端可以通过monitor命令把自己变为监视器,通过此功能可以看到redis服务执行的命令请求。

    9.数据库复制

    老版本:

    clip_image015

    clip_image016

    新版本

    从服务器离线后,SYNC命令变为PSYNC。

    PSYNC具有两种模式:完整重同步、部分重同步。完整重同步用于第一次同步的场景、部分重同步用于离线后同步的场景。

    clip_image017

    clip_image018

    原理:从服务器每次更新后记录偏移量,短线重新同步时,通过偏移量计算需要同步的命令。

    clip_image019

    clip_image020

    clip_image021

    心跳检查

    从服务器默认每秒向主服务器发送一次心跳检测命令:replconf ack <replication_offset>.其中replication_offset是当前从服务器的偏移量。

    命令主要有三个作用:

    1.检测主从服务器间的网络状态

    2.辅助检查min-slaves选项:当从服务器数量小于3个,或者三个从服务器的延迟值大于或者等于10秒,主服务器拒绝写命令。

    Min-slaves-to-write 3

    Min-slaves-max-lag 10

    3.检测命令丢失

    10.sentinal

    Redis的HA官方解决方案

    用途:

    1.监控所有主从服务器

    2.当主服务器下线后,自动把主服务器下属的一个从服务器升级为主服务器。

    clip_image022

    clip_image023

    11.集群

    加入集群:一个Redis集群可有多个node组成。通过向一个阶段发送:cluster meet <ip> <port>命令,把节点加入到集群中(需要启用集群模式)

    clip_image024

    clip_image025

    集群建立之后,每个node都具有一份完整的节点状态信息。

    clip_image026

    槽指派:redis服务器通过对键分片的方式实现集群。整个数据库被分为16384个槽(slot),数据库中的每个键都被分配存储到16384个槽中其中一个。集群的每个节点可以处理0到16384个槽。当16384个槽都被集群处理时,数据库集群才处于上线状态。

    Slotnum= CRC16(key) & 16383

    每个集群节点都完整了记录了16384个槽与node直接的映射关系。可以通过命令:cluster addslots <slot>[<slot>…]为当前node添加槽。

    clip_image027

    客户端根据Slot与Node的映射关系,处理来自于客户端的数据请求。

    clip_image028

    从节点:可通过命令:Cluster replicate <node-id>,把一个集群中的node设置为当前服务器的主服务器。设置后,所有对node-id的写命令都将在当前集群node中备份。

    当主服务器down后,从服务器自动在从服务器中挑选一个从服务器并设置为主服务器,当down的主服务器还原后,自动设置为从服务器。

  • 相关阅读:
    delphi shr和shl的作用
    delphi socket 编程 使用多线程
    mysql 移除服务,并在cmd下切换目录
    delphi 结构体和TList的用法
    delphi 使用工控机控件 iThreadTimes 出现问题, 导致主程序创建页面的时候, 阻塞消息, 不能正常执行。
    Unicode 和 UTF-8 的区别
    Python 模块 re (Regular Expression)
    Python的函数式编程
    反向解析与PTR(Pointer Record)
    simhash算法
  • 原文地址:https://www.cnblogs.com/vveiliang/p/6513559.html
Copyright © 2011-2022 走看看