redis五种数据结构特点

【Redis系列 01】从零到精通:Redis五种核心数据结构完全解析 本文通过费曼学习法深度解析Redis五种核心数据结构(String、Hash、List、Set、Sorted Set),结合实际应用场景和代码示例,帮助开发者从零开始掌握Redis的精髓。文章覆盖每种数据结构的特点、使用场景、常用命令和性能特征,是Redis入门和实战必备的完整指南。 阅读详情


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

redis-string

介绍

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

SDS内部存储数据结构

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

struct __attribute__ ((__packed__)) sdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

len属性表示当前字符串使用了len个字节;
alloc属性表示分配到的总长度;
flags代表字符串编码
buf用来存储具体数据,以’\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
Maven证书信任危机:PKIX path building failed的全面解析与实战修复 本文全面解析了Maven构建中常见的`PKIX path building failed`证书验证错误。该错误通常在使用特定镜像仓库或自建仓库时,因SSL/TLS证书不被JDK默认信任而触发。文章深入剖析了错误根源,对比了临时忽略检查与永久导入证书等不同修复方案的安全性与适用场景,并推荐通过`keytool`将证书导入JDK信任库的根治方法,以保障构建安全与稳定。 阅读详情

相关推荐

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

01-Redis 数据结构和特性

目录 1.1 Redis 是什么? 1.2 Redis 有哪些特性 1.3 Redis 的使用场景 1.1 Redis 是什么? Redis 是一种基于键值对(key-value)的NoSQL数据库,相比其他键值对数据库的优势是,Redis 的 value 值类型更加的丰富可以由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitma...

javaTalk 714

Vue3+Vite+Electron桌面应用开发:从零到打包的完整避坑指南

本文是一份详尽的Vue3+Vite+Electron桌面应用开发实战指南。文章从项目初始化、环境配置、主进程构建、Vite深度优化,到最终的打包配置与优化,系统性地讲解了使用现代前端技术栈开发跨平台桌面应用的完整流程,并重点分享了开发与打包过程中的常见“坑点”与解决方案,旨在帮助开发者高效构建稳定可交付的桌面端应用。

hh234的博客 107

解析Redis数据库

Redis 是一个基于内存的高性能 key-value 数据库。是完全开源免费的,用C语言编写的,遵守BSD协议。

Pursuit_li的博客 334

写出GD32L233/235在读写flash的区别(用于OTA功能)

在单片机里面表示 大概是 address += sizeof(uint32_t) address += sizeof(uint64_t)1.说到OTA功能,实际上 往flash 指定区域写 数据, 拷贝数据,然后 跳转, 必要时 注意单片机的偏移量。在写本文时,L233支持单字写入,而L235只有双字写入. 一个写入地址+4 一个写入地址+8。这个是 自己写的擦除一页 数据,当然可以参考 提供的demo去实现,看自己需求。接下来是 读取 双字,也就是在L235上的读取。

teleger的博客 907

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2169

Redis-----------redis的数据结构的特点、用途和操作方法

Redis是一种高效的内存数据库,其数据结构包括字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。下面我们分别介绍一下这些数据结构的特点、用途和Java语言中的操作方法。

LJH_java10086的博客 142

从CAD到Web:高效转换STEP/IGES模型为GLB格式的实践指南

本文详细介绍了如何将工业设计中的STEP/IGES模型高效转换为Web友好的GLB格式。通过PythonOCC和gltf-pipeline等工具链,实现从CAD到Web的无缝转换,大幅提升模型加载速度和展示效果。文章包含实战案例、优化技巧和常见问题解决方案,帮助开发者快速掌握3D模型转换技术。

weixin_29072299的博客 507

redis的特性和数据类型

问题:redis相对于关系数据库表结构优势是什么??数据可设置过期时间内存读写速度快数据类型多样化缓存,队列的功能一、redis的特性1、多种数据类型存储字符串类型散列类型列表类型集合类型有序集合类型2、内存存储与持久化内存的读写速度远快于硬盘自身提供了持久化功能(RDB、AOF两种方式)3、功能丰富可用作缓存、队列、消息订阅/发布支持键的生存时间按照一定规则删除相应的键4、简单稳定相比SQL而言...

阿官 504

SAP_ABAP_SD_BAPI清单案例教程——销售订单开票_BAPI_BILLINGDOC_CREATEMULTIPLE_VF01_S4版本

SAP BAPI(Business Application Programming Interface)是SAP系统中的一组规范和标准,用于从SAP系统中获取数据、输入数据和更新数据。这些API允许开发者以编程方式与SAP系统交互,而无需编写大量的自定义代码。2.1 Copy代码 直接可使用。2.2 VF01开票。

java_zhong1990的专栏 2214

基于Python实现学习进度跟踪系统

{{ task }}: {{ "%.1f"|format(hours) }}小时

寒寒豆豆软件公司的博客 195

Redis数据结构:Hash类型全面解析

Redis,作为一个开源的、内存中的数据结构存储系统,以其出色的性能和灵活的数据类型,广泛应用于缓存、消息队列、发布订阅系统等多种场景。在 Redis 的五种基本数据类型中,Hash 类型是一种非常重要的数据类型。它可以存储键值对的集合,且能够用小于1毫秒的时间复杂度进行添加、删除、更新和查找操作,因此在实际应用中有着广泛的用途。 在接下来的文章中,我将详细介绍 Redis 的 Hash 类型,包括它的内部实现、主要特性、常用命令以及应用场景。无论你是刚接触 Redis 的新手,还是已经有一定经验的开发者

栗筝i的博客 1万+

Jetson agx Orin 适配Xenomai4

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

xiaoning132的专栏 465

Redis的五种数据结构

程序是用来处理数据的,redis是用来存储数据的,程序处理完的数据要存储到redis中,不同特点的数据要存储在redis中不同类型的数据结构中。字符串:         单key: 单value list列表: 有序可重复     单key: 多有序value(这里的有序指的是输入和输出的顺序) set集合: 无序不可重读   单key: 多个无序value pojo           hash 单key : 对象(属性:值)              zset 单key: 多有序value(这里

qq_45896330的博客 6373

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Redis 支持的五种主要数据结构

Redis,作为一个高性能的键值对数据库,不仅支持简单的字符串类型数据,还提供了丰富的数据结构来满足各种复杂场景的需求。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 9805

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Redis五种数据类型

Redis简介 悲观锁:在每次去拿数据的时候总是认为别人会修改数据,因此,在每次去拿的时候都会加锁,其它人想来拿就只能被阻塞。 乐观锁:心很大,每次去拿数据的时候都不认为别人会修改,在取数据的时候不会加锁,乐观锁可以理解为一种检测机制,只是在更新数据的时候会判断一下别人是否已经修改了,如果已经修改了就放弃此次的更新操作,进行重试。检测方式有两种:一种是版本号,一种是时间戳,乐观锁适用于读多的场...

至尊宝 7万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis五种数据结构简介

Redis五种结构 1、String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。 字符串命令: ①get、获取存储在指定键中的值 ②set、设置存储在指定键中的值 ③del、删除存储在指定键中的值(这个命令可以用于所有的类型) ...

飞龙在天 372

Redis 篇-深入了解 Redis 五种数据类型和底层数据结构(SDS、Intset、Dict、ZipList、SkipList、QuickList)

每次执行新增、查询、修改、删除操作时,都检查一下 dict.rehashidx 是否大于 -1,如果是则将 dict.ht[0].table[rehashidx] 的 entry 链表 rehash 到 dict.ht[1],并且将 rehashidx++。:如果当前层已经达到目标值或找到了更大的值,改变层级,将 current 指针向下移动到下一层。5)将 dict.ht[1] 赋值给 dict.ht[0],给 dict.ht[1] 初始化为空哈希表,释放原来的 dict.ht[0] 的内存。

小扳手 3276

【Redis】Redis 底层数据结构、五种数据类型

当我们执行命令setbit key 7 0的时候,相当于把字符0x33变成了0x32,这样字符串的值就变成了”22”。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。String的内部存储结构⼀般是sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String类型的value的值是数字,那么Redis内部会把它转成long类型来存储,从⽽减少内存的使用。

奶酪的博客 3244

Spring Boot 3 【九】Redis 的五种数据结构深入浅出(String & List & Set & Hash & Zset)

在现代应用开发中,高效的数据存储和管理是构建强大系统的关键。Redis 作为一种高性能的内存数据库,以其丰富的数据结构和快速的操作能力而备受青睐。Spring Boot 3 作为流行的开发框架,为整合 Redis 提供了便捷的方式。在本文中,我们将深入探讨 Spring Boot 3 如何与 Redis 进行整合,并详细介绍对 Redis 的五种主要数据结构 —— 字符串(String)、列表(List)、集合(Set)、哈希(Hash)和有序集合(Sorted Set)的操作。

技术管理修行 5503

redis 五种数据类型的使用场景

String 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位(bit) 批量设置一系列字符串的内容 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String

10万+

Redis之五大数据结构

Redis 共有 5 种基本数据结构:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)这 5 种数据结构是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、LinkedList(双向链表)、Hash Table(哈希表)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)。本章详细介绍Redis五种数据结构。

Linux运维老纪的博客 1264

redis的五种数据结构原理分析

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs和 地理空间(geospatial) 索引半径查询。 简单来说,Redis的数据结构主要分为五种基本的数据结构+三种高级的数据结构。我们下面所要介绍的就是这五种基本的数据...

bobozai86的博客 776

Redis原理篇 之数据结构

介绍了Redis的数据结构原理,包括五种数据类型和6中编码方式

weixin_49429082的博客 1389

Redis中数据结构类型

Redis中数据结构类型

给自己一个smile 1571

Redis 五种数据结构命令操作

redis 数据结构 redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构 Redis的value 数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。 一.String字符串类型 string是redis数据类型最基本的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任...

切yi的博客 288
上一篇: vue+minio实现文件上传操作
下一篇: k8s中的整体架构 ,pod含义,服务类型,网络通讯等
code_feien
博客等级 码龄7年 71粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值