学习
实践
活动
专区
工具
TVP
写文章

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

四、哈希键函数 1.获取指定字段 2.获取哈希表容量 五、集合键函数 1.向集合添加元素 2.判断元素是否在集合内部 六、有序集合键函数 1.从有序集合删除元素 2.获取指定元素分值 总结 一、Redis客户端结构体简介 Redis为每一个客户端定义了redisClient 对象,包括客户端套接字,客户端输入命令参数数目,和参数数组等。 = REDIS_OK) return; // expire 参数正确时报错 if (milliseconds <= 0) { 1.获取指定字段 hget key field命令可可以获取指定字段,实现函数如下:其中hgetCommand函数调用addHashFieldToReply函数,addHashFieldToReply * * 参数: * field 域 * vstr 是字符串时,将它保存到这个指针 * vlen 保存字符串长度 * ll 是整数时,将它保存到这个指针

19240

Redis原理篇之数据结构

,保存集合数据 int8_t contents[]; } intset; contents是整数数组底层实现,用来存储元素,并且各个项在数组按从小到大有序排列,并且数组中不包含重复元素。 index元素起始地址 IntSet升級 升级编码为INTSET_ENC_INT32,每个整数占4字节,并按照新编码方式及元素个数扩容数组 倒序依次将数组元素拷贝到扩容后正确位置 正序挨个拷贝 ,数组中保存是指向entry指针 dictEntry **table; //哈希表大小 unsigned long size; //哈希表大小掩码,总是等于size 小结 ZipList(压缩列表) ZipList是一种特殊"端链表",由一系列特殊编码连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作时间复杂度为0(1)。 一样则按照ele字典排序 每个节点都可以包含多层指针,层数是1到32之间随机数 不同层指针到下一个节点跨度不同,层级越高,跨度越大 增删改成效率与红黑树基本一致,实现却更为简单 RedisObject

13720
  • 广告
    关闭

    2023新春采购节

    领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折

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

    Redis使用及源码剖析-17.Redis排序-2021-2-3

    , 将各个 obj 指针所指向列表项转换成一个 double 类型浮点数, 并将这个浮点数保存在相应数组 u.score 属性里面, 如下图所示: d.根据数组项 u.score 属性 , 对数组进行数字排序, 排序后数组项按 u.score 属性从小到大排列, 如下图所示: d.遍历数组, 将各个数组 obj 指针所指向列表项作为排序结果返回给客户端: 程序首先访问数组索引 b.遍历数组, 将各个数组 obj 指针分别指向 str集合各个项, 构成 obj 指针和集合元素之间一对一关系。 b.遍历数组, 将各个数组 obj 指针分别指向 grade 集合各个项, 构成 obj 指针和集合元素之间一对一关系。 d.将查找权重键转换成double类型浮点数,然后保存在对应数组u.score属性中。 f.遍历数组, 将各个数组 obj 指针所指向集合元素作为排序结果返回给客户端。

    16040

    数据结构—线性表

    聪明的人总是有,有人想出了用数组来代替指针,来描述单链表,让每个数组元素都由两个数据域组成,数组每个下标都对应两个数据域,一个用来存放数据元素,一个用来存放next指针。 0,i<L.length,++i) //遍历L长度中每个位置 if(e == L.data[i]) //获取每个位置对应和e进行判断,这里等于可以是大于、 //插入成功,返回1 } 3.删除数据元素算法 将顺序表第p个位置元素e进行删除,如果p输入不正确,则返回0,代表删除失败;如果p输入正确,则将顺序表中位置p后面的元素依次往前传递,把位置p元素覆盖掉即可 //更新指针r指向 } r -> next = NULL; //直到r指针指向为NULL } 2.查找结点算法 在链表中查找为 x结点,如果找到,则返回该结点指针,否则返回NULL

    26230

    LeetCode-581-最短无序连续子数组

    ** # 解题思路 方法1、排序比较: 先给数组排序,然后进行一一比较,遇到不相等位置就更新start和end start始终靠最小比较,end始终靠最大比较 之后就能够通过end-start+1 得到排序子数组长度 特例判断:只有当end-start+1>=0时,长度计算有效,否则为0 方法2、指针找边界: 初步思路是,使用指针指针i从头开始遍历,指针j从尾开始遍历。 于是换一种思路,让指针分别找到最后逆序位置 同时从前往后和从后往前遍历,分别得到要排序数组右边界和左边界; 寻找右边界: 从前往后遍历过程中,用max记录遍历过最大,如果max大于当前nums [i],说明nums[i]位置不正确,属于需要排序数组,因此将右边界更新为i,然后更新max;这样最终可以找到需要排序数组右边界,右边界之后元素都大于max; 寻找左边界: 从后往前遍历过程中 ,用min记录遍历过最小,如果min小于当前nums[j],说明nums[j]位置不正确,应该属于需要排序数组,因此将左边界更新为j,然后更新min;这样最终可以找到需要排序数组左边界,左边界之前元素都小于

    9420

    Redis 服务端程序实现原理

    list *clients; /* List of active clients */ ........ } clients 字段是一个端链表结构,保存了所有成功建立连接客户端 二、redis 如何执行一条命令 redis 服务端程序启动后,会初始化一些字段变量,为 redisServer 中一些字段赋默认,还会读取用户指定配置文件内容并加载配置,反应到具体数据结构内,最后会调用 //根据不同请求类型,执行命令解析 //实际上就是把命令名称、参数解析存入 argc 数组中 if (c->reqtype == PROTO_REQ_INLINE) timeEventHead 是一个端链表,所有的时间事件都会以链表形式存储在这里,具体指向结构是 aeTimeEvent。 //获取当前时间 aeGetTime(&now_sec, &now_ms); if (now_sec > te->when_sec || (now_sec == te->when_sec

    43610

    高频Redis面试题解析:Redis 事务是否具备原子性?

    首先检查此命令格式是否正确,如果不正确,服务器会在客户端状态(redisClient) flags 属性打开 REDIS_MULTI 标识,并且返回错误信息给客户端。 如果正确将这个命令放入一个事务队列里面,然后向客户端返回 QUEUED 回复。 我们先看看事务队列是如何实现? ,数组中每个 multiCmd 结构都保存了一个如入队命令相关信息:指向命令实现函数指针,命令参数,以及参数数量。 * 事务命令 */ typedef struct multiCmd { // 参数 robj **argv; // 参数数量 int argc; // 命令指针 MySQL SQL 查询是可以相当复杂,而且 MySQL 没有事务队列这种说法,SQL 真正开始执行才会进行分析和检查,MySQL 不可能提前知道下一条 SQL 是否正确

    8510

    如何快速合并两个有序数组

    本文主要介绍「逆向指针策略来解答此题,供大家参考,希望对大家有所帮助。 ❞ ❝ 策略二:指针法,先开辟一个新数组,长度为两个数组长度之和,然后让两个指针分别指向两个数组头部,比较这个两个指针指向数组元素,将数值较小放到新数组头部,再将指向数值较小指针右移 【空间复杂度】:策略一是「O(1)」,开辟额外存储空间;策略二是「O((n + m))」,额外开辟了长度为 m + n 数组。 逆向指针 从前面的分析可知,策略二相对于策略一来说,时间复杂度「更优」了,但开辟了「额外」空间。 有没有方法能够将策略二空间复杂度优化呢? p 和 q 指向数组位置元素 image.png 将元素较大存放在 nums1[k] 中,并左移 k 和 q(指向数值较大指针) image.png 以此类推,其处理完整过程如下动图示

    26400

    算法(二)指针迭代

    对前面反转(left之前)链表处理过于暴力。 理解(不保证正确) 1,链表题中出现左右边界问题,引入一个虚拟头指针,能避免大量问题。 3,相交链表 来自 LeetCode160 解法 1,指针智商题 其实就是走两次,经常能用到这个思想 /** * Definition for singly-linked list. 2,正向指针 因为已经排好序,所以比较最小只需要比较最靠前元素即可。 这里就能想到指针,但是这个方法必须新建一个新数组,空间复杂度高。 正向指针逆想法 如果不想新建新数组的话,用最小覆盖可能会覆盖nums1原来元素 所以我们可以想到用最大来覆盖,nums1最后元素,因为nums1长度固定。

    12060

    算法练习(2)-删除有序数组单链表中重复项

    要求:   删除有序数组(或有序单链表)中重复项。 示例:   输入[1,1,2,2,3] 输出[1,2,3]   输入a->b->b->c->c 输入a->b->c 思路: 指针,慢指针从第1个有效元素开始,快指针从第2个有效元素开始,快指针对应元素与慢指针对应元素比较 跟数组不同是,当fast到达末节点时,slownext必须设置为空,否则如果末端几个节点出现重复时,尾巴上重复节点甩不掉。 ,可参考上一篇 扩展:如果要去重数组,不是有序,比如['a','a','b','a','c','c'] 这种如何去重呢? 仍然可以用指针法,但是每次fast指针对应元素,就必须再到慢指针之前所有元素中,对比一次,才能知道是不是重复了。

    27740

    LeetCode No.234 回文链表

    数组列表底层是使用数组存储,我们可以通过索引在 O(1) 时间访问列表任何位置,这是由基于内存寻址方式。 链表存储是称为节点对象,每个节点保存一个和指向下一个节点指针。 访问某个特定索引节点需要 O(n)时间,因为要通过指针获取到下一个位置节点。 确定数组列表是否回文很简单,我们可以使用指针法来比较两端元素,并向中间移动。 然而同样方法在链表上操作并不简单,因为不论是正向访问还是反向访问都不是 O(1)。而将链表复制到数组列表中是 O(n),因此最简单方法就是将链表复制到数组列表中,再使用指针法判断。 算法 一共为两个步骤: 复制链表数组列表中。 使用指针法判断是否为回文。 第一步,我们需要遍历链表将复制到数组列表中。我们用 currentNode 指向当前节点。 第一步: 遍历链表并将复制到数组中,O(n)。 第二步:指针判断是否为回文,执行了 O(n/2)次判断,即 O(n)。 总时间复杂度:O(2n) = O(n)。

    18740

    从数据存储角度分析Redis为何这么快?

    预空间分配:如果对一个SDS进行修改,分为以下两种情况: SDS长度(len)小于1MB,那么程序将分配和len属性同样大小使用空间,这时free和len属性相同。 举个例子,SDSlen将变成15字节,则程序也会分配15字节使用空间,SDSbuf数组实际长度变成15+15+1=31字节(额外一个字节用户保存空字符)。 SDS长度(len)大于等于1MB,程序会分配1MB使用空间。比如进行修改之后,SDSlen变成30MB,那么它实际长度是30MB+1MB+1byte。 从图中可以看出Redislinkedlist端链表有以下特性:节点带有prev、next指针、head指针和tail指针获取前置节点、后置节点、表头节点和表尾节点复杂度都是O(1)。 len属性获取节点数量也为O(1)。 与端链表相比,压缩列表可以节省内存空间,但是进行修改或增删操作时,复杂度较高;因此当节点数量较少时,可以使用压缩列表;但是节点数量多时,还是使用端链表划算。

    21710

    Redis 为什么这么快?

    预空间分配:如果对一个SDS进行修改,分为一下两种情况: SDS长度(len)小于1MB,那么程序将分配和len属性同样大小使用空间,这时free和len属性相同。 举个例子,SDSlen将变成15字节,则程序也会分配15字节使用空间,SDSbuf数组实际长度变成15+15+1=31字节(额外一个字节用户保存空字符)。 SDS长度(len)大于等于1MB,程序会分配1MB使用空间。比如进行修改之后,SDSlen变成30MB,那么它实际长度是30MB+1MB+1byte。 从图中可以看出Redislinkedlist端链表有以下特性:节点带有prev、next指针、head指针和tail指针获取前置节点、后置节点、表头节点和表尾节点复杂度都是O(1)。 len属性获取节点数量也为O(1)。 与端链表相比,压缩列表可以节省内存空间,但是进行修改或增删操作时,复杂度较高;因此当节点数量较少时,可以使用压缩列表;但是节点数量多时,还是使用端链表划算。

    44430

    聊聊它数据结构

    预空间分配:如果对一个SDS进行修改,分为一下两种情况: SDS长度(len)小于1MB,那么程序将分配和len属性同样大小使用空间,这时free和len属性相同。 举个例子,SDSlen将变成15字节,则程序也会分配15字节使用空间,SDSbuf数组实际长度变成15+15+1=31字节(额外一个字节用户保存空字符)。 SDS长度(len)大于等于1MB,程序会分配1MB使用空间。比如进行修改之后,SDSlen变成30MB,那么它实际长度是30MB+1MB+1byte。 从图中可以看出Redislinkedlist端链表有以下特性:节点带有prev、next指针、head指针和tail指针获取前置节点、后置节点、表头节点和表尾节点复杂度都是O(1)。 len属性获取节点数量也为O(1)。 与端链表相比,压缩列表可以节省内存空间,但是进行修改或增删操作时,复杂度较高;因此当节点数量较少时,可以使用压缩列表;但是节点数量多时,还是使用端链表划算。

    53420

    七日算法先导(二)——指针

    ,nums[i]每次减minS,假设minS初始化为其他,那么可能出现跳过第一个或者初始不在数组情况 674. ,当然昨天暴力解法也是正确。 : 从0到1入门指针 入门是不够,下面我们来看指针三种情况: 数组相向追赶 数组相向逼近 链表快慢指针(有点难) 数组相向追赶 俩个指针,i可以一直往前走,但是j只有当满足条件时候才往前走 数组相向逼近 一般来说,俩个指针数组俩端开始,不断去check是否满足条件,根据不同条件,来选择是左指针自增,还是右指针自减 链表快慢指针 快慢指针,顾名思义,定义俩个指针,一个指针可以走很快 ,另一个相对走较慢,当快指针走到链表结尾,慢指针对应节点,获取一些信息,从而解决一些问题。

    9820

    Redis为何这么快--关键在于它数据结构

    预空间分配:如果对一个SDS进行修改,分为一下两种情况: SDS长度(len)小于1MB,那么程序将分配和len属性同样大小使用空间,这时free和len属性相同。 举个例子,SDSlen将变成15字节,则程序也会分配15字节使用空间,SDSbuf数组实际长度变成15+15+1=31字节(额外一个字节用户保存空字符)。 SDS长度(len)大于等于1MB,程序会分配1MB使用空间。比如进行修改之后,SDSlen变成30MB,那么它实际长度是30MB+1MB+1byte。 从图中可以看出Redislinkedlist端链表有以下特性:节点带有prev、next指针、head指针和tail指针获取前置节点、后置节点、表头节点和表尾节点复杂度都是O(1)。 len属性获取节点数量也为O(1)。 与端链表相比,压缩列表可以节省内存空间,但是进行修改或增删操作时,复杂度较高;因此当节点数量较少时,可以使用压缩列表;但是节点数量多时,还是使用端链表划算。

    23920

    扫码关注腾讯云开发者

    领取腾讯云代金券