redis的原理和源码
文章平均质量分 90
迷雾总会解
我来,我见,我征服!
展开
-
redis的原理和源码-源码阅读指南
在 Redis 开发过程中,还有一些功能属于辅助性功能,包括用于创建 Redis Cluster 的脚本、用于测试 LRU 算法效果的程序,以及可视化 rehash 过程的程序。状态设置主要包括socket连接的阻塞性、tcp的保活定时器的设置、设置发送缓冲区、tcp的Nagle算法设置、设置发送超时时间、地址重用的设置等。ae_epoll.c、ae_evport.c、ae_kqueue.c、ae_select.c:这是四种网络通信框架,都包含aeApiPoll函数,主要是用于对套接字的监听。...原创 2022-08-08 23:35:38 · 841 阅读 · 0 评论 -
redis的原理和源码-线程问题(单线程、BIO线程、redis6.0多IO线程)&源码解析
为什么说redis能够快速执行Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。而说Redis是单线程,主要是指文件事件处理器是单线程方式运行,也可以说是由一个主线程进行网络 IO 和键值对读写。既然是单线程,那怎么监听大量的客户端连接呢?Redis 通过IO 多路复用程序 来监原创 2022-08-08 23:32:44 · 1005 阅读 · 0 评论 -
redis的原理和源码-慢查询日志&监视器
slowlog_entry_id属性的初始值为o,每当创建一条新的慢查询日志时,这个属性的值就会用作新日志的id值,之后程序会对这个属性的值增一。服务器在每次处理命令请求之前,都会调用replicationFeedMonitors函数,由这个函数将被处理的命令请求的相关信息发送给各个监视器。命令,该命令将返回慢日志中的每个条目。Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。...原创 2022-08-08 23:29:26 · 714 阅读 · 0 评论 -
redis的原理和源码-Lua环境的源码解析&各命令的介绍
script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。numkeys: 用于指定键名参数的个数。key [key …] : 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。...原创 2022-08-08 23:28:32 · 963 阅读 · 0 评论 -
redis的原理和源码-发布订阅
在redis中,发布订阅的一个典型应用就是用在sentinel(哨兵)中,sentinel中,sentinel会利用sentinelEvent对不同的频道发布消息,而且也会利用hello频道处理和其它sentinel节点的关系。命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,它还会被发送给所有与这个额道相匹配的模式的订阅者。从代码中,你可以看到,subscribeCommand 函数的参数是 client 类型的变量,而它会。.原创 2022-08-08 23:26:14 · 373 阅读 · 0 评论 -
redis的原理和源码-集群的原理和源码解析(下)
Redis实例启动时,根据配置文件中的"cluster-enabled"选项,决定该Redis实例是否处于集群模式。如果该选项值为”yes”,则Redis实例中的server.cluster_enabled被置为1,表示当前处于集群模式。在main函数中的initServer中,如果server.cluster_enabled为1,则调用clusterInit,初始化集群需要使用的结构,并创建监听端口。该函数的代码如下:其实就干了三件事情:初始化clusterState结构类型server.cluster原创 2022-08-08 23:25:14 · 561 阅读 · 0 评论 -
redis的原理和源码-集群的原理和源码解析(上)
在redis节点发送心跳包时需要把所有的槽放到这个心跳包里,以便让节点知道当前集群信息,16384=16k,在发送心跳包时使用char进行bitmap压缩后是2kb(16384÷8÷1024=2kb),也就是说使用2k的空间创建了16k的槽数,65535=65k,压缩后就是8kb(65536÷8÷1024=8kb),也就是说需要8k的心跳包。...原创 2022-08-07 00:17:38 · 487 阅读 · 0 评论 -
redis的原理和源码-sentinel哨兵的原理和源码解析(下)
哨兵在使用发布订阅方法时,封装了 sentinelEvent 函数(在sentinel.c文件中),用来发布消息。所以,你在阅读 sentinel.c 文件中关于哨兵的源码时,如果看到 sentinelEvent,这就表明哨兵正在用它来发布消息。但是注意这个消息的频道是在自身节点上,客户端可以通过订阅给定的频道来获取相应的事件提醒。sentinelEvent 函数:实际上,这个函数最终是通过调用 pubsubPublishMessage 函数,来实现向某一个频道发布消息的。那么,当我们要发布一条消息时,需原创 2022-08-07 00:16:43 · 464 阅读 · 0 评论 -
redis的原理和源码-sentinel哨兵的原理和源码解析(上)
所以,当你需要详细了解哨兵实例运行命令的实现时,注意不要找错代码文件。当Sentinel通过频道信息发现一个新的Sentinel时,它不仅会为新Sentinel在sentinels字典中创建相应的实例结构,还会创建一个连向新Sentinel的命令连接,而新Sentinel也同样会创建连向这个Sentinel的命令连接,最终监视同一主服务器的多个Sentinel将形成相互连接的网络:Sentinel A有连向Sentinel B的命令连接,而Sentinel B也有连向Sentinel A 的命令连接。...原创 2022-08-07 00:13:58 · 437 阅读 · 0 评论 -
redis的原理和源码-主从复制的原理介绍
如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送 REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。当完成了同步之后,主从服务器就会进入命令传播阶段,这时主服务器只要一直将自己执行的写命令发送给从服务器,而从服务器只要一直接收并执行主服务器发来的写命令,就可以保证主从服务器一直保持一致了。...原创 2022-08-07 00:12:27 · 108 阅读 · 0 评论 -
redis的原理和源码-事务机制
可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。开启:以multi开启事务入队:将多个命令入队到事务中,接到这些命令不会立刻执行,而是放到等待执行的事务队列里面执行:有exec命令触发事务开启入队执行事务队列如果客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令的其中一个。那么服务器立即执行这个命令;与此相反,如果客户端发送的命令是EXEC、DISCARD、WATCH、MULTI四个命令以外的其他命令,原创 2022-08-07 00:10:34 · 94 阅读 · 0 评论 -
redis的原理和源码-缓存的三个常见问题(缓存穿透、缓存击穿、缓存雪崩)
缓存穿透指查询不存在的数据,缓存层和存储层都不会命中。过程:① 缓存层不命中。② 存储层不命中,不将空结果写回内存(出于容错考虑)。③ 返回空结果。缓存穿透将导致不存在的数据每次请求都要到存储层查询,可能会使后端负载增大,由于很多后端存储不具备高并发性,甚至可能造成后端宕机。通常在程序中分别统计总调用数、缓存命中数、存储层命中数,如果发现大量存储层空命中,说明可能出现了缓存穿透。产生原因:自身业务代码或数据出现问题; 一些恶意攻击、爬虫等造成大量空命中。解决方法:缓存空对象:如果一个查询返回结果为 null原创 2022-08-07 00:09:44 · 102 阅读 · 0 评论 -
redis的原理和源码-redis的内存淘汰策略&LRU源码解析&LFU源码解析
LFU 是在 Redis 4.0 新增的淘汰策略,它涉及的巧妙之处在于,其复用了 redisObject 结构的 lru 字段,把这个字段「一分为二」,高16位保存最后访问时间和低8位保存访问次数;key 的访问次数不能只增不减,它需要根据时间间隔来做衰减,才能达到 LFU 的目的;每次在访问一个 key 时,会「懒惰」更新这个 key 的访问次数:先衰减访问次数,再更新访问次数;衰减访问次数,会根据时间间隔计算,间隔时间越久,衰减越厉害;...原创 2022-08-07 00:08:42 · 599 阅读 · 0 评论 -
redis的原理和源码-数据过期expire的介绍
而定期删除是前两种的整合和折中,但是间隔时间不好控制,如果执行间隔太过频繁,就会变成定时删除,如果执行间隔较长,就会变成惰性删除。很多时候,我们的业务场景就是需要某个数据只在某一时间段内存在,比如我们的短信验证码可能只在1分钟内有效,用户登录的 token 可能只在 1 天内有效。如果假设你设置了一批 key 只能存活 1 分钟,那么 1 分钟后,Redis 是怎么对这批 key 进行删除的呢?因为内存是有限的,如果缓存中的所有数据都是一直保存的话,分分钟直接Out of memory。...原创 2022-08-07 00:07:19 · 669 阅读 · 0 评论 -
redis的原理和源码-服务端的介绍和源码解析(命令请求的执行过程、服务器初始化过程)
命令实现函数会将命令回复保存到客户端的输出缓冲区里面,并放入clients_pending_write列表中,当处理时会直接发送给客户端,若还有树没发完,就为客户端的套接字关联命令回复处理器,当客户端套接字变为可写状态时,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送给客户端。Redis服务器的命令请求来自Redis客户端,当用户在客户端中键人一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。...原创 2022-08-07 00:06:11 · 451 阅读 · 0 评论 -
redis的原理和源码-客户端结构体的介绍和源码解析
如果该文件仍有其他文件描 述符引用的话,该文件的V节点表并没有关闭。上图展示了一个命令表示例,该表是一个字典,字典的键是一个SDS结构,保存了命令的名字,字典的值是命令所对应的redisCommand结构,这个结构保存了命令的实现函数、命令的标志、命令应该给定的参数个数、命令的总执行次数和总消耗时长等统计信息。在服务器将客户端发送的命令请求保存到客户端状态的querybuf属性之后,服务器将对命令请求的内容进行分析,并将得出的命令参数以及命令参数的个数分别保存到客户端状态的argv属性和argc属性。...原创 2022-08-06 23:59:59 · 729 阅读 · 0 评论 -
redis的原理和源码-事件机制的介绍和源码解析(eventloop、fileevent、timeevent)
redis服务器是一个事件驱动程序,Redis的服务器进程就是一个事件循环(event loop),所有的操作都会被封装为event,主要有两个类型的event:redis服务初始化分为五个阶段:①初始化服务配置;②载入配置选项;③服务初始化;④还原数据库状态;⑤启动event loop(具体可看服务端章节)event loop为单线程处理:①所有event的处理因为是单线程顺序处理, 所以在操作DB等内存数据时是无锁的;②在每个process循环中都尝试处理所有已加入队列的io event和time ev原创 2022-08-06 23:58:53 · 568 阅读 · 0 评论 -
redis的原理和源码-数据持久化方式AOF的介绍和源码解析
AOF是redis持久化的一种方式,以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作补不可记录),只许追加文件但不可以改写文件,保存的是appendonly.aof文件。aof机制默认关闭,可以通过参数开启aof机制,通过指定aof文件名称。...原创 2022-08-06 23:57:20 · 281 阅读 · 0 评论 -
redis的原理和源码-数据持久化方式RDB的介绍和源码解析
RDB是redis持久化的一种方式,可以手动或在指定的时间间隔内生成内存中整个数据集的持久化快照。RDB文件是一个经过压缩的二进制文件,默认被存储在当前文件夹中,名称为dump.rdb,可以通过dir和dbfilename参数来修改默认值。...原创 2022-08-06 23:56:16 · 660 阅读 · 0 评论 -
redis的原理和源码-配置文件解析
介绍下redis配置文件中的各项原创 2022-08-06 23:53:39 · 128 阅读 · 0 评论 -
redis的原理和源码-redis各数据类型的编码格式和数据结构SDS、list、dict、zskiplist、intset、ziplist、quicklist、listpack、rax、stream
详细介绍了各数据类型的编码格式,以及从原理和源码层面介绍了各种数据结构原创 2022-08-06 23:52:38 · 402 阅读 · 0 评论 -
redis的原理和源码-redis的六种数据类型基本介绍:string、hash、list、set、zset、stream
简单介绍下redis的六种数据结构原创 2022-08-06 23:48:39 · 283 阅读 · 0 评论 -
redis的原理和源码-基本介绍
简单介绍下redis的相关概念原创 2022-08-06 23:45:24 · 144 阅读 · 0 评论