Redis五大数据结构详解_redis五大数据结构的操作命令-程序员宅基地

技术标签: 程序员  Java  java  互联网  编程  java技术  IT  

Redis五大数据结构详解

 

 

1 通用命令

 

 

 

 

2 数据结构和内部编码

 

 

2.1 Redis 没有传统关系型数据库的Table 模型

schema 所对应的db仅以编号区分。同一个db 内,key 作为顶层模型,它的值是扁平化的。也就是说db 就是key的命名空间 key的定义通常以“:” 分隔,如:Article:Count:1 我们常用的Redis数据类型有:string、list、set、map、sorted-set

 

 

2.2 redisObject通用结构

Redis中的所有value 都是以object 的形式存在的,其通用结构如下

typedef struct redisObject {
    unsigned [type] 4;
    unsigned [encoding] 4;
    unsigned [lru] REDIS_LRU_BITS;
    int refcount;
    void *ptr;
} robj;
  • type 指的是前面提到的 string、list 等类型
  • encoding 指的是这些结构化类型具体的实现方式,同一个类型可以有多种实现 e.g. string 可以用int 来实现,也可以使用char[] 来实现;list 可以用ziplist 或者链表来实现
  • lru 表示本对象的空转时长,用于有限内存下长时间不访问的对象清理
  • refcount 对象引用计数,用于GC
  • ptr 指向以encoding 方式实现这个对象实际实现者的地址 如:string 对象对应的SDS地址(string的数据结构/简单动态字符串)

 

 

3 单线程

 

 

4 string-字符串

Redis中的string 可以表示很多语义 - 字节串(bits) - 整数 - 浮点数

这三种类型,redis会根据具体的场景完成自动转换,并且根据需要选取底层的承载方式 例如整数可以由32-bit/64-bit、有符号/无符号承载,以适应不同场景对值域的要求

 

4.1 内存结构

在Redis内部,string的内部以 int、SDS(简单动态字符串 simple dynamic string)作为存储结构 - int 用来存放整型 - SDS 用来存放字节/字符和浮点型SDS结构

(1)SDS

typedef struct sdshdr {
    // buf中已经占用的字符长度
    unsigned int len;
    // buf中剩余可用的字符长度
    unsigned int free;
    // 数据空间
    char buf[];
}

 

上面存储的内容为“Redis”,Redis采用类似C语言的存储方法,使用'\0'结尾(仅仅是定界符) 上面SDS的free 空间大小为0,当free > 0时,buf中的free 区域的引入提升了SDS对字符串的处理性能,可以减少处理过程中的内存申请和释放次数

(2) buf 的扩容与缩容

当对SDS 进行操作时,如果超出了容量。SDS会对其进行扩容,触发条件如下: - 字节串初始化时,buf的大小 = len + 1,即加上定界符'\0'刚好用完所有空间 - 当对串的操作后小于1M时,扩容后的buf 大小 = 业务串预期长度 * 2 + 1,也就是扩大2倍。 - 对于大小 > 1M的长串,buf总是留出 1M的 free空间,即2倍扩容,但是free最大为 1M。

(3)字节串与字符串

SDS中存储的内容可以是ASCII 字符串,也可以是字节串 由于SDS通过len 字段来确定业务串的长度,因此业务串可以存储非文本内容 对于字符串的场景,buf[len] 作为业务串结尾的'\0' 又可以复用C的已有字符串函数

(4)SDS编码的优化

value 在内存中有2个部分:redisObject和ptr 指向的字节串部分。在创建时,通常要分别为2个部分申请内存,但是对于小字节串,可以一次性申请。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tzllxya/article/details/90179305

智能推荐

基于opencv的人脸检测与识别(python)(1)-程序员宅基地

文章浏览阅读514次。基于opencv的人脸检测,再使用tensorflow的框架以及keras库通过卷积神经网络对获取的人脸数据进行训练,生成训练模型,并对实时图片进行人脸识别。

Numbers on Tree_k. numbers on tree-程序员宅基地

文章浏览阅读160次。D. Numbers on Treetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputEvlampiy was gifted a rooted tree. The vertices of the tree are numbered..._k. numbers on tree

软件测试工程师面试题-测试概念篇_面试测试工程师概念性问题有哪些-程序员宅基地

文章浏览阅读901次。转载于:https://www.cnblogs.com/mrwuzs/p/7976534.html_面试测试工程师概念性问题有哪些

0910-12学习记录-OFDM细节描述_ofdm子载波流数-程序员宅基地

文章浏览阅读899次。PPDU编码过程总览编码过程包含了很多细节的步骤,在以下的细节条款有很详细的描述。接下来的总览主要是为了促进对于这些细节的理解。生成PLCP前导码字段,包含10个短训练序列(用来做AGC增益控制,分集选择,时间的同步获取以及在接收端的粗频偏估计)和两个重复的长训练序列(用来做信道估计以及接收端的精准频偏估计)前面有保护间隔(GI)。具体的细节描述在 17.3.3.17.3.3.描述PLCP..._ofdm子载波流数

OSChina 中秋节乱弹 ——加班比抢了我的小鱼干,更让我难过!-程序员宅基地

文章浏览阅读234次。2019独角兽企业重金招聘Python工程师标准>>> ...

SpringBoot引入MyBatis_springboot mybatis jar maven引入-程序员宅基地

文章浏览阅读128次。首先进入spring官网,添加依赖,然后生成项目。打开Idea,然后导入刚才生成的项目文件。测试不用集成组件,要不然下载会下载很长时间。找到maven插件,导入必要的jar包。_springboot mybatis jar maven引入

随便推点

Shell根据文本内容批量修改文件名(附完整代码)_linux shell while批量改名-程序员宅基地

文章浏览阅读3.1k次。Shell根据文本内容批量修改文件名_linux shell while批量改名

“计算机系统概述”学习笔记_程序计数器怎么计算下一条指令的地址-程序员宅基地

文章浏览阅读2.2k次。文章目录机器字长存储器组成运算器组成控制器组成计算机系统的层次结构指令执行过程源程序翻译成可执行文件的过程机器字长计算机进行一次整数运算所能处理的二进制数据的位数。存储器组成组件由大到小(大包含小)依次为:计算机系统=计算机硬件系统+计算机软件系统计算机硬件系统=存储器+控制器+运算器+输入设备+输出设备存储器=主存储器(内存储器)+辅助存储器(外存储器)主存储器=地址寄存器(MAR)+存储体+数据寄存器(MDR)+时序控制逻辑存储体=若干存储单元存储单元=若干存储元件每个存储元件存_程序计数器怎么计算下一条指令的地址

Scala编写JedisPoolUtils工具类_jedis scala-程序员宅基地

文章浏览阅读1.5k次。package com.cloudera.utilsimport redis.clients.jedis.{Jedis, JedisPool, JedisPoolConfig}object JedisPoolUtils extends Serializable { @transient private var pool: JedisPool = null def makePoo..._jedis scala

MySQL 使用AVG聚合函数时,保留两位小数的方法_mysql avg保留两位小数-程序员宅基地

文章浏览阅读3.1k次。SELECT ( CASE WHEN platform_parameter IS NULL THEN page ELSE platform_parameter END ) AS page, sum(pv) AS pv, sum(uv) AS uv, CAST(AVG(time) AS DECIMAL(10,2)) as timeFROM t_page_stat_daily tLEFT JOIN t_app_dictionary d ON t.app_id = d._mysql avg保留两位小数

QOS_qos双色分离-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏9次。QOS按权重进行资源分配,进行资源协调(1) 甄别流量(哪些有用,哪些无用----重要程度)(2) 分析流量诉求(有哪些要求----带宽、时延)(3) 细化流量诉求(对哪些参数比较敏感)队列机制 拥塞避免一、 流量分类TOS位,位于包头为之后,8位二进制规定:数字越大,越容易从接口出去(优先级越高)不合理之处:当队列满时,若再有较重要流量要进行排队,将会被拒绝DSCP:插分..._qos双色分离

聚类算法系列---DBSCAN密度聚类算法_聚类公式 ci min y dbscan-程序员宅基地

文章浏览阅读430次。DBSCAN(Density-Based Spatial Clustering of Application with Noise)思想:用一个点的邻域内的邻居点数来衡量该店所在的空间密度,根据密度来判定将样本划分到哪个簇,对于同一个簇里面的样本是紧密相连的。在进行聚类的时候事先不知道cluster的数目。基本概念设数据集X={x1,x2,....,xn}Eps:定义密度时的邻域半径..._聚类公式 ci min y dbscan

推荐文章

热门文章

相关标签