首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Redis使用及源码剖析-18.Redis二进制位数组、慢查询日志和监视器实现-2021-2-3

    异或等运算 redis>setbit bit2 2 1 //0000 0100 redis>bitop or or-result bit bit2 //0000 1101 2.位数组表示 redis使用...SDS字符串表示位数组,并使用SDS操作函数来处理位数组,一个1字节长的位数组示意图如下: 需要注意的是,buf数组保存的顺序和日常书写顺序是相反的,比如上图表示的位数组是 0100 1101...o = lookupKeyWrite(c->db,c->argv[1]); if (o == NULL) { // 对象不存在,创建一个空字符串对象...服务器使用先进先出的方式保存多条慢查询日志: 当服务器储存的慢查询日志数量等于 slowlog-max-len 选项的值时, 服务器在添加一条新的慢查询日志之前, 会先将最旧的一条慢查询日志删除。...,函数具体作用如下: a.检查命令的执行时长是否超过 slowlog-log-slower-than 选项所设置的时间, 如果是的话, 就为命令创建一个新的日志, 并将新日志添加到 slowlog 链表的表头

    34530

    Redis原理篇之数据结构

    SDS redis中保存的Key是字符串,value大多也是字符串字符串集合,因此字符串是Redis中最常使用的一种数据结构。...不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 获取字符串长度需要的复杂度为O(N) 非二进制安全,C语言使用空字符’\0’作为字符串结尾的标记,如果保存的字符串本身含义该标记...,进而提高整体执行效率 并且SDS还提供了惰性空间释放的功能,即对字符串缩短操作而言,不会立刻使用内存重分配算法来回收多出来的字节,而是通过一个free属性进行记录,当后面需要进行字符串增长时,就会用到...,但与传统链表相比有几点差异: 元素按照升序排列存储 节点可能包含多个指针,指针跨度不同 Redis使用跳跃表作为有序集合键,如果一个有序集合包含的元素数量很多,或者有序集合中元素成员是比较长的字符串...,c->argv[1],c->db->id); } 创建quicklist robj *createQuicklistObject(void) { //创建一个quickList quicklist

    1K20

    链表问题——长整数加法运算题解【双向链表

    说明: 链表A、B、C可以是单向链表或双向链表,但由于A和B输出时需要从头至尾遍历,而做加法时需要从尾至头遍历,因此推荐使用双向链表存储。...的非负整数),依次存放在链表的每个结点; (3)链表的每个结点从长整数的低位开始拆分(4位为一组,存到一个结点中,即结点的数据域为1-4位字符串),依次存放在链表的每个结点。...>next = NULL; C->pre = NULL; calculate(A,B,C); print_link(C); } 创建双向链表函数 void create_dob_link...; //initial res =0; } } } char to string 函数(挺笨的,但有效) string只能拼接字符串...>next; while(p->next)p=p->next; if(p && p->data data =-1; else C->data =1; while

    28120

    Redis使用及源码剖析-9.Redis键操作函数-2021-1-26

    其中的key均为字符串对象,value可以是五种对象的任意一种,根据value类型不同将键值对称为某某键,如value是字符串对象时为字符串键。...1.添加元素函数 lpush和rpush命令可以在一个列表的左端或者右端添加元素,其实现如下:先根据要添加对象的长度以及列表元素数目判断一下是否需要将压缩列表转为双端链表,然后根据不同的底层实现调用压缩列表和双向链表的...argv[j] = tryObjectEncoding(c->argv[j]); // 如果列表对象不存在,那么创建一个,并关联到数据库 if (!...ULONG_MAX; if (o->encoding == REDIS_ENCODING_ZIPLIST) { // ziplist 中,每个 field-value 对都需要使用两个节点来保存...>db,c->argv[1]); // 对象不存在,创建一个新的,并将它关联到数据库 if (set == NULL) { set = setTypeCreate(c-

    1.7K40

    Redis原理篇之网络模型

    而且忙等机制会导致CPU空转,CPU使用率暴增。 ---- IO多路复用 那么问题来了: 用户进程如何知道内核中数据是否就绪呢?...struct rb_root rbr;//一颗红黑树,记录要监听的FD struct list_head rdlist;//一个链表,记录就绪的FD //... } //1.会在内核创建eventpoll...,不为空则返回就绪的FD的数量 ---- 注意 尽量不要使用阻塞IO进行读取,因为阻塞IO会在没有数据可读时阻塞住,直到有数据时,才会返回,这样会阻塞当前进程 非阻塞IO加ET模式,可以形成非常好的效果...//解析缓冲区字符串,转为Redis命令参数存入c->argv数组 processInputBuffer(c); ......=C_OK){ //如果c->buf写不下,则写到c->reply,这是一个链表,容量无上限 _addReplyProtoToList(c,obj->ptr,sdslen(obj->ptr)

    1.2K20

    Hiredis源码阅读(二)

    (当向redis发送普通命令时,会依次将该命令对应的会调结构追加到链表中,当redis回复命令时,会依次调用链表中每个redisCallback结构中的回调函数) 2、建立连接 异步api中建立连接函数...调用redisAsyncInitialize函数创建异步上下文结构redisAsyncContext。...其中redisvFormatCommand解析用户输入命令,转换成统一的字符串cmd,然后再调用redisAsyncCommand函数,将cmd发送给redis,并记录相应的回调函数,__redisAsyncCommand...成功发送之后,调用_EL_ADD_WRITE,删除可写事件,使用ae事件库,就是调用redisAeDelWrite函数删除注册的可写事件。...如果reply为非空,那么调用redisShiftCallback,尝试从链表中ac->replies中取出第一个回调结构cb。

    3.3K51

    【Nginx 源码学习】内存池 及 优秀案例赏析:Nginx内存池设计

    用于创建一个内存池,我们创建时,传入我们的初始大小: #define ngx_memalign(alignment, size, log) ngx_alloc(size, log) //ngx_alloc...nginx中的内存池是在创建的时候就设定好了大小, 在以后分配小块内存的时候,如果内存不够,则是重新创建一块内存串到内存池中,而不是将原有的内存池进行扩张。...* 2)然后往下新创建一个pool->large结构体,将刚开辟的空间赋给该新结构体管理。...* 2)使用头插法将新的结构体插入清理链表。 * * 注意:初始化时回调c->handler设为NULL,并且返回值为返回当前结构体,所以该内存可以由用户自定义并且自行处理,非常灵活。...return NULL; } } else { c->data = NULL; } // 2)使用头插法插入清理链表,并且回调设为

    86430

    内存池 及 nginx内存池

    用于创建一个内存池,我们创建时,传入我们的初始大小: #define ngx_memalign(alignment, size, log) ngx_alloc(size, log) //ngx_alloc...nginx中的内存池是在创建的时候就设定好了大小, 在以后分配小块内存的时候,如果内存不够,则是重新创建一块内存串到内存池中,而不是将原有的内存池进行扩张。...* 2)然后往下新创建一个pool->large结构体,将刚开辟的空间赋给该新结构体管理。...* 2)使用头插法将新的结构体插入清理链表。 * * 注意:初始化时回调c->handler设为NULL,并且返回值为返回当前结构体,所以该内存可以由用户自定义并且自行处理,非常灵活。...return NULL; } } else { c->data = NULL; } // 2)使用头插法插入清理链表,并且回调设为

    1K20

    C++ 大作业 题目四

    对于单链表,LinkList *L , LinkList *&L 和 LinkList &*L (不会使用)的区别,LinkList* L 用于 单纯的将传入指针L的指向地址赋予L1这个临时指针的指向地址...( 22-12-01 )//题目四:要求利用带头结点的单链表,根据所提供的源代码,实现两个集合的并、交、差运算。//【具体功能描述】//1)要求用带头结点的单链表存储两个集合中的元素和最终的结果。...//2)集合的元素限定为十进制数,程序应对出现重复的数据进行过滤,即使得链表中没有重复数据。//3)显示两个集合的内容及其并集、交集和差集的内容。...){p = pre->next;pre = NULL;delete pre;free(pre);pre = p;}Link = NULL;}LinkList* CreateListF() { //创建链表...LinkList* header,* a,* b,* c;int n;int data;cout > n;header = (LinkList

    31610

    漫画算法:如何判断链表有环?

    例如这样的链表:A->B->C->D->B->C->D, 当遍历到节点D的时候,我们需要比较的是之前的节点A、B、C,不存在相同节点。...这个方法在流程上和方法一类似,本质的区别是使用了HashSet作为额外的缓存。 假设从链表头节点到入环点的距离是D,链表的环长是S。...方法三:首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。...如果相同,则判断出链表有环,如果不同,则继续下一次循环。 例如链表A->B->C->D->B->C->D,两个指针最初都指向节点A,进入第一轮循环,指针1移动到了节点B,指针2移动到了C。...除了两个指针以外,没有使用任何额外存储空间,所以空间复杂度是O(1)。 问题一:判断两个单向链表是否相交,如果相交,求出交点。 问题二:在一个有环链表中,如何找出链表的入环点?

    26920

    你确定不来了解一下Redis跳跃表的原理吗

    链表是有序的,但不能使用二分查找。类似二叉搜索树,我们把一些节点提取出来,作为索引。得到如下结构: ?...跳跃表 下面的结构是就是跳表: 其中 -1 表示 INT_MIN, 链表的最小值,1 表示 INT_MAX,链表的最大值。 ?...跳表具有如下性质: (1) 由很多层结构组成 (2) 每一层都是一个有序的链表 (3) 最底层(Level 1)的链表包含所有元素 (4) 如果一个元素出现在 Level i 的链表中,则它在 Level...i 之下的链表也都会出现。...0 : rank[i + 1]; // todo: 先根据分值比较,如果分值都相同的情况下,再比较字符串的长度 // 我们知道有序集合里面的元素都是有序的,那么肯定就有个排序规则

    1.6K21

    Redis 6.0 IO线程功能分析

    所以,为了稳定性,继续使用单线程执行命令是最好的选择。 为什么要使用多线程呢?主要为了使用多核CPU的优势,下面是使用多线程的测试数据(数据来源网络): ? ?...exit(1); } io_threads[i] = tid; } } initThreadedIO() 函数的主要工作是: 为每个IO线程创建一个链表...为每个IO线程创建一个锁,用于主线程与IO线程的通信。 调用 pthread_create() 系统调用来创建IO线程,IO线程的主体函数是 IOThreadMain()。...(c->flags & (CLIENT_MASTER|CLIENT_SLAVE|CLIENT_PENDING_READ))) { c->flags |= CLIENT_PENDING_READ...但这里要吐槽一下的是,在等待 IO线程 读取客户端请求时,居然用了一个死循环来等待,这样有可能会导致CPU使用率飙升的问题,有可能影响其他服务的运行(不知道作者怎么想的)。

    96320

    Redis 服务端程序实现原理

    1、网络连接 第一步是网络连接,也就是我们的客户端会与服务端进行 TCP 三次握手,并指明使用 socket 通信协议。...接着服务端 redis 使用 epoll 事件机制监听端口的读事件,一旦事件可读则判定是有客户端尝试建立连接,服务端会检查最大允许连接数是否到达,如果达到则拒绝建立连接,否则服务端会创建一个 fd 文件描述符并返回给客户端...client 信息,那么我们第二步就是创建一个 client 结构的客户端抽象实例并添加到 redisServer 结构 clients 链表中。...,所有的时间事件都会以链表的形式存储在这里,具体指向的结构是 aeTimeEvent。...struct aeTimeEvent *prev; struct aeTimeEvent *next; } aeTimeEvent; serverCron 在这里会被创建并添加到时间事件链表

    1.2K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    热门标签

    领券