Redis的数据结构_redis数据结构-程序员宅基地

技术标签: redis  

一、redis的数据结构

1、String字符串类型

  Redis的String能够表示字符串、整数、浮点数三种值的类型

应用场景:

  1. 普通的赋值
  2. 使用incr、decr命令进行递增和递减统计数据。用于实现乐观锁watch(事物)
  3. setNx实现分布式锁

底层数据类型:

// 数据结构
struct sdshdr{
    //记录buf数组中已使用字节的数量
    int len;
    //记录 buf 数组中未使用字节的数量
    int free;
    //字符数组,用于保存字符串
    char buf[];
}
  • int:当存储为int类型的整数时
  • embstr:编码简单的动态字符串。单字符串长度小于44个字节时
  • raw:简单的动态字符串,大字符串,当长度大于44个字节时

2、List列表类型

  list可用于来存储有序的可重复的数据,可快速获取头尾数据,最多存储2^32-1个元素。

底层数据结构:

1、LinkList:是一个双向链表,双向链表的结构就是包括一个头节点、然后每个节点都有一个头指针指向前一个元素和一个尾指针指向后一个元素。

2、zipList:压缩链表

压缩链表有一个zitail_offset记录了最后一个entry的偏移量,这样就可以快速定位到链表的最后一个元素然后开始倒叙遍历。zipList的entry的数据结构:

typede struct entry{
    //前一个entry的长度
    int<var> prelen;
    //元素类型编码
    int<var> encoding;
    //元素内容
    optional byte[] content;
}

压缩链表和普通LinkList的区别,压缩链表并不是给元素进行压缩,而是链表的空间都是分配连续的而LinkList分配的内存空间是随机分配的这样zipList相比于LinkList就不会出现内存的碎片化。并且由于zipList的空间是连续的所以减少了pre指针和next指针,每个指针需要占用8个字节,少了两个指针就减少了16个字节。

  由于zipList是连续的空间,并且没有pre、next指针所以删除新增元素需要元素的拷贝,以及连锁更新操作。所以当元素少的时候list采用zipList存储,元素多的时候采用ListList。

3、quickList

  quickList是linkList和zipList的结合,linkList的每一个节点都是一个zipList,当zipList中的元素达到一定的量的时候就会创建linkList另外一个节点的zipList。

应用场景:

  1. 可以用于实现堆栈
  2. 可用于阻塞队列
  3. 可用于各种列表,比如用户列表、商品列表、评论列表等。

参考:Redis底层数据结构之list - 凡尘多遗梦 - 博客园 (cnblogs.com)

3、set集合类型

  set集合类型用于保存无序的不重复数据

底层数据结构:

1、intset:当存储的类型为整数并且元素的个数小于set-max-intset-entries的时候使用intset存储数据,intset使用的是一个数组来存储数据。

2、dict字典:当存储的数据不是int类型,或者数据的量超过了set-max-intset-entries则使用字典来存储,字典的key就为数据的值,value等于null。

应用场景:

  1.   用于保存不能重复且不需要排序的数据,比如关注的用户信息
  2. 使用spop返回集合中一个随机元素,并将其删除、srandmember返回集合中一个随机元素并不删除。这两个命令来实现随机抽奖功能

4、sortset有序集合类型

  存储有序的并且不的数据。sortset中的元素都会关联一个score分数并按照分数排序,分数可重复。

底层数据结构:

1、ziplist:当数据量较少且元素都是小整数或者短字符串时

2、skiplist:跳跃表

应用场景:

  1. 实现排行榜的功能

5、hash类型

  Redis hash 是一个 string 类型的 field 和 value 的映射表,它提供了字段和字段值的映射。

底层数据结构:

1、ziplist:当散列表元素的个数比较少,且元素都是小整数或短字符串时。

2、dict:当散列表元素的个数比较多或元素不是小整数或短字符串时。

应用场景:

  1. 对象的存储

6、bitmap类型

通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。bitmap的数据主要是key、偏移量offset、值,其中值只能是0和1。极大的节省的内存空间

应用场景:

  1. 记录员工的打卡记录:key为日期,偏移量是用户id,值为0表示未打卡,1表示已打卡。或者key为用户id,偏移量为日期,值为0表示未打卡,1表示已打卡。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41998947/article/details/125559172

智能推荐

整理_gotodlgctrl(getdlgitem-程序员宅基地

文章浏览阅读578次。1.GotoDlgCtrl(GetDlgItem(IDC_examnum)); GetDlgItem()_gotodlgctrl(getdlgitem

UVALive4167 HDU2700 Parity【水题】_the parity problem returns 1 if the input that are-程序员宅基地

文章浏览阅读877次。ParityTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4842 Accepted Submission(s): 3635Problem DescriptionA bit string has odd parity_the parity problem returns 1 if the input that are 1 is even

【GPLT】L1-039 古风排版_l1-039 古风排版c语言-程序员宅基地

文章浏览阅读138次。题目描述:中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。输入描述:输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。输出描述:按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。输入样例:4This is a test case输出样例:asa Ts..._l1-039 古风排版c语言

mac电脑安装cocoapods出错,以及安装最新版本ruby方法_error installing cocoapods: cocoapods-1.11.2 requi-程序员宅基地

文章浏览阅读1.5k次,点赞8次,收藏10次。使用如上命令确实安装成功了,但在 Flutter 中启动 Xcode 就会报错,启动失败。的环境变量,不用多想,按照提示来(不要复制如下路径,复制你终端提示的命令)会在安装完后提示两个路径:将这两个路径复制到你的命令行,重新执行一下。我尝试后,发现又安装失败。所以现在的情况就只有一个办法,升级。时碰到一个报错:大概率是ruby的版本太低导致的。根据以上,提醒我们需要一个至少 1.9 版本的。,指定一个低版本是否可行呢?的版本太低了,导致不能安装最新的。,那我卸载然后继续安装。版本是否就可以了呢?_error installing cocoapods: cocoapods-1.11.2 requires ruby version >= 2.6.

HttpURLConnection请求调用webservice接口_httpurlconnection soap webservice-程序员宅基地

文章浏览阅读439次,点赞5次,收藏8次。【代码】HttpURLConnection请求调用webservice接口。_httpurlconnection soap webservice

Ubuntu 18.04安装nccl_ubuntu18.04 安装nccl-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏6次。NCCL (NVIDIA Colloctive Comunications Library)是英伟达的一款直接与GPU交互的库。安装cupy前需要先安装该库。1. 下载官网下载地址:https://developer.nvidia.com/nccl/nccl-download注意版本与你的cuda适配。2.安装获得.deb安装文件如:nccl-repo-ubuntu1804-2.8.3-ga-cuda10.2_1-1_amd64.deb后sudo dpkg -i nccl-repo-ubunt_ubuntu18.04 安装nccl

随便推点

使用java和CORBA实现分布应用编程_基于服务器框架,编写服务器对象-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏16次。因为课程的需要,学习了下用java和CORBA来实现分布应用编程,具体的CORBA是什么以及它的框架结构我就不多说了,这里我是给出一个比较完整的例子来展示下代码要怎么写。应用背景:使用java和CORBA构建一个关于制订to-do-list的分布式应用。不同的客户端可以通过连接到服务器来管理自己的to-do-list,比如有add list items、query list items、delete_基于服务器框架,编写服务器对象

python是低级语言吗_科悟学院带你初识python(3)Python是一门什么语言-程序员宅基地

文章浏览阅读104次。python是一门什么样的语言编程语言主要分为编译型和解释型编程语言编译型和解释型的区别是什么?编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快。这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二..._python是一门低级编程语言

pdf中的尺寸和html中尺寸,如何将PDF文档中的图片尺寸调整到宽度一致?-程序员宅基地

文章浏览阅读1.3k次。如何将PDF文档中的图片尺寸调整到宽度一致?今天有粉丝跟我们提问,说PDF文档里的图片大小不一,看起来不够美观,想问问怎么才能把图片大小调整一致。大家平常阅读PDF文档比较多,关于PDF编辑可能不够熟悉。其实PDF文档中图片大小不一致是因为原图片的尺寸就不一样,想要把图片修改尺寸形成一致也很容易,今天小编就来告诉大家操作的方法。1、首先我们要修改PDF中的图片需要借助PDF编辑器,大家可以直接在本..._pdf上下页图片怎么调在同一宽度

使用plsql管理oracle数据库连接,使用PLSQL Developer连接Oracle数据库详解-程序员宅基地

文章浏览阅读863次。**前景摘要 **本人使用plsql连接oracle折磨半天才得以正常连接使用 由于总是需要换机子 所以每次都要重新安装 所以将其记录下来 为以后不时之需。安装过的系统Windows7 64位Windows10 64位一、工具准备1.Oracle11g_64位2.PLSQL Developer 9_64位3.instantclient 11_32位**二、安装 **自行安装 网上有很多教程1.or..._plsql登录没有提示normal

机器学习实战之支持向量机SVM-2_svm2实战-程序员宅基地

文章浏览阅读176次。续:机器学习实战之支持向量机SVM-1后来对前面的代码进行优化,主要是3方面:1.更加合理选择j,取代原来的随机选择j;j是从已更新的alpha值的列表中选取,也就是已发现的支持向量列表中选取。选择原则是:max(abs(Ei-Ej)),2.选择ai,先遍历整个数据集,后面只遍历支持向量数据集;只更新支持向量的ai,更加合理。3.将数据结构化,整洁易懂。对非线性数据的处理,要用到核函数。这里用到高..._svm2实战

ROS中运行rostopic echo话题名 出现 Cannot load message class错误-程序员宅基地

文章浏览阅读4.7k次,点赞9次,收藏26次。当运行ROS时,在新开启的一个终端运行rostopic echo话题名时,出现ERROR: Cannot load message class for [plumbing_pub_sub/Person]. Are your messages built?(其中Person为自定义的message类型)解决方法:这是因为这个话题名的消息类型并不是ros本身拥有的,而是自定义的,因此我们须在这个新的终端中先刷新一下环境source ./devel/setup.bash配置工作空间,用于刷新环境,将当前的工_rostopic echo