Redis
文章平均质量分 86
关于redis数据库study
alpha_2017
这个作者很懒,什么都没留下…
展开
-
Redis 持久化 RDB 详解
文章目录前言1. RDB 文件持久化的优缺点2. RDB 的触发方式2.1 save 命令触发2.2 bgsave 命令触发2.3 定时任务触发2.4 主从同步全量复制触发3. RDB 的处理流程3.1 RDB 文件传输3.2 socket 无盘传输4. RDB 涉及的技术原理4.1 写时复制 Copy On Write4.2 diskless 无盘传输的管道读写前言Redis 是基于内存的 KV 数据库,使用时所有数据都在内存中,这就是它存取性能高的重要原因之一。但是如我们所转载 2021-05-31 22:53:15 · 270 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(5) -- List 数据类型源码分析
使用GDB跟踪Redis源码list push过程127.0.0.1:6379> LPUSH runoobkey redisrunoobkey keyredis value当你push多个时:127.0.0.1:6379> LPUSH runoobkey redis2 redis3存储的结构redis 对于 List 的存储共有 3 种存储形式,其中 OBJ_ENCODING_LINKEDLIST已经彻底废弃不再讨论,其它两种存储形式的内原创 2021-05-19 23:25:39 · 327 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(13 ) -- Redis 集群节点选举流程
1. 集群选举的处理在 RedisCluster 集群实现原理 中提到过从节点通过选举晋升为主节点的过程,其处理大致如下:Slave 节点在每个周期任务中都会检查 Master 节点是否 FAIL,如是则尝试进行 Failover,以期成为新的 Master。不过在此之前需要过滤可用的 Slave 节点,具体做法就是检查每个 Slave 节点与 Master 节点断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那这个S转载 2021-05-09 20:01:21 · 619 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(12) -- Redis 集群建立流程
1. Redis 集群在 RedisCluster 集群实现原理 中已经介绍过 Redis 3.0 版本以后使用 RedisCluster 作为分布式解决方案,其整个集群网络的建立依赖 Gossip 协议。以下为 Redis 集群建立的示意图,其大致处理流程为以下几个步骤:节点A 邀请 节点B 加入集群,节点A 与 节点B 建立连接节点A 邀请 节点C 加入集群,节点A 与 节点C 建立连接。二者通信时节点 A 将 节点B 的IP地址、端口号等信息发送给 节点C,节点C 保存并使用该信息去连接 节点转载 2021-05-09 19:52:08 · 318 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(11) -- 主从复制 Slave 节点流程分析
1. 主从复制中 Slave 节点的处理Slave 节点主从复制的处理从建立从属关系开始,以下为大致的处理步骤:Slave 节点接收 slaveof 、replicaof 命令,进行从属关系的处理根据命令参数处理命令,因为也有可能是移除从属关系的操作如果是建立从属关系的命令,经过初步校验,保存下主节点的相关信息,并将当前节点的同步状态设置为 REPL_STATE_CONNECT定时任务检查到当前节点的同步状态为 REPL_STATE_CONNECT,则需要与主节点建立连接,连接成功后开始进行数据转载 2021-05-09 19:45:14 · 682 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(10) -- 主从复制 Master 节点流程分析
1. 主从复制中 Master 节点的处理Redis 主从复制 一节中粗略介绍过 Redis 的主从复制存在两种模式,以下则是 Master 节点对于主从复制的处理:接收 Slave 节点的 psync 命令判断是否可以执行部分复制,可以的话回复 +CONTINUE 给 Slave 节点,并将缓冲区命令直接发送给 Slave 节点,完成同步;不可以执行部分复制,只能全量复制,则回复 +FULLRESYNC 给 Slave 节点,根据情况做下一步处理Master 节点存在可以复用的 rdb 数据,则原创 2021-05-09 19:39:39 · 668 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(9) -- 数据淘汰原理
1. 过期时间的存储在redisDb 数据结构一节中已经提到过,redis 数据库中有一个专门的expires字典用于存储显式设置了过期时间的数据(如 SETEX 命令设置的数据)。本节以SETEX命令为例,依据源码分析过期时间的设置过程typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expires; /* Tim...转载 2021-05-09 19:31:47 · 217 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(8) -- Stream 数据类型源码分析
1. 存储结构在 流对象 Stream 的介绍中已经提到 Stream 的底层存储结构为前缀压缩树,其结构示例如下:OBJ_ENCODING_STREAM底层采用压缩前缀树(radix tree) 来存储,其每个节点 raxNode 用于存储键值对相关数据,不同键相同的前缀字符将被压缩到同一个节点中,并使用 iskey 属性来标识从根节点到当前节点保存的字符是否是完整的键Stream 添加数据的命令格式如下,其中 key 为 Stream 的名称,ID 为消息的唯一标志,不可重复,field s转载 2021-05-09 19:25:24 · 485 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(7) -- ZSet 数据类型源码分析
1. 存储结构在 有序集合对象 ZSet 的介绍中已经提到 ZSet 集合的底层存储结构主要有两种,其结构示例如下:OBJ_ENCODING_ZIPLIST当 ziplist 作为 zset 的底层存储结构时,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素值,第二个元素保存元素的分值,而且分值小的靠近表头,大的靠近表尾OBJ_ENCODING_SKIPLIST底层实现是跳跃表结合字典。每个跳跃表节点...原创 2021-05-09 19:19:26 · 396 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(6) -- Set 数据类型源码分析
1. 存储的结构在 redis 集合对象 Set 的介绍中我们知道 redis 对于集合对象 Set 有以下两种存储形式,其内存结构如下所示:OBJ_ENCODING_INTSET集合保存的所有元素都是整数值时将会采用这种存储结构,但当集合对象保存的元素数量超过512 (由server.set_max_intset_entries 配置)后会转化为 OBJ_ENCODING_HTOBJ_ENCODING_HT底层为 dict 字典,数据作为字典的键保存,键对应的值都是NULL,与 Java原创 2021-05-09 19:13:23 · 250 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(0) -- Redis 哈希表和字典 铺垫
一、哈希表概述首先简单介绍几个概念:哈希表(散列表)、映射、冲突、链地址、哈希函数。哈希表(Hash table)的初衷是为了将数据映射到数组中的某个位置,这样就能够通过数组下标访问该数据,提高数据的查找速度,这样的查找的平均期望时间复杂度是O(1)的。例如四个整数 6、7、9、12 需要映射到数组中,我们可以开一个长度为13(C语言下标从0开始)的数组,然后将对应值放到对应的下标,但是这样做,就会浪费没有被映射到的位置的空间。 采用哈希...转载 2021-05-09 19:07:50 · 271 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(4) -- String 数据类型源码分析
存储的结构在 redis 字符串对象 String 的介绍中,我们知道 redis 对于字符串的存储共有 3 种存储形式,其存储的内存结构如以下图片示例:OBJ_ENCODING_INT: 保存的字符串长度小于 20,并且是可以解析为 long 类型的整数值,那么存储方式就是直接将 redisObject 的 ptr 指针指向这个整数值OBJ_ENCODING_EMBSTR: 长度小于 44 (OBJ_ENCODING_EMBSTR_SIZE_LIMIT)的字符串将以简单动态字符串(SDS) 的.转载 2021-05-06 22:16:54 · 232 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(3) -- 概述 Redis 重要数据结构及其 6 种数据类型
重要数据结构Redis 有许多重要的数据结构,其存储结构从外层往内层依次是 redisDb、dict、dictht、dictEntryredisDb 默认情况下有16个,每个 redisDb 内部包含一个 dict 的数据结构,dict 内部包含 dictht 数组,数组个数为2,主要用于 hash 扩容使用。dictht 内部包含 dictEntry 的数组,dictEntry 其实就是 hash 表的一个 key-value 节点,如果冲突通过 链地址法 解决1.1 redisServer.转载 2021-05-06 22:11:35 · 322 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(2) -- Redis 多线程原理
前言Redis 6.0 中一个重大的改变就是引入了多线程IO。我们都知道 Redis 基于内存操作,几乎不存在 CPU 成为瓶颈的情况, 它主要受限于内存和网络。从 Redis 自身角度来说,读写网络的 read/write 系统调用占用了 Redis 执行期间大部分 CPU 时间,瓶颈其实主要在于网络的 IO 消耗。基于这种情况,Redis 优化的方向在于提高网络 IO 性能,而一个简单有效的方法就是使用多线程任务分摊 Redis 同步 IO 读写的负荷Redis 多线程模型Redis 6.0 版转载 2021-05-06 22:05:56 · 330 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(1) -- Redis 服务端启动及命令执行
前言本文基于 Redis 6.0 版本 ,读者如有兴趣可以自行点击链接进入 github 下载源码。Redis 用 C语言编写,其源码中不乏几百行的方法,这会给习惯了面向对象编程的读者造成一定的阅读障碍,不过仔细看的话也是能看懂的。Redis 服务端启动及命令执行的大致流程如下图所示,下文将对流程进行代码分析Redis 服务端启动流程Redis 是典型的 单 Reactor 单线程 的事件驱动模型,其服务端的启动也就是事件循环的建立过程,服务端启动的入口为 server.c#main() 函数转载 2021-05-06 22:01:03 · 418 阅读 · 0 评论 -
缓存穿透与缓存雪崩
缓存穿透缓存系统,一般流程都是按照key去查询缓存,如果不存在对应的value,就去后端系统(例如:持久层数据库)查找。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力,这就叫做缓存穿透。正常请求:正常请求 缓存击穿时:缓存击穿如何避免缓存空结果对查询结果为空的情况进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。布隆过滤器采用布隆过滤器,guava有实现api,或者使用redis的bitmap。将所原创 2021-03-13 23:25:24 · 151 阅读 · 0 评论 -
Redis实现分布式锁
redis实现分布式锁原创 2021-02-28 20:11:53 · 133 阅读 · 0 评论 -
Redis 6.0 源码阅读笔记(14) -- redis 时序图
使用strat uml 画出redis建立连接,响应客户端1.the process to accept a redis client connection2.the process to receive the data of command and handle the command,but not include sending the response to client待画3.the process to repsonse client待画...原创 2022-05-03 18:47:49 · 735 阅读 · 0 评论 -
Redis多线程执行 -- 过程分析
1.设计思路: 网络IO事件的处理要顺序处理,读IO可以多线程一次性读到队列中,读满为止;网络IO事件的处理要按顺序处理,网络IO写事件可以多线程同时操作。2.多线程写3. 多线程写过程参考资料:1.https://blog.csdn.net/m0_48071146/article/details/1063197362.https://www.toutiao.com/i6831404730573390348/?tt_from=mobile_qq&am...原创 2020-08-04 23:30:30 · 423 阅读 · 0 评论 -
c编码实现连接redis服务器
1.启动redis-server2.redis-cli -h 127.0.0.1 -p 6379 验证是否可以连接3.编码实现连接功能Hiredis是redis数据库一个轻量的C语言客户端库。之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计使我们只要熟悉了通用的redis操作语句就可以很容易的使用该库和redis数据库进行交互。除了支持发送命令和接收应答/应答数据,它提供了对应答数据的解析操作。而且这个基于I/O层.原创 2020-06-24 22:26:44 · 734 阅读 · 0 评论 -
Redis源码阅读 (深入理解字符串)
2.2. 字符串(sds.h/sds.c)字符串是Redis中最基本的数据。 Redis使用key作为存取value的唯一标示符,而key的通俗理解就是字符串。 Redis中的字符串分为两类:二进制安全(Binary Safe)和非二进制安全。二进制安全的字符串,是指字符串中所有字符均可用256个字符(8bit)编。 Redis中的value都是通过二进制安全的字符串存储的,而key使用的是非二进制安全的。Redis内部实现了字符串类型,由sds.h和sds.c定义。sds本质是char*:原创 2020-06-06 00:47:37 · 360 阅读 · 0 评论 -
使用GDB跟踪redis源代码执行get命令的过程
1. reids 命令的执行原理抓包: 抓取协议内容:客户端与服务器之间遵循着固定的协议我们使用tcpdump抓取6379端口的内容,通过设置set zjx "alpha"抓取到数据包的内容 发送的是 RESP “set” "zjx" "alpha"2. 使用GDB调试工具跟踪 命令 get zjx下面比较重要的几个结构体:GDB打印的内容:在服务器初始化时,会根据下面这个表创建一个字典??int processCommand(cl...原创 2020-05-23 23:36:00 · 432 阅读 · 0 评论 -
reactor ---- 反应堆模型
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/epoll.h>#include <arpa/inet.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#define BUF.原创 2020-05-15 07:46:56 · 736 阅读 · 0 评论