《Redis使用手册》第15章 持久化

redis的持久化有3种: RDB持久化 AOF持久化 RDB-AOF混合持久化 15.1 RDB 持久化 redis默认使用RDB 将数据库中存储的键值对数据存放在一个经过压缩的二进制文件中,文件的扩展类型为.rdb 有几种方式创建rbd文件: SAVE 阻塞服务器并创建 RDB 文件 若存在旧的rdb文件则覆盖 BGSAVE 以非阻塞的方式创建 RDB 文件 以创建子进程的方式创建RDB文件 当创建完成后子进程会通知主进程创建完成,并用新文件替换之前的旧文件 注意:如果父进程占用的内存数量非常大,那么在fork子进程时仍然可能造成短暂的阻塞 通过配置选项自动创建RDB文件 save <seconds> <changes> 服务器在seconds秒内至少执行了changes次修改,那么服务器会自动执行一次 BGSAVE 命令 可以同时使用多个上述命令,任一命令满足时就会执行一次 默认配置: save 60 10000 save 300 100 save 3600 1 RDB 文件结构 RDB 文件标识符 版本号 新版服务器总是能够向下兼容旧版redis服务器生成的RDB文件 设备附加信息...

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis使用手册》第16章 发布与订阅

在redis中,客户端可以通过订阅特定的channel来接收该channel的消息,这些客户端称为该channel的subscriber 一个channel可以有多个subscriber,一个subscriber可以订阅多个不同的channel 将消息发送给channel的客户端,被称为publisher 客户端除了订阅频道之外,还可以订阅模式(pattern,例如news.*这样的正则表达式pattern)来接收信息:每当publisher想某个频道发送消息时,不仅频道的subscriber会收到消息,与频道匹配的所有模式的subscriber也会收到消息。 举例说明: 现有:<channel "news.it">、<channel "news.sport">、<pattern "new.*"> 那么订阅<pattern "new.*">的 subscriber 将同时收到<channel "news.it">, <channel "news.sport">的信息 16.1 PUBLISH:向频道发送消息 1 PUBLISH channel message 返回值是接收到的客户端数量 16.2 SUBSCRIBE:订阅频道 1 SUBSCRIBE channel [channel ...] 每订阅成功一个频道,都会返回当前客户端已经订阅的频道数量 订阅成功后,就可以接收到频道的消息,消息格式由三部分组成: 第一部分,内容为message的字符串 第二部分,频道名称 第三部分,消息内容 16.3 UNSUBSCRIBE:退订频道 1 UNSUBSCRIBE channel [channel ...] 若没有指定channel,那么将退订所有channel 返回值:unsubscribe ChannelName SubscriberCntNow 16.4 PSUBSCRIBE:订阅模式 1 psubscribe pattern [pattern ....

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis使用手册》第17章 模块

redis4.0中加入模块 编译模块 载入模块 服务器启动时通过 loadmodule <module_path> 载入模块 服务器运行期间,执行 MODULE LOAD module_path 载入 卸载模块 MODULE UNLOAD module_name 17.2 ReJSON 模块 提供对json的支持 [todo] 17.3 RediSQL 模块 将关系型数据库嵌入redis中 [todo] 17.3 RediSearch 模块 全文搜索引擎 [todo]

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis使用手册》第18章 复制

redis提供的是单主复制功能,而不是多主复制功能(一个主服务器可以有多个从服务器,但是一个从服务器只能有一个主服务器) 在默认情况下,处于复制模式的主服务器可读可写,而从服务器则只能执行读操作 对于开启了复制功能的主从服务器,主服务器在每次执行写操作后,都会与所有的从服务器进行数据同步 18.1 REPLICAOF:将服务器设置为从服务器 1 replicaof host port 从服务器原有数据被清空,被主服务器数据取代 可以通过配置的方式设置从服务器: redis-server --port 10086 --replicof 127.0.0.1 6379 表示启动一个监听10086端口的redis服务器,它是127.0.0.1:6379的从服务器(副本) 使用 replicaof no one 取消复制 ,从服务器的数据会保留 18.2 ROLE:查看服务器角色 主服务器执行ROLE命令 master 复制偏移量 数组:从服务器1的ip 从服务器1的port 从服务器1的复制偏移量 从服务器2的ip 从服务器2的port 从服务器2的复制偏移量 ... 从服务器执行ROLE命令 slave 主服务器ip 主服务器port 与主服务器的连接状态 从服务器当前的复制偏移量 连接状态有6种状态: none 未建立链接 connect 正在握手 connecting 主从服务器成功建立连接 sync 正在进行数据同步 connected 主从服务器已经进入在线更新状态 unknown 主从服务器连接状态未知 18....

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis使用手册》第19章 sentinel

redis sentinel 可以通过心跳检测的方式监视多个主服务器以及它们属下的所有从服务器,并在某个主服务器下线时自动对其实施故障转移 19.1 启动 sentinel 通过运行redis-sentinel命令进行启动,注意需要提供配置文件,否则将报错 一个sentinel配置文件至少需要包含以下选项: 1 sentinel monitor <master-name> <ip> <port> <quorum> master-name是主服务器的名字 ip, port 分别是主服务器的ip和端口 quorum用于指定判断这个主服务器下线所需要的sentinel数量(即至少需要quorum 个sentinel认为主服务器下线了才真的认定主服务器下线了),同一个sentinel网络中的不同sentinel可以有不同的quorum值 sentinel会先监视主服务器,然后获取从服务器名单并对从服务器进行监视 sentinel会对主从服务器都进行心跳检测、并记录各个服务器的在线状态、响应速度等信息 redis sentinel实际上就是一个运行在特殊模式下的redis服务器,用户可以通过redis-server sentinel.conf --sentinel去启动一个sentinel 一个sentinel可以监视任意数量的主服务器,而不是仅仅监视一个主服务器。只需要在配置文件中指定即可 当主服务器下线重新上线时,它会被切换为从服务器 19.1.1 设置从服务器优先级 用户可以通过replica-priority配置选项来设置各个从服务器的优先级 默认值为100,约小优先级越高 replica-priority为0表示从服务器永远不会被选为主服务器 优先级较高的从服务器会被sentinel优先选为主服务器 由于主服务器重新上线会被置为从服务器,最好给主服务器也设置优先级 19.1.2 新主服务器的挑选规则 否决所有已经下线以及长时间没有回复心跳检测的疑似已下线的从服务器 否决所有长时间没有与主服务器通信,数据状态过时的服务器 否决所有replica-priority为0的从服务器 在剩余的服务器中挑选新的主服务器: 优先级最高的从服务器获胜 如果有多个最高优先级相同的从服务器,那么选择复制偏移量最大的 如果仍然相同,那么选择id字典序小的 19.2 sentinel 网络 在一般情况下,只要sentinel网络中有半数以上的sentinel在线,故障转移操作既可以继续进行。 当sentinel网络中某个sentinel认为某个服务器已经下线时,将标记这个主服务器为主观下线(Subjectively Down),然后询问其他sentinel是否也认为该服务器已下线。 当同意主服务器已下线的sentinel数量达到quorum时,sentinel就会将相应的主服务器标记为客观下线,然后对其进行故障转移 因为这种机制的存在,必须将quorum参数的值设置为sentinel数量的半数以上 19.2.1 组件sentinel网络 用户只需要启动多个sentinel,配置要监控的redis服务器即可,sentinel会自动发现对方,并组成相应的sentinel网络 19.3 sentinel 管理命令 19....

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis使用手册》第20章 集群

redis3.0正式引入集群功能 20.1 基本特性 复制与高可用 redis集群与单机版redis一样,也提供主从复制功能,同时也提供类似sentinel一样的功能 redis集群中,主节点负责处理客户端发送的读写请求,从节点负责对主节点进行复制 分片与重分片 与单机版将整个数据库放在同一个数据库上不同,redis集群通过将数据库分散存储到多个节点上来平衡各个节点的负载压力 redis集群会将整个数据库空间划分为16384个槽(slot),而集群中各个主节点则会分别负责处理其中一部分槽。 当用户尝试将一个键存储到集群中时,客户端会先计算出所有键所属的槽,然后根据槽-节点映射表找到对应节点 当用户想向集群中发送添加新节点的命令后,集群会将相应的槽以及槽中存储的数据迁移至新节点。当用户移除节点时,也会将该节点的数据转交给其他节点。整个重分片过程都可以在线进行,无需停机 高性能 redis集群采用无代理模式,客户端发送的所有命令都会直接交由节点执行,并且对于经过优化的集群客户端来说,客户端发送的命令在绝大部分情况下都不需要实施转向,或者仅需一次转向,因此在redis集群中执行命令的性能与单机上执行非常接近 除了节点间互通信息带来的性能损耗外,单个redis集群节点处理命令请求的性能与单个redis服务器处理命令请求的性能几乎别无二致。 从理论上来讲,集群每增加一倍数量的主节点,集群对于命令请求的性能就会提高一倍 简单易用 20.2 搭建集群 两种方式搭建集群。一是使用源码附带的集群自动搭建程序create-cluster,二是使用配置文件手动搭建集群 20.2.1 使用create-cluster创建 ./create-cluster start 创建6个节点 ./create-cluster create把6个节点组合成一个集群,包含3个主节点,3个从节点 ./create-clust stop 关闭 连接集群时,需要指定参数redis-cli -c -p <port> 如果接收到命令请求的节点并目标节点,那么客户端将根据节点提示的转向信息再次向正确的节点发送命令请求(这个过程被称为转向redirect)。(类似于dns,告诉客户端目标地址,而不是转发请求) 20.2.2 手动搭建集群 1 2 3 mkdir my-cluster cd my-cluster mkdir node1 node2 node3 node4 node5 node6 给每个节点的文件夹子添加名为redis.conf的配置文件并写入如下内容: 1 2 cluster-enabled yes port 3000x 其中x为1到6...

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis设计与实现》Part01 第01章~第08章

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀

《Redis设计与实现》Part02 第09章~第14章

第09章-数据库 9.1 服务器中的数据库 1 2 3 4 5 6 struct redisServer { ... redisDb *db; // 指向一个数据库数组 int dbnum; /* Total number of configured DBs */ ... }; dunum 属性的值由配置项database决定,默认为16 9.2 切换数据库 1 2 3 4 5 struct client { ... redisDb *db; // 记录client正在使用的db ... } 默认为0号数据库 可以使用select切换 9.3 数据库键空间 1 2 3 4 5 6 typedef struct redisDb { ....

created: 2023-04-04  |  updated: 2023-04-04  |  阿秀