- 浏览: 142319 次
最新评论
文章列表
Vim 原生就具备了很强大的功能,在 vim 中,基本的编辑移动命令格式如下:
[number][cmd]textObj
其中,cmd 和 number 的位置可以互换,而且都是可选的,此外,也并非所有的编辑命令都可以与移动命令一起使用。这三者的含义如下:
* number:表示执行这个命令的次数。
* cmd:表示 c、d、y 等编辑命令。
* textObj:表示 w、b、j 等移动命令,甚至是形如“/pattern”的模式移位。
接下来就来看看具体的命令吧!
...
Redis 2.6 版本开始引入对 Lua 脚本的支持,通过在服务器中嵌入 Lua 环境,Redis 客户端可以使用 Lua 脚本,直接在服务端原子地执行多个 Redis 命令。如下所示:
redis> EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 "msg" "hello world"
OK
redis> GET msg
"hello world"
本文将对这整个过程进行介绍。
创建 ...
Redis 事务是通过 MULTI、EXEC、WATCH 等命令来实现的。本节接下来会对这些命令的实现细节进行一一展开。
一个 Redis 事务从开始到结束通常会经历以下三个阶段:
1)事务开始。MULTI 命令的执行标 ...
在Redis集群实现原理一节,我们介绍了 Redis 集群的实现细节,以及所使用的主要数据结构,本节将对集群节点的复制方法,检测节点是否下线的方法,以及对下线主节点进行故障转移的方法一一进行探讨。
...
Redis 集群是 Redis 提供的分布式数据库方案,它通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。
节点
一个 Redis 集群通常由多个节点(node)组成。一个节点就是运行在集群模式下的一台 Redis 服务器,Redis 服务器在启动时会根据 cluster-enabled 配置选项来决定是否开启集群模式。
每个 Redis 节点开始时都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,必须将各个独立的节点连接起来,这可以通过“CLUSTER MEET <ip> <po ...
Sentinel(哨兵)是 Redis 的高可用性(high availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及它们属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,之后改由它来处理命令请求。
本节接下来将对 Sentinel 系统的初始化过程、实现原理,以及它如何对主服务器执行故障转移等操作进行详细的介绍。
启动并初始化 Sentinel
启动一个 Sentinel 可以使用命令:
...
在连接到一台 Redis 服务器的客户端上执行 SLAVEOF 命令,可以使其成为另一台服务器的从服务器(slave),达到复制该主服务器(master)的目的。进行复制中的主从服务器双方的数据库将保存相同的数据,即所谓的“数 ...
Redis 服务器是典型的一对多服务器程序,通过使用由 I/O 多路复用技术实现的文件事件处理器,Redis 服务器使用单进程单线程的方式来处理命令请求,并与多个客户端进行网络通信。Redis 服务器状态结构 redisServer 的 clients 链表属性就保存了所有连接的客户端的状态结构,对客户端执行批量操作或者查找某个指定的客户端,都可以通过遍历 clients 链表来完成。
对于每个连接的客户端,服务器都为之建立了相应的 redisClient 结构,其中保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,包括:
* 客户 ...
上一节介绍了浮点数与各种数值类型之间的相互转换所用到的指令,本节则介绍进行各种浮点运算所需的指令。
先来看看下面一组用于执行算术运算的标量 AVX2 浮点指令。
其中,每条指令有一个或两个源操作数 S1、S2,以及一个目的操作数 D。第一个源操作数 S1 可以是一个 XMM 寄存器或一个内存位置,而第二个源操作数和目的操作数都必须是 XMM 寄存器。每个操作都有一条针对单精度和一条双精度的指令。结果都存放在目的寄存器中。
考虑下面的浮点 C 函数。
double funct(double a, float x, double ...
在浮点寄存器概述一节中对浮点寄存器和浮点传送指令进行了相关介绍,这里将继续给出浮点数和整数数据类型之间以及不同浮点格式之间进行转换的指令集合,它们都是对单个数据值进行操作的标量指令。
...
本文介绍的浮点寄存器是基于 AVX2(Advanced Vector Extension,高级向量扩展,2 表示第二个版本)的,这是目前最新的,旧一点的还有如 SSE(Streaming SIMD Extension,流式 SIMD 扩展,SIMD 即单指令多数据)、MMX 等,这些浮点指令体系因为历史原因也被称为媒体指令,因为早期主要是用于支持图形和图像处理。每个扩展都是管理寄存器组中的数据,这些寄存器组在 MMX 中称为“MM”寄存器(64 位),SSE 中称为“XMM”寄存器(128 位),AVX 中则称为“YMM”寄存器(256 位)。
要使 GCC 生成 ...
除了前面提到的 RDB 持久化功能外,Redis 还提供了 AOF(Append Only File)持久化。与 RDB 通过保存数据库中的键值对来记录数据库状态不同,AOF 是通过保存 Redis 服务器所执行的写命令来记录数据库状态的。
被写入 AOF 文件的所有命令都是以 Redis 的命令请求协议格式保存的,这是一种纯文本格式,可以直接打开观察其内容。例如,下图是在 0 号数据库中执行了 SET、SADD 和 RPUSH 命令后保存的 AOF 文件内容。
其中,除了用于指定数据库的 SELECT 命令是服务器自动添加的之外,其他的都是之前 ...
在RDB 持久化一节中,我们对 RDB 持久化功能进行了详细的介绍,这一节将对 RDB 文件结构作进一步的剖析。
一个完成的 RDB 文件结构按顺序包含如下几个部分:
* REDIS 常量:RDB 文件的最开头部分,长度为 5 个字节,保存着“REDIS”五个字符(没有普通 C 字符串末尾的'\0'字符,因为 RDB 文件保存的是二进制数据),程序在载入文件时可凭此快速检查所载入的文件是否是 RDB 文件。
* db_version:长度为 4 个字节的字符串表示的整数,记录了 RDB 文件的版本号,比如“0006”就代表 RDB ...
正常执行的情况下,指令会按照顺序一条条地执行,使用跳转(jump)指令可以改变这种行为。在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部分。下表列举了不同的跳转指令。
其中,jmp 指令是无条件跳转,它可以是直接跳转,即跳转目标是作为指令的一部分编码的;也可以是间接跳转,即跳转目标是从寄存器或内存位置中读出的。汇编语言中,直接跳转是给出一个标号(如“.L1”)作为跳转目标的。间接跳转的写法是“*”后面跟一个x86-64 中的寄存器与汇编操作数 ...
RDB 持久化功能可以将 Redis 在某个时刻内存中的数据库状态保存到 RDB 磁盘文件里面,以免数据丢失。RDB 文件是一个经过压缩的二进制文件,通过该文件亦可还原生成 RDB 文件时的数据库状态。
RDB 持久化可以手动执行,也可根据服务器配置选项定期执行。
SAVE 和 BGSAVE 命令可以用于生成 RDB 文件。SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕,在阻塞期间,服务器会拒绝客户端的任何命令请求。而 BGSAVE 命令则会单独派生一个子进程来负责创建 RDB 文件,因此服务器进程可以继续处理命令请求。创 ...