首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis 命令执行过程(下)

,它首先会调用 expireIfNeeded判断是否过期并且需要删除,如果为过期,则调用 lookupKey 方法从 dict 哈希表中查找返回。...具体解释可以看代码中的详细注释 /* * 查找key的读操作,如果key找不到或者已经逻辑上过期返回 NULL,有一些副作用 * 1 如果key到达过期时间,它会被设备为过期,并且删除 *...来判断是否过期,然后根据 Redis 是否配置了懒删除来进行同步删除或者异步删除。...= NULL) return now > when; // master时,未过期直接返回 if (now <= when) return 0; // 过期,删除...prepareClientToWrite 函数,将客户端加入到了Redis 的等待写入返回值客户端队列中,也就是 clientspendingwrite 队列。

94120
您找到你想要的搜索结果了吗?
是的
没有找到

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

文章目录 前言 一、Redis客户端结构体简介 二、字符串函数 1.set系列函数 2.incr decr函数 三、列表函数 1.添加元素函数 2.设置指定位置索引函数 3.获取列表范围元素的函数...四、哈希函数 1.获取指定字段的值 2.获取哈希表容量 五、集合函数 1.向集合添加元素 2.判断元素是否在集合内部 六、有序集合函数 1.从有序集合删除元素 2.获取指定元素分值 总结...1.添加元素函数 lpush和rpush命令可以在一个列表的左端或者右端添加元素,其实现如下:先根据要添加对象的长度以及列表元素数目判断一下是否需要将压缩列表转为双端链表,然后根据不同的底层实现调用压缩列表和双向链表的...,函数返回 -1 。...* 查找成功时,返回 0 。

1.7K40

leetcode-树 tree

一个递归遍历整棵树,用来转换root节点;另一个递归用来返回子树的路径数。 ¶572 另一个树的子树(easy) 双重递归,一发AC。...注意调整左右子树入队的顺序,然后合理放置出队的时机,画图模拟一下。 ¶669 修剪二叉搜索树(easy) 二叉搜索树的左子树的值都小于根结点,右子树的值都大于根结点。 使用递归。...如果p和q分别在两个子树,则返回root;如果p和q在同一个子树,则返回那个子树的结果。递归的结束条件是root为空或root等于p或q。...¶108 将有序数组转换为二叉搜索树(easy) 自己是有点递归的思路的,不过还是看了别人的代码。 以后遇到递归还是先考虑单独写一个函数吧,思考起来也清晰一点。...两个哈希表:一个哈希表为word,值为val;另一个哈希表为前缀,值为前缀和。 哈希表+前缀树:前缀树代替第一种方法中的后一个哈希表。 纯前缀树:求sum的时候需要递归

46220

TypeScript实现二叉搜索

), 如果是说明要找的没找到,返回false 调用compareFn方法比对要查找节点与当前节点的key进行大小比较 如果要查找的节点小于当前节点的key,则递归调用searchNode方法,传当前节点的左子节点和要查找的...,则继续判断key与根节点的大小,25 < 30,递归它的左子树 然后,比较25和21的大小,25 > 21,递归它的右子树 此时,25 === 21,节点已找到,返回true 移除一个节点 移除树中的节点...,橙色线条表示递归调用直至节点为null然后执行回调函数。...接下来,我们通过一个例子来描述下先序遍历的过程: 如上图所示,蓝色字标明了节点的访问顺序,橙色线表示递归调用直至节点为null然后执行回调函数。...如上图所示,蓝色字标示了节点的执行顺序,橙色线表示递归调用直至节点为null然后执行回调函数

46320

Redis使用及源码剖析-10.Redis数据库-2021-1-27

3.切换目标数据库函数 4.设置过期时间函数 5.查找key对应值函数 总结 前言 本文对Redis的数据库文件进行简要介绍,包括数据库的选择,的新建更新删除、Redis过期策略以及事件通知等。...空间通知会告诉用户关注的执行了什么命令,如下所示: 事件通知会告诉用户关注的命令被那些执行了,如下所示: 二、数据库相关API 1.数据库通知函数 空间和事件通知函数定义在...* * 返回 0 表示没有过期时间,或者未过期。 * * 返回 1 表示已经因为过期而被删除了。...++; return; } } 5.查找key对应值函数 查找key对应值函数实现如下: /* * 从数据库 db 中取出 key 的值(对象) * * 如果 key...的值存在,那么返回该值;否则,返回 NULL

30620

【每日算法Day 84】面试必考题:Trie(字典树前缀树)的实现

插入字符串 从根结点往下递归,如果字符串中下一个字母对应的子结点为空,那就新建一个结点再递归,否则的话就直接递归下去。 最后把最后一个结点的 isEnd 设置为 1,表示这个结点是字符串的结束位置。...查询字符串 从根结点往下递归查找,如果字符串还没遍历结束,但是结点已经空了,说明字符串不在字典树中。...否则的话一直查找到最后一个字符,然后看对应结点的 isEnd 是 1 还是 0,如果是 1 ,就存在字符串,否则不存在。...首先整体框架是和查询字符串类似的,从根结点往下递归查询,然后用一个栈保存查询到的结点。 如果查询过程中直接遇到了空结点,就直接返回,因为都不存在字符串,就不用删除了。然后判断最后一个结点的类型。...'a'] == NULL) { node->next[c-'a'] = new Trie(); } node = node

1.1K20

redis 命令exists vs get

功能对比exists参数格式:EXISTS key [key ...]用于判断某个是否存在get参数格式:GET key用于获取对应的值。由上可知,相同的场景只有判断是否存在。...(c->db, key); if (!...(c,count);}exists和get命令都调用了lookupKeyReadWithFlags,我们看下这个函数的实现:robj *lookupKeyReadWithFlags(redisDb *db...;}可见都是先判断了确认了是否过期(过期key单独保存在另一个dict里面),再没有过期的情况下查找了db库,总体查找时间是一致的。...但是,我们可以发现,get命令返回对应的值,exists返回了个数,一般对应的值较大,传输时间较长。所以相对较慢。结论在判断key是否存在的场景下:exists速度更快,可以忽略类型。

1K50

【算法】二叉查找树(BST)实现字典API

以rank方法为例( key在中的排): 如果用有序数组实现字典,实现rank方法只要查找到给定的key,然后返回下标就可以了。...等于当前结点的查找成功并返回对应的值 最后结果有两种: 查找到给定的key,返回对应的值 x迭代至最下方的结点也没有查找到key,因为x.left=x.right=null,在下一次调用get返回-...这段代码的作用有两方面: 沿搜索路径重置结点链接 更新路径上的结点计数器 沿搜索路径重置结点链接 如上文所说, 重置结点链接要结合上下两层递归来看 在递归到最后一个结点前, 下一层递归返回值是x(代码中...实现思路: 查找排名为k的,如果左子树中的结点数大于k, 那么我们就继续(递归地)在左子树中查找排名为k的; 如果t等于k,我们就返回根结点中的,如果t小于k,我们就(递归地)在右子树中查找排名为..., 但由于条件不足无法立即给出判断,所以只能继续向右子树递归floor方法,并取得递归返回值,判断递归返回的结果是否为null 如果递归返回null,说明右子树没有floor值,所以floor值就是当前结点的

1.6K90

redis内存满了怎么办?让你玩懂8种内存淘汰策略

内存淘汰策略 实际上Redis定义了「8种内存淘汰策略」用来处理redis内存满的情况: 1.noeviction:直接返回错误,不淘汰任何已经存在的redis 2.allkeys-lru:所有的使用...当缓存达到容量并有一个新的内存块等待插入时,系统将搜索计数器最低的块并将其从缓存中删除。.../* * * 这个函数是 EXPIRE 、 PEXPIRE 、 EXPIREAT 和 PEXPIREAT 命令的底层实现函数。 * * 命令的第二个参数可能是绝对值,也可能是相对值。...if (lookupKeyRead(c->db,key) == NULL) { addReply(c,shared.czero); return; } /...= NULL); // 根据取出的过期时间 de = dictReplaceRaw(db->expires,dictGetKey(kde)); // 设置的过期时间 /

2.2K30

带你100% 地了解 Redis 6.0 的客户端缓存

Guava Cache 中未命中,则再去 Redis 中查询,如果命中则返回数据,并在 Guava Cache 中设置此数据。...基数树是针对稀疏的长整型数据查找的多叉搜索树,能快速且节省空间的完映射,一般用于解决 Hash冲突和 Hash表大小的设计问题,Linux 的内存管理就使用了它。...当某一个 key 被修改或删除时,Redis 会调用 trackingInvalidateKey 方法根据 key 从 TrackingTable 中查找所有对应的客户端ID,然后调用 sendTrackingMessage...sdskey = keyobj->ptr; // 省略,如果广播模式的记录基数树不为空,则先处理广播模式 // 1 根据的指针去 TrackingTable 查找 rax *ids...); } 源码如上所示,trackingInvalidateKey 方法主要做了 7 件事情: 根据的指针去 TrackingTable 查找客户端ID列表; 使用迭代器遍历列表; 根据 clientId

1.4K01

带你100% 地了解 Redis 6.0 的客户端缓存

Guava Cache 中未命中,则再去 Redis 中查询,如果命中则返回数据,并在 Guava Cache 中设置此数据。...基数树是针对稀疏的长整型数据查找的多叉搜索树,能快速且节省空间的完映射,一般用于解决 Hash冲突和 Hash表大小的设计问题,Linux 的内存管理就使用了它。 ?...当某一个 key 被修改或删除时,Redis 会调用 trackingInvalidateKey 方法根据 key 从 TrackingTable 中查找所有对应的客户端ID,然后调用 sendTrackingMessage...= keyobj->ptr; // 省略,如果广播模式的记录基数树不为空,则先处理广播模式 // 1 根据的指针去 TrackingTable 查找 rax *ids = raxFind...);} 源码如上所示,trackingInvalidateKey 方法主要做了 7 件事情: 根据的指针去 TrackingTable 查找客户端ID列表; 使用迭代器遍历列表; 根据 clientId

1.7K20

Redis 命令执行过程(上)

如下图所示,一条命令执行完成并且返回数据一共涉及三部分,第一步是建立连接阶段,响应了socket的建立,并且创建了client对象;第二步是处理阶段,从socket读取数据到输入缓冲区,然后解析并获得命令...,执行命令并将返回值存储到输出缓冲区中;第三步是数据返回阶段,将返回值从输出缓冲区写到socket中,返回给客户端,最后关闭client。...socket读取事件处理器 当客户端发来命令时,读取事件处理器方法会被执行,对应处理阶段的相关逻辑都会被执行,然后注册socket写事件处理器 当写事件处理器被执行时,就是将返回值写回到socket中。...acceptTcpHandler 函数会首先调用 anetTcpAccept方法,它底层会调用 socket 的 accept 方法,也就是接受客户端来的建立连接请求,然后调用 acceptCommonHandler...; return C_ERR; } /** * 根据 argv[0] 查找对应的 command * 2 命令字典查找指定命令;所有的命令都存储在命令字典中

90710

Redis 命令执行过程(上)

如下图所示,一条命令执行完成并且返回数据一共涉及三部分,第一步是建立连接阶段,响应了socket的建立,并且创建了client对象;第二步是处理阶段,从socket读取数据到输入缓冲区,然后解析并获得命令...,执行命令并将返回值存储到输出缓冲区中;第三步是数据返回阶段,将返回值从输出缓冲区写到socket中,返回给客户端,最后关闭client。...socket读取事件处理器 当客户端发来命令时,读取事件处理器方法会被执行,对应处理阶段的相关逻辑都会被执行,然后注册socket写事件处理器 当写事件处理器被执行时,就是将返回值写回到socket中。...acceptTcpHandler 函数会首先调用 anetTcpAccept方法,它底层会调用 socket 的 accept 方法,也就是接受客户端来的建立连接请求,然后调用 acceptCommonHandler...; return C_ERR; } /** * 根据 argv[0] 查找对应的 command * 2 命令字典查找指定命令;所有的命令都存储在命令字典中

1.2K00
领券