当前位置: 首页 > news >正文

wordpress无法导入xml莱芜网站优化加徽信xiala5效果好

wordpress无法导入xml,莱芜网站优化加徽信xiala5效果好,网站诊断结论,网站建设 分析本文将分五个部分来分析和总结Redis的内部机制#xff0c;分别是#xff1a;Redis数据库、Redis客户端、Redis事件、Redis服务器的初始化步骤、Redis命令的执行过程。 首先介绍一下Redis服务器的状态结构。Redis使用一个类型为“redisServer”的数据结构来保存整个Redis服务…本文将分五个部分来分析和总结Redis的内部机制分别是Redis数据库、Redis客户端、Redis事件、Redis服务器的初始化步骤、Redis命令的执行过程。 首先介绍一下Redis服务器的状态结构。Redis使用一个类型为“redisServer”的数据结构来保存整个Redis服务器的状态每个属性按照即将讲解的顺序进行排序 struct redisServer { int dbnum;//服务器的数据库数量值由服务器配置的“databases”选项决定默认为16 redisDb *db;//数组保存着服务器中的所有数据库list *clients;//一个链表保存了所有客户端状态每个链表元素都是“redisClient”结构time_t unixtime;//保存秒级精度的系统当前UNIX时间戳减少获取系统当前时间的系统调用次数100毫秒更新一次 long long mstime;//保存毫秒级精度的系统当前UNIX时间戳 unsigned lruclock;//默认每10秒更新一次用于计算数据库键的空转时长数据库键的空转时长 服务器的“lruclock”属性值 - 数据库键值对象的“lru”属性值long long ops_sec_last_sample_time;//上一次进行服务器每秒执行命令数量抽样的时间 long long ops_sec_last_sample_ops;//上一次进行服务器每秒执行命令数量抽样时服务器已执行命令的数量 long long ops_sec_samples[REDIS_OPS_SEC_SAMPLE];//环形数组每个元素记录一次服务器每秒执行命令数量抽样结果估算服务器在最近一秒钟处理的命令请求数量数组长度默认为16100毫秒更新一次 int ops_sec_idx;//ops_sec_samples数组的索引值每次抽样后值增1等于16时重置为0size_t stat_peak_memory;//已使用内存峰值int shutdown_asap;//关闭服务器的标识1表示关闭0不关闭pid_t rdb_child_pid;//记录执行BGSAVE命令的子进程的ID-1表示服务器没有正在执行BGSAVE pid_t aof_child_pid;//记录执行BGREWRITEAOF命令的子进程的ID-1表示服务器没有正在执行BGREWRITEAOF int aof_rewrite_scheduled;//1表示有BGREWRITEAOF命令被延迟了服务器执行BGSAVE期间收到的BGREWRITEAOF会被延迟到BGSAVE执行完成之后执行 struct saveparam *saveparams;//记录了自动保存条件的数组执行BGSAVE的条件 long long dirty;//修改计数器上一次执行BGSAVE之后已经产生了多少修改 time_t lastsave;//上一次执行自动保存操作BGSAVE的时间 sds aof_buf;//AOF缓冲区int cronloops;//serverCron函数的运行次数计数器lua;//用于执行Lua脚本的Lua环境 redisClient *lua_client;//Lua脚本的伪客户端在服务器运行的整个生命周期一直存在直至服务器关闭才会关闭 dict *lua_scripts;//字典记录所有载入的Lua脚本键为某个Lua脚本的SHA1校验和值为对应的Lua脚本 dict *repl_scriptcache_dict;//字典记录已经传播给所有从服务器的所有Lua脚本键为脚本的SHA1校验和值为NULL用于EVALSHA1命令的复制long long slowlog_entry_id;//下一条慢查询日志的ID list *slowlog;//保存了所有慢查询日志的链表 long long slowlog_log_slower_than;//服务器配置“slowlog-log-slower-than”选项的值表示查询慢于多少微秒便记录慢查询日志 unsigned long slowlog_max_len;//服务器配置“slowlog-max-len”选项的值表示服务器最多保存多少条慢查询日志记录若超出最久的记录会被覆盖monitors;//链表监视器客户端列表dict *pubsub_channels;//字典保存所有频道的订阅关系键为某个被订阅的频道值为链表记录了所有订阅这个频道的客户端 list *pubsub_patterns;//链表保存所有模式的订阅关系每个链表节点都包含了订阅的客户端和被订阅的模式 };Redis数据库 在Redis服务器状态结构中“dbnum”属性记录了服务器的数据库数量它的值可以通过服务器配置的“databases”选项决定默认为16。“db”属性是一个数组保存保存着服务器中的所有数据库其中每一个数据库都对应一个“redisDb”数据结构 struct redisDb { dict *dict;//数据库键空间字典保存数据库中所有的键值对 dict *expires;//过期字典保存数据库中所有键的过期时间 dict *watched_keys;//字典正在被WATCH命令监视的键 };数据库键空间   Redis数据库结构的“dict”属性是Redis数据库的键空间底层由字典实现。所有在数据库上的增删改查实际上都是通过对键空间字典进行相应操作来实现的。除此之外还需要进行一些额外的维护操作主要有如下操作内容    1在读取一个键之后服务器会根据键是否存在来更新服务器的键空间命中次数或不命中次数这两个值可以在’info stats’命令返回中的’keyspace_hits’属性和’keyspace_misses’属性中查看。 2在读取一个键之后服务器会更新键的LRU属性值最后一次使用时间使用’object idletime’命令可以查看键的闲置时间。 3在读取一个键时若发现该键已过期则删除这个键。 4如果有客户端使用’watch’命令监视了某个键服务器在对被监视的键进行修改之后会将这个键标记为脏从而让事务程序注意到这个键已经被修改过了。 5服务器每次修改一个键之后都会对脏键计数器即Redis服务器状态的’dirty’属性的值加一这个计数器会触发服务器的持久化以及复制操作。 6如果服务器开启了数据库通知功能在对键进行修改之后服务器将按配置发送相应的数据库通知。 过期字典   Redis数据库结构的“expires”属性保存了Redis数据库所有拥有过期时间的键以及它们对应的过期时间底层同样由字典实现。数据库键过期时间的设置和删除实际上都是对过期字典的操作。其中字典的键是一个个指针分别指向键空间字典中的一个个键对象共享对象节省内存空间字典的值则是一个个long long类型的整数表示的毫秒精度的UNIX时间戳保存数据库键的过期时间。 1. 键过期时间设置 expire以秒为单位设置Redis键的生存时间。 pexpire以毫秒为单位设置Redis键的生存时间。 expireat以秒为单位设置Redis键的过期时间。 pexpireat以毫秒为单位设置Redis键的过期时间。 注实际上’expire’、‘pexpire’、expireat’命令最后都会转换为’pexpireat’命令来执行。 2. 键过期时间查看 ttl以秒为单位返回键的剩余生存时间。 pttl以毫秒为单位返回键的剩余生存时间。 3. 键过期判定   检查当前Unix时间戳是否大于键的过期时间是则过期否则不过期。 4. 过期键的理论删除策略 1定时删除   设置一个键过期时间的同时创建一个定时器。每个带有过期时间的键都对应着一个定时器。   这种策略对内存是最友好的但对CPU时间是最不友好的。创建一个定时器需要用到Redis服务器中的时间事件而当前时间事件的实现方式为无序链表查找一个事件的时间复杂度为O(N)并不能高效地处理大量时间事件。 2惰性删除   访问一个键的时候再检测该键是否过期是则删除之。   这种策略对CPU时间是最友好的但对内存是最不友好的。没被访问到的过期键永远不会被删除可以看做内存泄露。对于运行状态非常依赖于内存的Redis来说这种策略显然会影响到Redis的性能。 3定期删除   这种策略是对前两种策略的整合与折中方案。使用这种策略需要控制好删除操作每次执行的时长和执行的频率否则会退化为前两种策略的其中一种。 5. Redis采用的过期键删除策略   Redis服务器实际使用的是惰性删除和定期删除两种策略配合使用的方案。 1惰性删除策略的实现   所有读写数据库的Redis命令在执行之前都会先检查输入键是否已过期过期则删除之。 2定期删除策略的实现   在规定时间内分多次遍历服务器中的各个数据库从数据库的过期字典中随机检查一部分键的过期时间并删除其中的过期键。 1定期删除程序每次运行时都会从一定数量的数据库中取出一定数量的随机键进行检查并删除其中的过期键。 2使用一个全局变量记录当前删除程序检查的是第几个数据库下一次运行都会接着上一次的进度进行处理。 3随着删除程序的不断执行服务器中所有的数据库都会被检查一遍然后这个全局变量被重置为0开始新一轮的检查工作。 6. AOF、RDB和复制功能对过期键的处理 1生成RDB文件   在执行save或bgsave命令创建一个新的RDB文件时程序会对数据库中的键进行检查已过期的键不会被保存到新创建的RDB文件中。 2载入RDB文件 1主服务器模式载入RDB文件时程序会对文件中保存的键进行检查只有未过期的键会被 载入到数据库中。2从服务器模式文件中保存的所有键都会被载入到数据库中。不过因为主从服务器在进行数据同步的时候从服务器的数据库会被清空所以过期键对载入RDB文件的从服务器也不会造成影响。 3AOF文件写入   当过期键被惰性删除或定期删除之后程序会向AOF文件追加一条del命令来显式地记录该键已被删除。 4AOF重写   程序会对数据库中的键进行检查已过期的键不会被保存到重写后的AOF文件中。 5复制   当服务器运行在复制模式下时从服务器的过期键删除动作由主服务器控制 1主服务器在删除一个过期键之后会显式地向所有从服务器发送一个del命令告知从服务器删除这个过期键。2从服务器在执行客户端发送的读命令时即使碰到过期键也不会将其删除而是将过期键的值继续返回给客户端。3从服务器只有在接到主服务器发送来的del命令之后才会删除过期键。 Redis客户端 Redis服务器状态结构中的“clients”属性是一个链表保存了所有连接到当前服务器的客户端状态每个客户端状态使用类型为“redisClient”的数据结构进行表示每个属性按照即将讲解的顺序进行排序 //Redis客户端的状态结构 struct redisClient { redisDb *db;//记录客户端当前正在使用的数据库 int fd;//客户端正在使用的套接字描述符-1表示伪客户端AOF文件或者Lua脚本大于-1表示普通客户端 robj *name;//客户端名字 int flags;//客户端标志记录了客户端的角色以及客户端目前所处的状态 sds querybuf;//输入缓冲区根据输入内容动态地缩小或扩大但不能超过1GB否则服务器将关闭这个客户端 robj **argv;//命令与命令参数数组每个元素都是一个字符串对象argv[0]为命令其余元素为参数 int argc;//argv数组的长度 struct redisCommand *cmd;//当前执行的命令的实现函数指向命令表中的命令结构 char buf[REDIS_REPLY_CHUNK_BYTES];//固定大小输出缓冲区数组默认大小为16KB int bufpos;//buf数组目前已使用的字节数量 list *reply;//可变大小输出缓冲区链表 obuf_soft_limit_reached_time记录了“reply”输出缓冲区第一次到达软性限制的时间用于计算持续超出软性限制的时长以此决定是否关闭客户端 int authenticated;//0表示未通过身份验证1表示已通过身份验证 time_t ctime创建客户端的时间可用于计算客户端与服务器连接的时间长度 time_t lastinteraction客户端与服务器最后一次进行互动的时间可用于客户端的空转时长 multiState mstate;//事务状态包含一个事务队列以及一个已入列命令计数器 };“db”   是一个指针指向Redis服务器状态结构中的“db”数组其中一个元素表示当前客户端正在使用的数据库。   默认情况下Redis客户端的目标数据库为0号数据库可以通过select命令切换所以select命令的实现原理为修改redisClient.db指针让它指向服务器中指定的数据库。 示例图 “fd”   连接当前客户端与Redis服务器的套接字描述符。值为-1表示伪客户端AOF文件或者Lua脚本值大于-1则表示普通客户端。   Redis客户端分为普通客户端与伪客户端两种类型其中通过网络连接与Redis服务器进行连接的就是普通客户端反之则是伪客户端了。伪客户端也有两种类型分别是Lua脚本的伪客户端和AOF文件的伪客户端。Redis服务器状态结构的“lua_client”属性就保存了Lua脚本的伪客户端它会在Redis服务器初始化时就被创建负责执行Lua脚本中包含的Redis命令在服务器运行的整个生命周期一直存在直至服务器关闭才会关闭。而AOF伪客户端则是在载入AOF文件时被创建用于执行AOF文件中的Redis命令在AOF文件载入完成之后被关闭。 client list列出目前所有连接到服务器的普通客户端。 “name”   当前客户端名字。 client setname为客户端设置一个名字。 “flags”   客户端标志记录了客户端的角色以及客户端目前所处的状态。例如REDIS_MASTER表示当前客户端是一个主服务器REDIS_BLOCKED表示当前客户端正在被列表命令阻塞。它的值可以是单个标志也可以是多个标志的二进制或。 “querybuf”   输入缓冲区存储客户端输入的内容可以根据输入内容动态地缩小或扩大但不能超过1GB否则服务器将关闭这个客户端。 “argv” “argc”   这两个属性的值都是由输入缓冲区的内容分析得来的。其中“argv”属性是一个数组数组的每个元素都是一个字符串对象argv[0]为客户端当前执行的命令其余元素为传给该命令的参数。而“argc”属性则记录了“argv”数组的长度。 “cmd”   当前执行的命令的实现函数指向命令表中的命令结构。   Redis服务器中保存着一个由字典实现的命令表服务器会根据agrv[0]的值不区分字母大小写在命令表中查找命令对应的命令实现函数然后将“cmd”指针指向这个函数。 命令表示例图 redisCommand结构保存了命令的实现函数、命令的标志、命令应该给定的参数个数命令的总执行次数和总消耗时长等统计信息。 “buf” “bufpos”   “buf”属性是一个数组作为固定大小的输出缓冲区默认大小为16KB用于保存长度比较小的回复服务器给客户端的回复。   “bufpos”属性则记录了“buf”目前已经使用的字节数。 “reply”   链表可变大小的输出缓冲区用于保存长度比较大的回复。   当“buf”数组的空间已用完或者因为回复太大而没办法放进“buf”数组时服务器就会开始使用可变大小缓冲区。   但可变大小的缓冲区也是有限制的分为硬性限制与软性限制两种模式一旦超过硬性限制服务器会立刻关闭客户端若是超过软性限制客户端不会立刻被关闭但若是持续一段时间一直超过软性限制服务器也是会关闭客户端的。这两种限制可以使用Redis配置的“client-output-buffer-limit”选项来进行配置 client-output-buffer-limit 配置示例以下分别为普通客户端、从服务器客户端、执行发布与订阅功能的客户端设置不同的软性限制与硬性限制 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 “obuf_soft_limit_reached_time”   记录了“reply”输出缓冲区第一次到达软性限制的时间用于计算持续超出软性限制的时长以此决定是否关闭客户端。 “authenticated”   身份验证的标识值为0表示未通过身份验证1则表示已通过身份验证。 “ctime”   创建客户端的时间可用于计算客户端与服务器连接的时间长度。 client list“age”域记录了客户端与服务器连接的时间长度。 “lastinteraction”   客户端与服务器最后一次进行互动的时间可用于客户端的空转时长。 client list“idle”域记录了客户端的空转时长。 Redis事件 Redis服务器是一个事件驱动程序需要处理两类事件文件事件与时间事件。 文件事件   Redis服务器通过套接字与客户端或其他Redis服务器进行连接而文件事件就是服务器对套接字操作的抽象。服务器与客户端或其他服务器的通信会产生相应的文件事件而服务器通过监听并处理这些事件来完成一系列网络通信操作。   Redis基于Reactor模式开发了自己的网络事件处理器——文件事件处理器文件事件处理器使用I/O多路复用程序来同时监听多个套接字并根据套接字目前执行的任务来为套接字关联不同的事件处理器。当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时与操作相对应的文件事件就会产生这时文件事件处理器就会调用套接字之前已关联好的事件处理器来处理这些事件。 文件事件处理器的构成 其中I/O多路复用程序通过队列向文件事件分派器传送套接字 时间事件   Redis服务器中的一些操作需要在给定时间点执行时间事件就是服务器对这类定时操作的抽象。 1. 时间事件的分类 1定时事件让一段程序在指定的时间之后执行一次。 2周期性事件让一段程序每隔指定的时间就执行一次。 2. 时间事件的属性 1idRedis服务器为每个时间事件创建的全局唯一ID从小到大递增。 2when毫秒精度的UNIX时间戳记录了时间事件的到达时间。 3timeProc时间事件处理器一个时间事件到达时就会被服务器调用的函数。 3. 时间事件的实现 服务器将所有时间事件都放在一个无序链表中新加入的时间事件总是插入到链表的表头中。每当时间事件执行器运行时它就遍历整个链表查找所有已经到达的时间事件并调用相应的事件处理器。 正常模式下Redis服务器只使用serverCron一个时间事件而在benchmark模式下服务器也只使用两个时间事件。所以时间事件无序链表几乎退化成一个指针使用它来保存时间事件并不影响事件执行的性能。 4. 周期性事件serverCron   持续运行的Redis服务器需要定期对自身的资源和状态进行检查和调整从而确保服务器可以长期、稳定地运行这些定期操作就由周期性事件serverCron来负责执行。周期性事件serverCron会每隔一段时间执行一次直到服务器关闭为止。serverCron默认每隔100毫秒执行一次可以通过Redis配置中的“hz”选项来设置serverCron的每秒回执行次数。   serverCron函数主要负责执行的有以下操作 1更新服务器时间缓存   为了减少获取系统当前时间需要执行的系统调用次数Redis服务器使用状态结构中的“unixtime”和“mstime”两个属性分别缓存秒级精度和毫秒级精度的系统当前UNIX时间戳但是只能用于对时间精确度要求不高的功能对时间精确度高的功能还是会执行系统调用来获取系统当前时间。 2更新LRU时钟   使用服务器状态的“lruclock”属性来保存默认每10秒更新一次用于计算数据库键的空转时长数据库键的空转时长 服务器的“lruclock”属性值 - 数据库键值对象的“lru”属性值。 INFO SERVER“lru_clock”域的值就是服务器状态的“lruclock”属性值。 3更新服务器每秒执行命令次数 INFO STATUS“instantaneous_ops_per_sec”域的值就是Redis服务器在最近一秒钟执行的命令数量。   这个值是根据抽样计算得到的所有结果的平均值。serverCron每100毫秒就进行一次抽样计算其中Redis服务器状态的“ops_sec_last_sample_time”属性记录上一次进行抽样的时间“ops_sec_last_sample_ops”属性记录上一次抽样时服务器已执行命令的数量“ops_sec_samples”数组则用于存放所有抽样计算的结果默认长度为16“ops_sec_idx”属性指定本次抽样计算结果应放入“ops_sec_samples”数组的哪个索引位置它的值在每次抽样后自增1等于16时重置为0。所以每次抽样计算的过程大概如下   ops_sec_samples[ops_sec_idx] (服务器当前已执行命令数量 - ops_sec_last_sample_ops属性值) / (服务器当前时间 - ops_sec_last_sample_time属性值) * 1000;   ops_sec_last_sample_ops属性值 服务器当前已执行命令数量;   ops_sec_last_sample_time属性值 服务器当前时间;   ops_sec_idx ;   if(ops_sec_idx 16) ops_sec_idx 0;   最后服务器每秒执行命令次数 ops_sec_samples数组元素总和 / ops_sec_samples数组长度所以它只是一个估算值。 4更新服务器内存峰值记录   服务器状态的“stat_peak_memory”属性记录了服务器已使用的内存峰值。serverCron每次执行都会比较“stat_peak_memory”属性值与Redis服务器当前使用的内存数量若当前使用的内存数量大于“stat_peak_memory”属性值则使用当前使用的内存数量更新“stat_peak_memory”属性的值。 INFO MEMORY“used_memory_peak”域和“used_memory_peak_human”域分别以两种格式记录了服务器的内存峰值。 5处理SIGTERM信号   在Redis服务器启动时Redis会为服务器进程的SIGTERM信号关联一个信号处理器这个信号处理器负责载服务器收到SIGTERM信号时将Redis服务器状态的“shutdown_asap”属性值置为1。   “shutdown_asap”属性是Redis服务器的关机标识serverCron每次运行都会对它的值进行检查若其值为1则关闭Redis服务器关闭之前会先进行RDB持久化。 6管理客户端资源   serverCron每次运行都会对一定数量的客户端进行以下两个检查 1如果客户端与服务器之间的连接已经超时即客户端已经在很长一段时间内没有与服务器互动则关闭这个客户端。 2若客户端的输入缓冲区大小超过了一定长度则释放当前输入缓冲区重新创建一个默认大小的输入缓冲区防止耗费过多内存。 3若客户端输出缓冲区大小超出限制则关闭客户端。 7管理数据库资源   serverCron每次运行都会对一部分数据库进行检查删除其中的过期键并在有需要时对字典进行收缩操作。 8检查持久化操作运行状态、标识与运行条件   Redis服务器状态中与持久化操作的运行状态、标识以及运行条件相关的属性有以下六个 1rdb_child_pid记录执行BGSAVE命令的子进程的ID值为-1表示服务器没有正在执行BGSAVE命令。 2aof_child_pid记录执行BGREWRITEAOF命令的子进程的ID值为-1表示服务器没有正在执行BGREWRITEAOF命令。 3aof_rewrite_scheduledBGREWRITEAOF命令延迟执行的标识值为1表示有BGREWRITEAOF命令被延迟了服务器执行BGSAVE命令期间收到的BGREWRITEAOF命令请求会被延迟到BGSAVE执行完成之后执行。 4saveparams记录了自动保存条件的数组即执行BGSAVE的条件。可由“save”选项进行配置例如save 900 1表示在900秒之内对数据库至少进行了1次修改则执行BGSAVE命令。可以配置个条件。 5dirty修改计数器记录上一次执行BGSAVE之后已经产生了多少修改。 6lastsave上一次执行自动保存操作BGSAVE的时间。   serverCron每次运行都会检查“rdb_child_pid”和“aof_child_pid”两个属性的值只要其中一个属性的值不为-1就检查子进程是否有信号发送给服务器进程 1若有信号表示新的RDB文件已经生成完毕或者AOF文件已经重写完成服务器需要进行相应命令的后续操作比如用新的RDB文件替换现有的RDB文件或者用重写后的AOF文件替换现有的AOF文件。 2若没信号则表示持久化操作尚未完成程序不做任何操作。   如果检查之后发现“rdb_child_pid”和“aof_child_pid”两个属性的值都为-1表示服务器没有正在进行持久化操作这时会按以下三个步骤进行相应检查 1检查“aof_rewrite_scheduled”属性的值若为1表示有BGREWRITEAOF操作被延迟了则开始一次新的BGREWRITEAOF操作。 2检查服务器的自动保存条件是否满足循环取出“saveparams”数组中的所有条件配置逐个与“dirty”和“lastsave”属性的值进行对比只要其中一个条件配置的时间间隔大于“dirty”属性值并且修改数量大于“lastsave”属性值则表示自动保存的条件已经满足若此时服务器没有正在执行其他持久化操作则开始一次新的BGSAVE操作。 3检查服务器设置的AOF重写条件是否满足如果满足并且服务器没有正在执行其他持久化操作自动开始一次新的BGREWRITEAOF操作。 整个检查过程的流程图 9将AOF缓冲区的内容写入AOF文件   如果服务器开启了AOF持久化功能serverCron运行时会检查AOF缓冲区“aof_buf”中有没有内容若有则将AOF缓冲区中的内容写入AOF文件中。 10增加cronloops计数器的值   Redis服务器状态的“cronloops”属性记录了serverCron函数执行的次数serverCron会在每次执行之后将“cronloops”属性的值加一。 事件的调度与执行 1获取到达时间与当前时间最接近的时间事件。 2阻塞并等待文件事件产生。避免频繁轮询时间事件 3若有文件事件产生则处理文件事件。 4若获取的时间事件的到达时间已到则执行时间事件完成之后重新从步骤一开始新一轮的事件循环。   Redis服务器对文件事件和时间事件的处理都是同步、有序、原子地执行的。因为时间事件在文件事件之后执行并且事件之间不会出现抢占所以时间事件的实际处理时间通常会比时间事件设定的到达时间稍晚一些。 Redis服务器初始化步骤 1初始化服务器状态结构   创建一个struct redisServer类型的实例变量作为服务器的状态并为结构中的各个属性设置默认值例如服务器的运行ID、默认配置文件路径、默认端口等等同时创建Redis命令表。 2载入配置选项   载入用户指定的配置参数和配置文件并根据用户设定的配置对服务器状态变量的相关属性进行修改。 3初始化服务器数据结构   这一步主要是为服务器状态中的一些数据结构分配内存例如 1“clients“链表保存所有与服务器连接的客户端的状态结构。 2”db“字典保存服务器的所有数据库。 3”pubsub_channels“字典保存频道订阅信息。 4“pubsub_patterns”链表保存模式订阅信息。 5”lua“用于执行Lua脚本的Lua环境。 6”slowlog“用于保存慢查询日志。   除此之外还会进行一些非常重要的设置操作例如 1为服务器设置进程信号处理器。 2创建共享对象例如经常经常用到的“OK”回复字符串对象1到10000的字符串对象等等。 3为serverCron函数创建时间事件。 4如果AOF持久化功能已经打开则打开现有的AOF文件若AOF文件不存在则创建并打开一个新的AOF文件为AOF写入做好准备。 5初始化服务器的后台I/O模块为将来的I/O操作做好准备。 4还原数据库状态   若服务器启用了AOF持久化功能则载入AOF文件否则载入RDB文件根据AOF文件或RDB文件记录的内容还原数据库状态同时在日志文件中打印出载入文件并还原数据库状态所耗费的时长。 5执行事件循环   一切准备就绪开始执行服务器的事件循环开始接受客户端的连接请求处理客户端发送的命令请求。 Redis命令请求的执行过程 1发送命令请求   当用户在客户端中键入一个命令请求时客户端会将这个命令请求转换成协议格式然后通过连接到服务器的套接字将协议格式的命令请求发送给服务器。 2读取命令请求   当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时服务器将调用命令请求处理器来执行以下操作 1读取套接字中协议格式的命令请求并将其保存到客户端状态的输入缓冲区“querybuf”中。 2对输入缓冲区中的命令请求进行分析提取出命令请求中包含的命令参数计算命令参数的个数然后分别将它们保存到客户端状态的“argv”属性和“argc”属性中。 3调用命令执行器执行客户端指定的命令。 3命令执行器——查找命令   根据客户端状态的argv[0]参数在命令表中查找参数所指定的命令查找结果不受命令名字大小写影响并将其保存到客户端状态的“cmd”属性中。命令表是一个字典字典的键是命令的名字字典的值是一个“redisCommand”结构记录着Redis命令的实现函数与一些统计信息 设置客户端状态的“cmd”属性的示例图 4命令执行器——执行预备操作 1检查客户端状态的“cmd”指针是否指向NULL以此判断用户输入的命令是否存在。 2根据客户端状态的“cmd”属性指向的“redisCommand”结构中的“arity”属性值和客户端状态的“argc”属性值判断用户输入的命令参数个数是否正确。 3通过客户端状态的“authenticated”属性值判断客户端是否已经通过了身份验证未通过只能执行AUTH命令。 4如果服务器打开了“maxmemory”功能在执行命令之前需要先检查服务器的内存占用情况并在有需要时进行内存回收若内存回收失败则不再执行后续步骤向客户端返回一个错误。 5如果服务器上一次执行BGSAVE命令时出错并且服务器打开了stop-writes-on-bgsave-error功能 而且服务器即将要执行的命令是一个写命令那么服务器将拒绝执行这个命令并向客户端返回一个错误。 6如果客户端当前正在用SUBSCRIBE命令订阅频道或者正在用PSUBSCRIBE命令订阅模式 那么服务器只会执行客户端发来的SUBSCRIBE 、PSUBSCRIBE 、UNSUBSCRIBE 、PUNSUBSCRIBE四个命令其他别的命令都会被服务器拒绝。 7如果服务器正在进行数据载入那么客户端发送的命令必须带有“l”标识比如INFO 、SHUTDOWN 、PUBLISH等等才会被服务器执行其他别的命令都会被服务器拒绝。 8如果服务器因为执行Lua脚本而超时并进入阻塞状态那么服务器只会执行客户端发来的SHUTDOWN nosave命令和SCRIPT KILL命令其他别的命令都会被服务器拒绝。 9如果客户端正在执行事务那么服务器只会执行客户端发来的EXEC 、DISCARD 、MULTI 、WATCH四个命令其他命令都会被放进事务队列中。 10如果服务器打开了监视器功能那么服务器会将要执行的命令和参数等信息发送给监视器。 5命令执行器——调用命令的实现函数 client-cmd-proc(client);//client是指向客户端状态的指针   调用实现函数执行指定操作产生的相应的命令回复将其保存到客户端状态的输出缓冲区中并为客户端的套接字关联命令回复处理器这个处理器负责将命令回复返回给客户端。 6命令执行器——执行后续工作 1如果服务器开启了慢查询日志功能那么慢查询日志模块会检查是否需要为刚刚执行完的命令请求添加一条新的慢查询日志。 2根据刚刚执行命令所耗费的时长更新被执行命令的“redisCommand”结构的“milliseconds”属性 并将命令的“redisCommand”结构的“calls”计数器的值增一。 3如果服务器开启了AOF持久化功能 那么AOF持久化模块会将刚刚执行的命令请求写入到AOF缓冲区里面。 4如果有其他从服务器正在复制当前这个服务器那么服务器会将刚刚执行的命令传播给所有从服务器。 7将命令回复发送给客户端   当客户端套接字变为可写时服务器就会执行命令回复处理器将保存在客户端输出缓冲区的命令回复发送给客户端。发送完毕之后清空客户端输出缓冲区。 8客户端接受并打印命令回复   客户端接收到协议格式的命令回复之后将其转换成人类可读的格式并打印在客户端屏幕上。
http://www.pierceye.com/news/573869/

相关文章:

  • 在哪里购买虚拟空间建设网站网页设计培训机构培训费
  • 网站建设的色彩搭配做网站赚钱吗 怎么赚
  • 门头沟富阳网站建设西安企业电话
  • 电子商务网站建设概括湘潭专业seo优化推荐
  • 炫彩发光字制作免费网站动漫制作就业方向
  • 阿里巴巴可以做网站吗网站的可用性
  • 云虚拟主机怎么做2个网站装饰工程施工
  • 网站备案查询流程wordpress手机页面没有注册
  • 辽宁城乡建设集团官方网站精品课程网站建设
  • 威海 网站建设个人做网站可以盈利么
  • 机关网站源码网站建设 备案什么意思
  • 做理财的网站有哪些怎么弄数据库备份做网站
  • 网站不接入备案易企互联网站建设
  • 那种网站打不开北京网站建设找华网天下
  • 网站建设seo优化浙江网站名称怎么收录
  • 天津网站制作工具想自己做网站 有免费的吗
  • 宝塔织梦网站建设求网站备案照片
  • 聊城住房和城乡建设厅网站研发项目管理软件
  • 国投集团网站开发杭州网站界面设计
  • 做关于什么的网站莆田网站建设解决方案
  • 湖南长沙做网站那些网站可以做反链
  • 成都金牛网站建设公司高端网站配色
  • 做喜报的网站设计师的工作内容
  • 济南网站建设工作wordpress 资讯
  • 网站调用数据库平台公司名单
  • 移动网站怎么做成都设计公司名字
  • 杭州最好的网站设计公司服务器域名解析
  • 做试用网站的原理塘沽网吧开门了吗
  • 网站域名的作用古典网站源码
  • 做直播网站软件有哪些软件涿州网站建设有限公司