redis内、外部数据结构大揭秘

Tesla V100 在 Windows 下的驱动选择与模式切换实战 本文详细解析了Tesla V100专业计算卡在Windows系统下的驱动安装与模式切换实战。针对设备管理器识别但任务管理器“隐身”的常见问题,文章指出其默认TCC模式为纯计算设计,并指导用户正确选择数据中心或GRID驱动。核心在于通过注册表修改或驱动选择,在高效的TCC模式与便于监控的WDDM模式间切换,同时提供了nvidia-smi命令行监控与AI框架测试等稳定使用方案。 阅读详情

1.Redis有哪些数据结构?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

很多人面试时都遇到过这种场景吧?

其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo。

可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。

1. 如何查看redis的数据结构?

1.1 如何查看redis的外部数据结构?

可以使用type命令,返回key的类型,如string, list, set, zset, hash 和stream,实例如下:


 
redis> SET key1 "value" "OK" redis> LPUSH key2 "value" (integer) 1 redis> SADD key3 "value" (integer) 1 redis> TYPE key1 "string" redis> TYPE key2 "list" redis> TYPE key3 "set" redis> 

1.2 如何查看redis的内部数据结构

可以通过Object命令来查看。object命令允许从内部察看给定 key 的 Redis 对象。

它通常用在除错(debugging)或者了解为了节省空间而对 key 使用特殊编码的情况。

当将Redis用作缓存程序时,你也可以通过它命令中的信息,决定 key 的驱逐策略(eviction policies)。

2.redis数据结构的定义redisObject

内部数据类型server.h


 
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (least significant 8 bits frequency * and most significant 16 bits access time). */ int refcount; void *ptr; } robj; 

其中,type为redis的外部数据结构,encoding为redis的内部数据结构实现

type的值如下:


 
/*----------------------------------------------------------------------------- * Data types *----------------------------------------------------------------------------*/ /* A redis object, that is a type able to hold a string / list / set */ /* The actual Redis Object */ #define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */ /* The "module" object type is a special one that signals that the object * is one directly managed by a Redis module. In this case the value points * to a moduleValue struct, which contains the object value (which is only * handled by the module itself) and the RedisModuleType struct which lists * function pointers in order to serialize, deserialize, AOF-rewrite and * free the object. * * Inside the RDB file, module types are encoded as OBJ_MODULE followed * by a 64 bit module type ID, which has a 54 bits module-specific signature * in order to dispatch the loading to the right module, plus a 10 bits * encoding version. */ #define OBJ_MODULE 5 /* Module object. */ #define OBJ_STREAM 6 /* Stream object. */ 

encoding的值如下:server.h


 
/* Objects encoding. Some kind of objects like Strings and Hashes can be * internally represented in multiple ways. The 'encoding' field of the object * is set to one of this fields for this object. */ #define OBJ_ENCODING_RAW 0 /* Raw representation */ #define OBJ_ENCODING_INT 1 /* Encoded as integer */ #define OBJ_ENCODING_HT 2 /* Encoded as hash table */ #define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */ #define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */ #define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */ #define OBJ_ENCODING_INTSET 6 /* Encoded as intset */ #define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */ #define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */ #define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */ #define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */ 

内部类型总结

 

3.数据结构的限制server.h


 
/* Zipped structures related defaults */ #define OBJ_HASH_MAX_ZIPLIST_ENTRIES 512 #define OBJ_HASH_MAX_ZIPLIST_VALUE 64 #define OBJ_SET_MAX_INTSET_ENTRIES 512 #define OBJ_ZSET_MAX_ZIPLIST_ENTRIES 128 #define OBJ_ZSET_MAX_ZIPLIST_VALUE 64 #define OBJ_STREAM_NODE_MAX_BYTES 4096 #define OBJ_STREAM_NODE_MAX_ENTRIES 100 /* HyperLogLog defines */ #define CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES 3000 

4.实例

4.1 字符串String

int :8个字节的长整型

embstr:小于44个字节的字符串(目前),3.0以前的版本为39

raw:大于39个字节小于512MB的字符串

object.c


 
/* Create a string object with EMBSTR encoding if it is smaller than * OBJ_ENCODING_EMBSTR_SIZE_LIMIT, otherwise the RAW encoding is * used. * * The current limit of 44 is chosen so that the biggest string object * we allocate as EMBSTR will still fit into the 64 byte arena of jemalloc. */ #define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44 

验证一下:


 
Connected. local:0>object encoding test1 "int" local:0>object encoding test2 "embstr" local:0>object encoding test3 "raw" local:0>get test1 "10000" local:0>get test2 "hello world!" local:0>get test3 "Redis is not a plain key-value store, it is actually a data structures server, supporting different kinds of values. What this means is that, while in traditional key-value stores you associated string keys to string values, in Redis the value is not limited to a simple string, but can also hold more complex data structures. The following is the list of all the data structures supported by Redis, which will be covered separately in this tutorial:" local:0> 

4.2 哈希hash

当filed的个数少于512,且没有value大于64字节时,内部编码为ziplist

当filed的个数大于512,或者value大于64字节时,内部编码为hashtable


 
Connected. local:0>hmset hashtest1 field1 value1 field2 value2 field3 value3 "OK" local:0>object encoding hashtest1 "ziplist" local:0>hset hashtest2 field1 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly." "1" local:0>object encoding hashtest2 "hashtable" local:0> 

4.3 列表list

redis 3.2 之前

当列表list中的元素个数少于512,且没有value大于64字节时,内部编码为ziplist

当列表list中的元素个数大于512,或者value大于64字节时,内部编码为linkedlist

redis 3.2 之后

都使用quicklist


 
Connected. local:0>rpush listtest1 value1 value2 value3 value4 value5 "5" local:0>object encoding listtest1 "quicklist" local:0>rpush listtest2 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly." "1" local:0>object encoding listtest2 "quicklist" local:0> 

4.4 集合set

当集合set中的元素都是整数且元素个数小于512(默认时)使用intset

其它条件使用hashtable


 
local:0>sadd settest1 1 2 3 "3" local:0>object encoding settest1 "intset" local:0>sadd settest2 "hello world!" "1" local:0>object encoding settest2 "hashtable" local:0> 

4.5 有序集合zset

当有序集合zse中的元素个数少于128(默认),且没有value大于64字节时,内部编码为ziplist

当有序集合zse中的元素个数大于128(默认),或者value大于64字节时,内部编码为skiplist


 
Connected. local:0>zadd zsettest1 10 value1 20 value2 30 value3 "3" local:0>object encoding zsettest1 "ziplist" local:0>zadd zsettest2 60 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly." "1" local:0>object encoding zsettest2 "skiplist" local:0> 

4.6 Geo


 
Connected. local:0>GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" "2" local:0>object encoding Sicily "ziplist" local:0 

4.7 HyperLogLog


 
Connected. local:0>PFADD hll a b c d e f g "1" local:0>object encoding h11 null local:0>object encoding hll "raw" local:0> 

5.总结

  1. 外部数据结构类型可以通过type来查看
  2. 内部数据结构类型可以通过object来查看
  3. 理解内部数据结构的实现有助于我们深入理解redis
  4. 可以复习一下数据结构及其实现
任务混部最少服务器数量计算问题 这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。 阅读详情

相关推荐

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

你真的懂了redis的数据结构吗?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34124577的博客 117

CUDA 12.1环境下的动态库链接修复:从libcusparse.so.12的undefined symbol错误到libnvJitLink.so.12的正确加载

本文详细解析了在CUDA 12.1环境下,PyTorch因libcusparse.so.12找不到libnvJitLink.so.12中的__nvJitLinkAddData_12_1符号而报错的根本原因。通过诊断动态链接过程,提供了创建符号链接、修改环境变量等三种解决方案,并深入探讨了nvJitLink组件的作用及环境配置的最佳实践,帮助开发者彻底解决此类动态库链接问题。

c8d9e0f1的博客 206

Redis与Java - 数据结构

Redis与Java 标签 : Java与NoSQL Redis(REmote DIctionary Server) is an open source (BSD licensed), in-memory data structure store, used as database, cache and message broker. It supports data struct...

dawuafang 389

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search

大模型推理采样策略,举例通俗易懂汇总介绍

qq_43243579的博客 2万+

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8290

如何给redis添加新数据结构

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33716557的博客 1482

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1690

Rust+Tauri+Vue打造10MB级轻量API调试工具

API调试工具是开发者日常高频使用的基础设施,其核心诉求在于启动快、响应稳、资源省。传统基于Electron的方案常因Chromium引擎臃肿导致启动延迟高、内存占用大、交互卡顿;而Rust凭借零成本抽象与确定性执行,结合Tauri的系统级WebView集成和Vue的高效声明式UI,可构建出冷启动<1秒、二进制仅10MB的极致轻量工具。该技术路径不仅显著提升单次请求的端到端确定性延迟,更在桌面端实现开发效率与运行时性能的平衡。适用于前端联调、运维排查、教学实验等强调‘开箱即用’与‘不打扰’体验的场景,代表了

weixin_34060741的博客 473

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1024

redis原理-对象以及命令解析与执行

redis原理-对象以及命令解析与执行 一、  redis对象 适用场景: redis是使用对象来存放数据的,基于前面的几种数据结构创建对象。 原理解释: redis对象类型有下面5种:    /*Object types */ #define REDIS_STRING 0  #define REDIS_LIST 1 #define REDIS_SET 2 #define R

webrtc 7471

android 9.0Settings休眠时间项(屏幕超时)添加永不休眠功能

在9.0的系统产品开发中,系统中默认息屏时间为1分钟,可以通过在Setting中的息屏时间选项设置对应的息屏时间,但是在开发平板类的产品中,需要实现永不休眠的功能,所以需要在Settings中的息屏时间中添加永不休眠时间这一项来实现这个功能,接下来看息屏时间的相关功能,来添加这个功能

安卓兼职framework和app工程师的博客 2056

你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘

你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘 原文:你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 很多人面试时都遇到过这种场景吧? 其实除了上面的几种常见数据结构,...

weixin_30763455的博客 104

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

redis数据结构_你真的懂redis的数据结构了吗?redis内部数据和外部数据结构揭秘...

Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面试时都遇到过这种场景吧?其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo、Bitmap。可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。1. 如何查看redis的数据结...

weixin_29574585的博客 167

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

redis内部数据结构和外部数据结构揭秘

Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 很多人面试时都遇到过这种场景吧? 其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo。 可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。 1. 如何查看redis的...

weixin_34417635的博客 153

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

redis zse如何取值_你真的懂redis的數據結構了嗎?redis內部數據結構和外部數據結構揭秘...

Redis有哪些數據結構?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面試時都遇到過這種場景吧?其實除了上面的幾種常見數據結構,還需要加上數據結構HyperLogLog、Geo。可是很多人不知道redis 不僅有上面的幾種數據結構,還內藏了內部的數據結構。即redis可以分為外部數據結構和內部數據結構。1. 如何查看redis的數據結構?1.1 如...

weixin_28842367的博客 113

你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘

Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 很多人面试时都遇到过这种场景吧? 其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo。 可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。 (想自学习编程的小伙伴请搜索圈T社...

wanghao112956的博客 139

有效数据包含外部数据_你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘...

Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面试时都遇到过这种场景吧?其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo。可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。1. 如何查看redis的数据结构?1.1 如...

weixin_39889642的博客 191

有效数据包含外部数据_你真的懂redis的数据结构了吗?redis内部数据和外部数据结构揭秘...

Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面试时都遇到过这种场景吧?其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo、Bitmap。可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。1. 如何查看redis的数据结...

weixin_39647773的博客 232

redis数据结构_你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘...

Redis有哪些数据结构?字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。很多人面试时都遇到过这种场景吧?其实除了上面的几种常见数据结构,还需要加上数据结构HyperLogLog、Geo。可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。1. 如何查看redis的数据结构?1.1 如...

weixin_33503998的博客 164

redis 批量删除_Redis入门基础

关注【搜狐技术产品】,第一时间获取技术干货作者丨大个女摘要:如果你是第一次开始要使用redis,那么请阅读该篇文章。该篇文章系统性的介绍redis的特点及常见使用场景,通过实际操作着重介绍了String、Set、Hash、SortedSet、List常见数据结构命令的使用,以及在实际开发中如何更好更高效的使用redis。概述 Redis是一个开源的、基于内存的结构化存储媒介,可用作数据库、缓存、...

weixin_39974932的博客 736
上一篇: Spring 为啥默认把bean设计成单例的?
下一篇: JAVA三种遍历机制的性能比较
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值