hash、set、zset有多牛?从底层告诉你数据结构原理

netty构建udp服务器以及发送报文到客户端客户端详细案例 以上代码中用户判断是window还是linux环境,linux环境默认采用Epoll相关通道,所以显式设置通道。要使 通过服务器端通过要使 通过服务器端通过。 阅读详情

前言

今天来说下Redis中hash、set、zset的底层数据结构原理!

Redis-哈希对象(hash)

hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:

  • hash对象保存的键和值字符串长度都小于64字节
  • hash对象保存的键值对数量小于512 ziplist存储的结构如下

hash、set、zset有多牛?从底层告诉你数据结构原理

 

上图中可以看到,当数据量比较小的时候,我们会将所有的key及value都当成一个元素,顺序的存入到ziplist中,构成有序。

hashtable存储的结构

hash、set、zset有多牛?从底层告诉你数据结构原理

 

字符串的set key value 和 hash 的区别是什么

过期时间,hash没有过期时间set不断的加值有一个问题,dict中有一个属性是dictht ht[2],主要是> 扩容用的,如果不断的加key,则整体redis内存就需要扩容,扩容就需要基于原有内存增加一倍,内存消耗很大

Redis-集合对象(set)

set是一个无序的、自动去重的集合数据类型,Set底层用两种数据结构存储,一个是hashtable,一个是inset。

其中hashtable的key为set中元素的值,而value为null

inset为可以理解为数组,使用inset数据结构需要满足下述两个条件:

  • 元素个数不少于默认值512
  set-max-inset-entries 512
  • 元素可以用整型表示

intset的底层结构

hash、set、zset有多牛?从底层告诉你数据结构原理

 

hash、set、zset有多牛?从底层告诉你数据结构原理

 

查询方式一般采用二分查找法,实际查询复杂度也就在log(n)

Redis-有序集合对象(zset)

zset为有序(有限score排序,score相同则元素字典序),自动去重的集合数据类型,其底层实现为 字典(dict) + 跳表(skiplist),当数据比较少的时候用ziplist编码结构存储。

同时满足以下两个条件采用ziplist存储:

  • 有序集合保存的元素数量小于默认值128个
  • 有序集合保存的所有元素的长度小于默认值64字节

ziplist存储方式

当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值

hash、set、zset有多牛?从底层告诉你数据结构原理

 

字典(dict) + 跳表(skiplist)的存储方式

zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:

有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节

跳表的数据结构

 

首先我们理解一下什么是跳表

hash、set、zset有多牛?从底层告诉你数据结构原理

 

同种可以看到我们通过分等级,从最高等级向低等级查询,效率提高,其时间复杂度为logn(类似于二分查找)

dict+skiplist的最终的存储结构如下

hash、set、zset有多牛?从底层告诉你数据结构原理

 

基于上图我们看一下skiplist几个关键对象的数据结构,方便大家理解

设置

hash、set、zset有多牛?从底层告诉你数据结构原理

 

可以看到一个是dict结构,主要key是其集合元素,而value就是对应分值,而zkiplist作为跳跃表,按照分值排序,方便定位成员

跳表

hash、set、zset有多牛?从底层告诉你数据结构原理

 

zskiplistNode

hash、set、zset有多牛?从底层告诉你数据结构原理

 

zskiplistNode中的robj指针指向具体元素,注意这个指针和dict中key指针指向同一个元素,其中backward后腿指针便于回溯

总结

本节内容主要讲解了Redis中hash、set、zset的底层原理,其中hash底层采用两种,分别是ziplist和hashtable,set底层也分别采用两种hashtable和inset,其中inset也可以理解为数组,zset底层分别是ziplist和dict+skiplist,我们可以看到在节省内存、提高查询效率方面都体现了优秀的设计,这些都可以作为我们日后设计及开发中的宝贵经验,下一节我们将带领大家学习Redis在数据安全及性能保障方面的特点。

大家看完有什么不懂的可以在下方留言讨论.

谢谢你的观看。

觉得文章对你有帮助的话记得关注我点个赞支持一下!

Netty进阶-Netty篇 Netty处理粘包、半包、 粘包、半包现象分析、 什么是滑动窗口、 什么是MSS限制、 什么是Nagle算法、 协议设计与解析、 http 协议、 自定义协议、 @Sharable 注解、 空闲检测-连接假死、 Netty常用参数配置 阅读详情

相关推荐

激光光束质量评估与光斑尺寸计算:从理论到MATLAB实践

本文详细解析激光光束质量评估与光斑尺寸计算的理论基础及MATLAB实践方法,重点介绍M²因子的测量与应用。通过高斯光束模型、CCD成像法和MATLAB算法实现,帮助读者掌握从理论到实践的完整流程,提升激光系统调试与评估能力。

weixin_29083373的博客 450

ChannelOption

ChannelOption 的各种属性在套接字选项中都有对应。1、 ChannelOption.SO_BACKLOG ChannelOption.SO_BACKLOG 对应的是 tcp/ip 协议 listen 函数中的 backlog 参数, 函数 listen(int socketfd,int backlog)用来初始化服务端可连接队列, 服务端处理客户端连接请求是顺序处理的, 所以同一时间只能处理一个客户端连接, 多 个客户端来的时候, 服务端将不能处理的客户端连接请求放在队列中等待处理, backl

qq_31391225的博客 914

【Qt实战项目】记事本完整项目

效果图如下所示: 全部代码如下: #include “notepad.h” #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.showMaximized(); return a.exec(); }

YIZHILIUSHA2020的博客 575

Netty系列之Netty高性能之道

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。...

chongjubao8359的博客 540

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2308

android HTTPS未校验服务器证书漏洞修复

上述代码是重写了域名校验的逻辑,每个证书里携带的域名是不可更改的,如果证书是合法的证书签发机构签发的,并且域名是和你要请求的域名对的上的,基本上就能确认你访问就服务器地址就是要访问的服务器地址,这样才是安全的。上述代码就是重新了证书校验的逻辑,信任所有的证书,正确的逻辑是要校验证书是否是可信任的证书签发机构所认证的,如果不校验的话你虽然是用了https加密传输,只要你的客户端用户信任了其他的证书哪怕是非法的证书,一样能够请求通过,而这个证书的服务器就可以解密你的报文,拿到你的隐私信息了。

kyzycyey的专栏 2623

netty系列之ChannelOption

1、概述 在netty 启动的时候会设置相关的ChannelOption, 无论是在ServerBootstrap还是在Bootstrap, 接下来解释一下常用的ChannelOption 2、常用ChannelOption ChannelOption.SO_BACKLOG (一般用于option–>boss) BACKLOG用于构造服务端套接字ServerSocket对象,标识当服...

zhongzunfa的专栏 9441

网络可视媒体的智能计算-胡事民

本文为胡事民教授在山大做报告的笔记,现场见下图: 可视媒体是承载视觉信息的媒体类型,如图像、视频等,它具有网络化、海量和无序涌现等特征。 可视媒体计算的研究意义 可视媒体作为一种信息承载的介质,是用来表达语义信息的。那么就有一种介质与信息之间相互转化的问题。转化方向正反两种,举个栗子说明一下: 1. 可视媒体→→\rightarrow语义信息:比如看到画面,理解其中发生的事件、各主题之...

gdymind的博客 2451

redis zset怎么排序_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理

前言今天来说下Redis中hash、set、zset的底层数据结构原理!Redis-哈希对象(hash)hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小...

weixin_39969028的博客 1266

机器学习扩散模型简介

​ 扩散模型是生成模型,在过去几年中越来越受欢迎,这是有充分理由的。仅在 2020 年代发布的几篇开创性论文就向世界展示了 Diffusion 模型的能力,例如在图像合成方面击败 GAN[6]。最近,从业者将看到DALL-E 2(OpenAI 上个月发布的图像生成模型)中使用的扩散模型。

gongdiwudu的专栏 4265

基于 STM32 单片机的实验室多参数安全监测系统设计与实现

本系统以 STM32F103C8T6 单片机为核心,集成温湿度监测、烟雾检测、气体泄漏报警、人体移动监测等功能模块,通过 OLED 显示屏实时显示数据,并支持 Wi-Fi 远程传输。系统可对实验室异常环境参数(如高温、烟雾、燃气泄漏)及非法入侵实时报警,保障实验室安全。本文从硬件选型、电路设计到软件实现提供了完整的实验室安全监测系统方案,可根据实际需求调整传感器类型和通信方式,适用于科研、教学等场景的环境安全防护。:可增加继电器模块控制通风设备或切断电源,集成 ZigBee 组网实现多实验室联动监测。

weixin_42300449的博客 1285

redis zset怎么排序_hash、set、zset有多牛?从底层告诉你数据结构原理

前言今天来说下Redis中hash、set、zset的底层数据结构原理!Redis-哈希对象(hash)hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小...

weixin_39863017的博客 734

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...

前言今天来说下Redis中hash、set、zset的底层数据结构原理!Redis-哈希对象(hash)hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小...

weixin_33324435的博客 656

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

set列表对象去重_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理

前言今天来说下Redis中hash、set、zset的底层数据结构原理!Redis-哈希对象(hash)hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小...

weixin_33286939的博客 1689

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

set列表对象去重_hash、set、zset有多牛?从底层告诉你数据结构原理

前言今天来说下Redis中hash、set、zset的底层数据结构原理!Redis-哈希对象(hash)hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:hash对象保存的键和值字符串长度都小...

weixin_30925033的博客 167

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

面试必问 Redis 数据结构底层原理Hash、Set、ZSet

目录前言Hash 字典是什么为什么如何实现渐进式rehashSet 集合是什么为什么如何实现ZSet 有序集合是什么怎么实现为什么总结 前言 前面已经讲了面试必问 Redis 数据结构底层原理String、List篇; 链接如下: https://blog.youkuaiyun.com/abu935009066/article/details/110549742 redis版本:6.0.6 Hash 字典 是什么 听名称就知道很像Java中的HashMap,原理也有很多相似之处,但是Reids做了很多优化,Red.

laker的博客 2657

redis set 大量数据_面试必问 Redis数据结构底层原理Hash、Set、ZSet篇

点击关注上方“Java大厂面试官”,第一时间送达技术干货。阅读文本大概需要 8 分钟。前言前面已经讲了面试必问 Redis 数据结构底层原理String、List篇;链接如下:面试必问 Redis 数据结构底层原理String、List篇redis版本:6.0.6Hash 字典是什么听名称就知道很像Java中的HashMap,原理也有很多相似之处,但是Reids做了很多优化,Redis的...

weixin_42153801的博客 1227

Redis 的数据类型 + 底层实现:String、Hash、List、Set、ZSet

Redis数据类型及底层实现摘要 Redis提供五种基本数据类型:String、Hash、List、Set、ZSet,以及四种高级类型(BitMap、HyperLogLog、GEO、Stream)。每种类型采用不同的底层结构: String:动态字符串SDS,支持二进制安全、自动扩容 Hash:小数据用listpack(原ziplist),大数据用哈希表 List:3.2版本后统一为quicklist(双向链表+压缩列表组合) Set:整数且少量元素用intset,其他情况用哈希表 ZSet:小数据用lis

qq_49232751的博客 1624

从底层数据结构分析Redis的高效和稳定(String、List、Hash、Set、ZSet)

&nbsp; &nbsp; &nbsp; 本文内容思维导图如下: ...

郑清 4620

Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList

String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet

qq_44700578的博客 1880

Redis 数据结构底层原理图解:搞懂这篇,面试稳了

Redis数据类型操作及底层实现摘要 String类型提供SET、GET等基本键值操作,底层采用三种编码:int(整数存储)、embstr(短字符串连续存储)、raw(长字符串分开存储)。List类型支持双向操作,底层由QuickList实现(结合链表和压缩块优点),替代了早期的LinkedList和ZipList。Set类型提供集合运算,底层根据元素类型选择intset(整数集合)或hashtable实现。各数据类型针对不同场景优化了内存和性能,如String的embstr编码适合短字符串,QuickLi

2302_81116822的博客 1334

Redis五大基本数据类型(String、LIst、Set、Hash、ZSet)及其底层结构

String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个`key`对应一个`value`。 String类型是二进制安全的。意味着Redis的String可以包含任何数据。比如jpg图片或者序列化的对象。String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是`512M`...

我这么骄傲的一个人。 1639

【Redis】集合(Hash、List、Set、ZSet)的底层实现原理

Hash 与 ZSet **两种实现的选择** 控制台查询配置文件中的配置 zipList **head** **entries** end **listPack** **head** entries **skipList** **skipList 原理** **存在的问题** **算法优化** **quickList** 检索操作 **插入操作** **删除操作** **key 与 value 中元素的数量**

emmmm..... 1537

Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

Redis—列表List、集合Set、哈希Hash、有序集合 Zset列表List单键多值常用命令数据结构Redis 集合(Set)常用命令数据结构Redis 哈希(Hash)常用命令数据结构Redis 有序集合 Zset(sorted set)常用命令数据结构跳跃表(跳表) 列表List 单键多值 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差 常用命令

我们都是被分成两半的人,一边热爱生活,一边憎恨生活。面对生活,我们总是在矛盾的两端摇摆,在反复的矛盾和犹豫中,一边踉跄前行,一边重振旗鼓。我渴望改变,渴望变得更好,渴望找到出口……就像一个溺水人的挣扎,就像一个救生圈。我是一个矛盾集合体,想要变得快乐,但是 2745

Redis数据类型,Redis的底层数据结构,String, List(LinkedList,ZipList,QuickList),Set,ZSet,Hash(哈希表,压缩列表)

1、为了查询效率和唯一性,set采用的HT编码(Dict),Dict的key来存储元素,value统一为null。(3.2以后):LInkedList+ZipList,双端访问,内存占用低,包含多个ZipList,存储上限高。有交集和并集的功能,好友的共同关 注,保证元素的唯一,判断元素是否存在,内部同时有这两种,当元素不多的时候,优势不明显,浪费内存,因此会采用。可排序,分为score(值)值和member(键)值。:普通链表,可以双端访问,占用空间高,内存碎片多。:压缩链表,可以双端操作,内存占用低,

pangHu很菜 2万+
上一篇: 百万JAVA程序员最关注的问题:今年的“金九银十”还在吗?
下一篇: 牛逼哄哄的Spring是怎么被MyBatis给征服了
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值