redis五种数据结构特点

news2024/11/17 16:34:39

redis五种数据结构特点

  • redis-string
    • 介绍
    • SDS内部存储数据结构
    • 三种编码方式
    • 特点总结
  • redis-list
    • 介绍
    • quicklist
    • 特点总结
  • redis-hash
    • 特点总结
  • redis-set
    • 介绍
  • 特点总结
  • redis-zset
    • 介绍
    • 特点总结

redis使用五种数据结构,分别是string(字符串),list(列表),hash(哈希表),set(集合),zset(有序列表)。
下面介绍他们的一些特点

redis-string

介绍

string是redis中最基础的数据结构,就是KV键值对中V值的类型是字符串。

SDS内部存储数据结构

redis没有使用char数组来存储字符串,而是使用SDS(simple dynamic string)来存储字符串。SDS是一种数据结构,定义为:

struct sdshdr {
    //记录buf数组中已使用字节的数量
    //等于sds所保存字符串的长度
    int len;
    
    //记录buf数组中未使用字节的数量
    int free;
    
    //字节数组,用于保存字符串
    char buf[];
}

free属性表示这个SDS未使用的空间;
len属性表示这个SDS保存了一个len字节长的字符串;
buf属性是一个char类型的数组,它是一个柔性数组,前面的字节保存了字符串,最后一个字节则保存了空字符’\0’。(保留这种设计是为了让SDS可以直接重用一部分C字符串函数库里面的函数)

相比于c字符串,SDS的优势:

  1. SDS获取字符串长度的时间复杂度是O(1),c字符串是O(n);
  2. SDS在字符串长度增减时自动处理分配空间,杜绝内存溢出的操作;相比c字符串,减少了内存重分配的次数;
  3. SDS是二进制安全的。C字符串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。而SDS不会出现因为特殊字符导致字符串被截断的问题,SDS的API都是二进制安全的(binary-safe),所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据。

三种编码方式

redis为了更好的节省空间,采用不同方式的存储。

  • 当保存的是 Long 类型整数时,RedisObject 中的指针就直接赋值为整数数据了,这样就不用额外的指针再指向整数了,节省了指针的空间开销。
  • 当保存的是字符串数据,并且字符串小于等于 44 字节时,RedisObject 中的元数据、指针和 SDS 是一块连续的内存区域,这样就可以避免内存碎片。这种布局方式也被称为 embstr 编码方式。
  • 当保存的是字符串数据,并且字符串大于 44 字节时,SDS 的数据量就开始变多了,Redis 就不再把 SDS 和 RedisObject 布局在一起了,而是会给 SDS 分配独立的空间,并用指针指向 SDS 结构。这种布局方式被称为 raw 编码模式。

特点总结

  • 采用SDS数据结构进行存储,相比c字符串效率更高,更安全
  • 当字符串是long类型整数时,直接采用int格式存储;
  • 当字符串是<=44字节的字符串,采用embstr格式存储;
  • 当字符串是>44字节的字符串,采用raw格式存储;

redis-list

介绍

list在redis中代表一种可以双向插入,删除的链表。

quicklist

quicklist是redis中list使用的数据结构,它是由双向链表和ziplist组成的。
其主体是一个双向链表,链表中的每一个元素是一个ziplist,每当ziplist超过list-max-ziplist-size大小的时候(默认8字节),就会新建一个ziplist。
这样设计的好处是即保留了链表头尾插入,删除元素的高效,也使得中间元素的查询变得更加高效。

特点总结

  • 采用quicklist进行存储

redis-hash

特点总结

  • redis中的hash使用ziplist和hashtable作为存储数据结构
  • 使用ziplist的条件:
    – key < 64 bytes
    – value < 64 bytes
    – 元素个数 < 521
    – 否则就会使用hashtable
  • redis中的hashtable是使用dictht实现的 在这里插入图片描述
    其中,table 结构是一个 dictEntry 类型的数组,而 dictEntry 是一个单向链表中的节点,代表的是 hashtable 中的一条记录,包含了该条记录的 key、value 以及指向下一个节点(下一条记录)的指针(hash 碰撞)。
    dictEntry 中的 key 和 val 都是 void 类型,意味着可以存储任意数据类型。所以,即使 Redis 中一些数据类型本身的底层实现也是 hashtable(set、zset、hash 等),但仍然可以存储在 redisDb 中的 dict 中。
    dictht 中的 size 表示 hashtable 中 bucket 的数量,sizemask 是 size 的位掩码,用于计算对应的 key 应该存储在哪个 bucket 当中(位运算的效率高于取模运算)。而 used 则用来存储当前 hashtable 中实际存储的记录(元素)的数量。

redis-set

介绍

set在redis中代表无序集合,其中元素的key值不可以重复出现。

特点总结

  • set存储结构是两种:intset和hashtable
  • intset使用条件:
    – V值类型是数字
    – 元素个数 < 512
    – 否则使用hashtable来存储

redis-zset

介绍

zset在redis中代表有序集合,其中元素key值不可以重复出现,按照给定的score排序

特点总结

  • zset使用ziplist和skiplist作为存储结构
  • 使用ziplist的条件:
    – 元素个数 < 128
    – key < 64 bytes
    – value < 64bytes
    – 否则使用skiplist

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1314163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何连接到 Azure SQL 数据库(下)

在《如何连接到 Azure SQL 数据库&#xff08;上&#xff09;》中&#xff0c;我们已经了解到了以下内容↓↓↓ 开始之前&#xff1a;Azure 连接凭据和防火墙 如何检索 Azure 连接凭据如何配置服务器防火墙使用 SQL Server Management Studio 连接到 Azure使用 dbForge Studio…

实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + y源码)

导 读 本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍 实例图片来源于网络,目标是分割下图中圆形目标并计数。 本文实现效果如下: 实现步骤 【1】灰度转换 + 均值滤波 + 二值化,得到参考背景 img = cv2.imread(src.jpg)c…

AcWing 1250. 格子游戏(并查集)

题目链接 活动 - AcWing本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1252/ 题解 当两个点已经是在同一个连通块中&#xff0c;再连一条边&#xff0c;就围成一个封闭的圈。一般用x * n y的形式将&#xff08;x, y&#xff0…

注意力机制,Transformer相关详解

本文遵循《动手学深度学习pytorch版》的内容组织&#xff0c;从注意力机制开始讲到Transfomer&#xff0c;偏重关键知识理解并附带图解和公式&#xff0c;未加说明时&#xff0c;插图均来自于该书&#xff0c;文本内容较长&#xff08;9414字&#xff09;&#xff0c;建议收藏慢…

P33鱼和熊掌可以兼得的机器学习-why deep

Review: Why Hidden Layer? 在这里插入图片描述 ** 一个hidden 可以通过无数个 picewise linear 构成任意形状的曲线** 那么为什么还要 deep 呢 Why deep not Fat 同样参数量下&#xff0c;deep的模型表现优于 fat 的 Why we need deep? 使用deep&#xff0c;效率更高&…

mybatisplus使用雪花id通过swagger返回ID时精度丢失问题

在使用mybatisplus自带雪花的时候会发现返回的ID是19位的长度&#xff0c;因此在通过swagger页面展示的时候会发现后端返回的和页面展示的ID不一致问题。是因为精度丢失的问题。因此需要更改雪花ID的长度跟踪进去&#xff1a;发现是DefaultIdentifierGenerator类实现了Identifi…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…

React中的setState执行机制

我这里今天下雨了&#xff0c;温度一下从昨天的22度降到今天的6度&#xff0c;家里和学校已经下了几天雪了&#xff0c;还是想去玩一下的&#xff0c;哈哈&#xff0c;只能在图片里看到了。 一. setState是什么 它是React组件中用于更新状态的方法。它是类组件中的方法&#x…

Redis——02,redis-benchmark 性能测试

redis-benchmark 性能测试 一、benchmark 性能测试。二、参数详解&#xff1a; 一、benchmark 性能测试。 在bin目录下&#xff0c;有一个redis-benchmark 工具&#xff0c;是用来测试性能的。 二、参数详解&#xff1a; http://doc.yaojieyun.com/www.runoob.com/redis/re…

正则化实战( Lasso 套索回归,Ridge 岭回归)

Lasso 套索回归 导入包 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegressor, LinearRegression原方程的计算结果 # 1. 创建数据集X&#xff0c;y X 2 * np.random.rand(100, 20) w np.random.rand(20, 1) b np.r…

MATLAB 计算点云坐标的最大最小值 (38)

MATLAB 计算点云坐标的最大最小值 (38) 一、算法介绍二、算法实现1.代码一、算法介绍 沿着X Y Z三个坐标轴方向,点云坐标存在对应的最大最小值,这在计算点云体积或者其他方面有使用,这里使用MATLAB快速获取xmax xmin ymax ymin zmax zmin6个最大最小值 二、算法实现 1.代…

详谈前端中常用的加/密算法

本文主要详细介绍了在前端开发中常用的加/解密算法&#xff0c;以及前端如何实现。 总的来说&#xff1a;前端加密无论使用哪个加密都一样是有可能性被他人获取到相关的公钥或密钥的&#xff08;比如&#xff1a;拦截请求、查看源代码等&#xff09;&#xff0c;然后进行加密与…

MS5602视频 8 位数模转换器,可替代TLC5602

MS5602 是低功率、超高速视频数模转换器。 MS5602 以 DC 至 20MHz 的采样速率&#xff0c;将数字信号转换成模拟信号。由于高速工作 的特性&#xff0c; MS5602 适合于数字电视、电脑视频处理及雷达信号处 理等数字视频应用。 MS5602 工作在 -40C 至 85C 的温度范围内 …

实验4.1 静态路由的配置

实验4.1 静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.设置交换机和路由器的基本配置。2.使用display ip interface brief命令查看接口配置信息。3.配置静态路由&#xff0c;实现全网互通。 六、任务验收七、任务小结 一、任务描述 某公司刚…

HTTP 414错误:请求URI过长,如何避免

在Web开发中&#xff0c;HTTP状态码是用于表示Web服务器响应的各种状态。其中&#xff0c;HTTP 414错误表示请求URI过长&#xff0c;这意味着客户端发送的请求URL超过了服务器所能处理的长度限制。 当请求的URI过长时&#xff0c;服务器可能无法正确处理请求&#xff0c;从而导…

小白学爬虫:根据商品ID或商品链接获取淘宝商品详情数据接口方法

小白学爬虫的准备工作包括以下几个方面&#xff1a; 学习Python基础知识&#xff1a;首先需要掌握Python编程语言的基本语法和数据类型&#xff0c;了解Python的常用库和模块&#xff0c;例如requests库等。了解HTTP协议和HTML语言&#xff1a;了解HTTP协议的基本概念和原理&a…

sql 数据类型注入+tamper

数字型 0-9 查询语句&#xff1a; $sql"select * from sy_guestbook where id$i"; 字符型 a-z 中文 标点符号 加入了单引号 查询语句&#xff1a; $sql"select * from sy_guestbook where gTpl$g"; simple order by 16--select * from sy_guestbook w…

Flink+Kafka消费

引入jar <dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.8.0</version> </dependency> <dependency><groupId>org.apache.flink</groupId><artifactI…

酸菜行业分析:占整体市场规模比重的1.2%

酸菜的加工不仅有巨大的市场需求&#xff0c;且对分布于湖南、四川、广西、贵州等地的芥菜等植物资源和农产品价值&#xff0c;予以有效提升&#xff0c;是贫困地区农民增收的重要方式。单杨建议&#xff0c;以酸菜为原料的食品加工企业应引以为戒&#xff0c;将食品安全重点防…

Gartner发布2024年网络安全预测 :IAM 和数据安全相结合,解决长期存在的挑战

安全和风险管理领导者需要采用可组合的数据安全视图。这项研究预测&#xff0c;将数据安全创新应用于痛点和高级用例将有助于组织将其数据用于几乎任何用例。 主要发现 在所有云服务模型中&#xff0c;数据安全以及身份和访问管理 (IAM) 的责任均由最终客户承担。 由于这两个学…