![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis设计与实现
hudongdongjava
这个作者很懒,什么都没留下…
展开
-
19、内存模型
1、内存统计查看内存:127.0.0.1:6379> info memory# Memoryused_memory:689408used_memory_human:673.25Kused_memory_rss:652472used_memory_rss_human:637.18Kused_memory_peak:766384used_memory_peak_human:748.42Ktotal_system_memory:0total_system_memory_human:0B原创 2020-10-21 15:22:04 · 194 阅读 · 0 评论 -
18、客户端协议RESP
RESP(REdis Serialization Protocol,redis序列化协议)语法:CRLF代表\r\n*<参数数量> CRLF$<参数1的字节数量> CRLF<参数1> CRLF...$<参数N的字节数量> CRLF<参数N> CRLF 示例:set hello world 客户端会将set hello world封装成*3\r\n$3\r\nset$5\r\nhello\r\n$5\r\nworld\r\原创 2020-10-21 13:47:44 · 112 阅读 · 0 评论 -
17、慢日志查询
相关参数 slowlog-log-slower-than:执行时间超过微秒(1秒=1000毫秒=1000000微秒),命令请求记录到日志上,默认10000(10毫秒) slowlog-max-len:日志长度,默认128命令 slowlog get [n]:获取慢查询日志,n指定条数 示例:1) (integer) 6652) (integer) 14567184003) (integer) 120064) 1) "SETEX"2) "video_info_200"3) "30原创 2020-10-21 12:00:18 · 107 阅读 · 0 评论 -
16、sort排序
sort <key> [asc] [desc]:根据指定key的值排序,key的值只能是数字示例:127.0.0.1:6379> rpush numbers 5 3 4(integer) 3127.0.0.1:6379> sort numbers1) "3"2) "4"3) "5"sort <key> [alpha] [asc] [desc]:根据指定key的值排序,key的值可以是数字或字母示例:127.0.0.1:6379> sadd l原创 2020-10-21 11:57:22 · 323 阅读 · 0 评论 -
16、LUA
redis服务器创建了一个伪客户端用来执行lua命令,lua_scripts字典用来保存lua脚本命令: eval <脚本内容> <key个数> [key列表] [参数列表]:执行指定的脚本 示例:127.0.0.1:6379> eval 'return "hello " .. KEYS[1] .. ARGV[1]' 1 redis world"hello redisworld" evalsha <校验和> <key个数> [ke原创 2020-10-21 11:53:10 · 108 阅读 · 0 评论 -
15、事务
语法multi命令1…命令Nexec或者discard示例:127.0.0.1:6379> multiOK127.0.0.1:6379> set name valueQUEUED127.0.0.1:6379> get nameQUEUED127.0.0.1:6379> exec1) OK2) "value"事务队列当客户端以事务状态运行时,除了exec和discard命令,其他的命令都会保存在redisClient/mstate里typedef st原创 2020-10-21 11:42:30 · 88 阅读 · 0 评论 -
14、发布与订阅
订阅:subscribe news.sport news取消订阅:unsubscribe news.sport发布:publish news.sport hello模式订阅:psubscribe news.*取消模式订阅:punsubscribe news.*查看已订阅的频道:pubsub channels [pattern]查看指定频道的订阅数:pubsub numsub [channel…]查看指定频道的模式订阅数:pubsub numpat [channel…]...原创 2020-10-21 11:30:26 · 57 阅读 · 0 评论 -
13、集群
启动集群 修改配置文件,设置cluster-enabled yes命令cluster info:查看集群信息cluster nodes:查看集群节点cluster meet ip port:关联节点到集群中cluster addslots <slot> ...:分配槽cluster keyslot <key>:计算key所在槽cluster getkeysinslot <slot> <count>:返回指定槽的count数据库键cluste原创 2020-10-21 10:53:31 · 82 阅读 · 0 评论 -
11、哨兵sentinel
Sentinel 命令 PING :返回 PONG 。 SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。 SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。 SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个命令返回新的主服务器的 IP 地址和原创 2020-10-20 16:42:22 · 307 阅读 · 0 评论 -
10、主从服务
复制过程 1、从服务器发送psync命令给主服务器,如果是第一次进行主从复制,那么发送psync ? -1命令,否则会发送psync 命令 2、主服务收到psync命令后,根据发送来的命令判断是完整同步还是部分同步,如果是完整同步,执行bgsave命令,后台会生成一个RDB文件,同时返回+FULLRESYNC 给从服务器,并且用一个缓冲区记录从现在开始所有的写命令。如果是部分同步,返回+CONTINUE给客户端标识进行部分同步操作。 3、从服务器将主服务发送的RDB文件或者复制挤压缓冲区的谢原创 2020-10-19 18:29:32 · 349 阅读 · 0 评论 -
9、服务器
serverCron函数 redis服务器中的serverCron函数默认每100ms执行一次(通过hz属性设置)更新服务器缓存时间 redis服务器中有不少地方获取当前时间,而每获取一次都要执行一次系统调用,为了减少调用次数,服务状态中的unixtime和mstime被用作当前时间的缓存,这两个时间会以每100ms的频率更新一次更新LRU时钟 redisServer.lruclock,保存了服务器的lru时钟,默认每10秒更新一次,redisClient.lru保存了最后一次命令的访问时间原创 2020-10-19 17:33:49 · 66 阅读 · 0 评论 -
8、客户端
客户端属性: 套接字描述符: redisClient.fd属性值可以是-1或者是大于-1的整数 伪客户端的fd属性值是-1,伪客户端处理的命令请求来源于载入AOF文件或者lua脚本,而不是网络,所以这种客户端不需要套接字连接,自然也不需要记录套接字描述符。 普通客户端的fd属性大于-1,因为它要通过套接字来于服务器进行通信,所有服务器会用fd属性来记录客户端套接字的描述符 输入缓冲区:redisClient.querybuf,用来保存客户端的请求命令命令参数:redisCilent原创 2020-10-19 17:29:00 · 99 阅读 · 0 评论 -
7、事件
redis服务器是一个事件驱动程序,服务器需要处理以下两种事件 1、文件事件:redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象,服务器和客户端的通信会产生相应的事件,服务器就是通过监听并处理这些事件来完成一系列网络通信操作。 2、时间事件:redis服务器的一些操作(如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。文件事件 redis基于Reactor模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器。原创 2020-10-19 17:21:24 · 113 阅读 · 0 评论 -
6、redis持久化之AOF
简介 AOF持久化功能的实现可以分为命令追加(append),文件写入,文件同步(sync)命令追加 当AOF功能打开时,服务器执行完一个写命令后,会以协议格式将执行的写命令追加到服务器状态的aof_buf缓冲区末尾AOF持久化的行为 通过配置文件中的appendfsync配置,取值如下 always:写入一个命令调用一次fdatasync everysec:每隔一秒调用fdatasync,将缓冲区的命令写入磁盘中 no:由操作系统决定何时将aof_buf内容写入aof文件中,服原创 2020-10-19 17:16:33 · 80 阅读 · 0 评论 -
5、redis持久化之RDB
手动保存rdb持久化有两个命令,save和bgsave,save是线程阻塞的,当执行save的时候,服务器不能执行其他命令,bgsave非阻塞的,它会生成一个子进程,由它去执行创建rdb文件在执bgsave期间,如果执行save,bgsave或者bgrewriteaof命令,save和bgsave会被拒绝,bgrewriteaof会等到bgsave执行结束之后再去执行。如果bgrewriteaof命令正在执行,那么客户端发送的bgsave命令会被拒绝。自动间隔保存可以通过配置文件进行设置,默认是原创 2020-10-19 17:12:46 · 114 阅读 · 0 评论 -
4、redis的过期策略以及淘汰策略
过期键的删除策略,redis服务器使用的是惰性删除和定期删除 1、定时删除,在设置键过期的同时,创建一个定时器,让键在过期时间来临之时,删除键 2、惰性删除,每次从数据库获取键的时候再去判断键是否过期 3、定期删除,每隔一段时间程序就对数据库进行一次检查,删除过期键redis每隔100ms检查是否有过期的键,如果有就删除,每次检查会随机抽取key进行检查,可以通过配置文件属性hz设置,默认是10,即100ms检查一次。rdb、AOF和复制功能对过期键的处理 rdb:如果服务器是主服务器,原创 2020-10-19 17:10:53 · 49 阅读 · 0 评论 -
3、redis之数据库
数据库的数量通过database命令设置或在配置文件中设置,默认16读写键空间时的维护1、在读取或写入一个键时,服务器会根据键是否存在来更新服务器的键命中次数和不命中次数,可以通过info stats命令查看2、在读取一个键值,服务器会更新键的lru属性3、如果服务器在读取一个键时,如果这个键已经过期,会先删除这个键,再继续余下操作4、如果有客户端对某个键进行WATCH操作,那么服务器在对watch的键进行修改之后,会对这个键标记为脏(dirty),从而让事务程序注意到这个键已经被修改5、如果服原创 2020-10-19 17:09:45 · 91 阅读 · 0 评论 -
2、redis之对象命令
TTL(time to live):生存时间 scan实现对key的非阻塞查找,它是基于游标的迭代器,每次查找都要带上上一次返回的游标作为游标参数。语法:SCAN cursor [MATCH pattern] [COUNT count] The default COUNT value is 10.1、自动过期 persist(key):删除key的过期时间 ttl:获得一个key的剩余过期时间(s) pttl:获得一个key的活动时间(ms),返回-2:key不存在,-1:key原创 2020-10-19 17:09:01 · 257 阅读 · 0 评论 -
1、redis数据对象及对应的编码格式
1、String字符串对象字符串对象的编码是int、raw和embstr。如果一个字符串对象保存的是整数值,那么encoding是int,如果保存的是字符串值,并且长度大于32个字节,那么encoding是raw,否则是embstr2、list列表对象列表对象的编码是ziplist和linkedlist。使用ziplist的条件(可以通过命令修改)1、列表对象保存的所有字符串长度都小于64字节2、元素数量小于512个3、hash哈希对象哈希对象的编码可以是ziplist和hashtable原创 2020-10-19 16:56:05 · 415 阅读 · 0 评论