Redis之数据结构

Xarray实战:从气象数据到可视化分析的完整流程(附Python代码) 本文详细介绍了使用Xarray库处理气象数据的完整实战流程。针对气象领域常见的NetCDF和GRIB格式,文章从数据读取、坐标操作、智能索引、统计计算到高级可视化,提供了完整的Python代码示例。重点阐述了Xarray如何高效处理高维标记数据,帮助地球科学领域的研究人员将繁琐的数据处理工作转化为高效的分析流水线。 阅读详情

前言


Redis 为什么那么快?

除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效地处理。

因此,这次我们就来好好聊一下 Redis 数据结构:String(字符串)对象、List(列表)对象、Hash(哈希)对象、Set(集合)对象和 Zset(有序集合)。

底层(3.0和3.2之后有变化)对应的分别是:SDS、双向链表、压缩列表、哈希表、跳表、整数集合、quicklist、listpack

特别说明下,void * key 和 void * value 指针指向的是 Redis 对象,Redis 中的每个对象都由 redisObject 结构表示,如下图:


对象结构里包含的成员变量:

type,标识该对象是什么类型的对象(String 对象、 List 对象、Hash 对象、Set 对象和 Zset 对象);

encoding,标识该对象使用了哪种底层的数据结构;

ptr,指向底层数据结构的指针


SDS


Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS) 的数据结构来表示字符串,也就是 Redis 的 String 数据类型的底层数据结构是 SDS。

C 语言字符串的缺陷

获取字符串长度的时间复杂度为 O(N),需要便利字符串数组个数得出长度。

字符串的结尾是以 “\0” 字符标识,字符串里面不能包含有 “\0” 字符,因此不能保存二进制数据;

字符串操作函数不高效且不安全,比如有缓冲区溢出的风险(无法预估改变后数据的大小是否会超出原始分配内存大小),有可能会造成程序运行终止

SDS 结构设计

下图就是 Redis 5.0 的 SDS 的数据结构:


结构中的每个成员变量分别介绍下:

len,记录了字符串长度。这样获取字符串长度的时候,只需要返回这个成员变量值就行,时间复杂度只需要 O(1)。

alloc,分配给字符数组的空间长度。这样在修改字符串的时候,可以通过 alloc - len 计算出剩余的空间大小,可以用来判断空间是否满足修改需求,如果不满足的话,就会自动将 SDS 的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用 SDS 既不需要手动修改 SDS 的空间大小,也不会出现前面所说的缓冲区溢出的问题。

flags,用来表示不同类型的 SDS。一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64,后面再说明区别之处。

buf[],字符数组,用来保存实际数据。不仅可以保存字符串,也可以保存二进制数据。

总的来说,Redis 的 SDS 结构在原本字符数组之上,增加了三个元数据:len、alloc、flags,用来解决 C 语言字符串的缺陷。

SDS 结构中有个 flags 成员变量,表示的是 SDS 类型。

Redis 一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64。

这 5 种类型的主要区别就在于,它们数据结构中的 len 和 alloc 成员变量的数据类型不同

比如 sdshdr16 和 sd

Unity中使用TCP和UDP传输摄像头视频的实践 本文探讨了在Unity中通过TCP和UDP协议传输摄像头视频的实现方法。TCP通过自定义消息帧保证数据完整性但效率较低,UDP传输速度快但可能丢帧。文章提供了Python和Unity的代码示例,分析了两种协议的适用场景:TCP适合要求数据完整性的应用,UDP则适合追求实时性的场景。最终选择取决于具体需求,并需要注意线程安全与同步机制。 阅读详情

相关推荐

pycharm一直选择不了conda正确路径弹框报错:latinit property envs_dirs has not been initialized...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2638

Redis数据结构

命令学习可以使用 在线redis环境。 数据类型 Redis 比较常见的数据结构有 string、list、hash、set、sorted set 等,但是 Redis 还有比较高级的3种数据结构:HyperLogLog、Geo、BloomFilter。 String(字符串) String 是 Redis 最简单最常用的数据结构,也是 Memcached 唯一的数据结构。在平时的开发中,String 可以说是使用最频繁的了。 底层实现: 如果一个字符串对象保存的是整数值, 并且这个整数值可以用 long

makersy的博客 1万+

AutosarMCAL开发——基于EB MCU驱动

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 893

Redis 数据结构

而设计的一种顺序存储结构,本质上就是一块连续的内存区域,用来存放多个数据节点它主要用于存储:小的 list (列表)小的 hash (哈希)小的 sorted set (有序集合)当数据量小、元素小的时候,Redis 会用 ziplist 来存,节省内存开销。

2401_87046050的博客 1254

Redis之底层数据结构

Redis底层数据结构解析:Redis的性能得益于其高效的数据结构设计。String类型根据值大小分为int、embstr、raw三种存储方式;Hash类型在Redis6.x使用ziplist+hashtable,Redis7.x改用更优的listpack+hashtable。ziplist通过连续内存存储提升寻址效率,但存在连锁更新问题;listpack作为其改进版,在保持优势的同时解决了这一问题。不同类型根据配置阈值自动选择最优存储结构,体现了Redis在内存使用和性能上的极致优化。

qq_44784918的博客 1328

Redis的底层数据结构

目录 引言 Redis底层数据结构 1.SDS(Simple Dynamic String) 2.链表(list) 3.字典(dict) 4.跳跃表(zskiplist) 5.整数集合(intset) 6.压缩列表(ziplist) 7.快表(quicklist) 小结 引言 Redis是目前非常火热的一个非关系型数据库,它内置的数据类型一共有5种,string,li...

yan245294305的博客 994

Redis07 - Redis底层数据结构

Redis07 - Redis底层数据结构

qq_43350524的博客 1488

Redis数据结构的最佳实践

本文介绍了Redis的核心数据结构与内部实现机制。首先概述了Redis的无传统关系型数据库Table模型,采用key作为顶层命名空间,支持string、list、set等数据类型。重点分析了redisObject通用结构和SDS动态字符串实现,包括内存分配、扩容策略等优化细节。文章详细讲解了String类型的操作命令及其复杂度,如set/get、incr/decr、批量操作等,并给出实际应用场景如分布式ID生成器。最后总结了单线程设计的高效原理,包括纯内存操作、非阻塞I/O等特性,解释了Redis高性能的关

JavaEdge全是干货的技术号 3024

Redis 数据结构全览

Redis 数据结构全览

1174

Redis 常见数据结构及命令

Redis支持多种数据结构,包括字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。 字符串(string):字符串是Redis中最基本的数据结构,可以存储任意类型的数据,包括文本、数字等。 哈希(hash):哈希是一种键值对的集合,可以存储多个字段和对应的值,每个字段和值之间是一对一的关系。 列表(list):列表是一个按照插入顺序排序的字符串元素集合,可以在列表的两端进行元素的插入和删除操作,支持对列表进行范围检索。 ... ...

luming的博客 2649

Redis底层数据结构(详细篇)

redis主要的底层数据结构

kingandsong的博客 4855

Spring Boot 全局异常处理最简方案:3 个文件干掉 500 白屏

*** 业务异常: 在 Service / Controller 里 throw new ApiException ("xxx不存在")* GlobalExceptionHandler 会捕获它, 返回清晰的错误 JSON*/@Gettersuper(msg);super(msg);

xnian_的博客 226

Spring Boot 4 旅游主题实战教程 阶段一:Spring Boot 入门基础

本阶段为 Spring Boot 基础入门。第1章从零创建项目并编写首个 REST 接口,建立 starter 与自动装配的初步认知;第2章深入 IoC 与依赖注入,理解容器如何管理 Bean 及其作用域、生命周期;第3章学习配置文件与多环境,掌握 YAML 语法、@Value 与 @ConfigurationProperties 读配置,并用 profile 实现开发/生产环境一键切换,使参数与代码解耦。

桃李不言下自成蹊 394

Spring Boot 集成 ShardingSphere 实战:分片策略、全局 ID 与跨库查询避坑指南

<think>我们正好被截断了。用户要求根据“以下内容”生成≤150字的文章摘要。但内容被截断了,只到“事务内可以用 ”。不过整体内容已经够多了,可以基于已有内容概括。需要生成摘要,不超过150字。注意是“文章摘要”,应概括主要内容和要点。基于描述,这是关于ShardingSphere-JDBC分库分表实践。摘要应涵盖:单库瓶颈触发分库分表、ShardingSphere配置、分片算法、分布式ID、读写分离一致性等。语言简洁。 因为用户的指令是“根据以下内容,生成≤150字的文章摘要”,我们输出摘要即可。 确

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 254

Spring Boot 入门 与 无法解析符号 springframework 的解决

###3标签的作用标签中定义了项目需要的所有依赖。以下是图片中看到的两个关键依赖:#####1. Spring Boot Web 起步依赖作用: * 提供 Web 开发相关的所有功能,如 Spring MVC 和嵌入式 Tomcat。* 这是一个“起步依赖”,意味着它会自动引入所需的子依赖。

2601_96205623的博客 192

Apache Cassandra 介绍与 Spring Boot 集成实战

Apache Cassandra 是一个开源、分布式、去中心化的 NoSQL 数据库,最早由 Facebook 开发,后捐赠给 Apache 基金会。它专为海量数据的高可用、高扩展场景而设计。Cassandra 是一款为"大规模、高写入、高可用"而生的分布式数据库,理解它的分区与主键设计思路是上手的关键。Spring Data Cassandra 提供了与 Spring Data JPA 相似的开发体验——配置连接、写实体、继承 Repository,业务代码几乎不需要接触原生 Driver。

wangchunyu114的博客 241

Spring Boot 4 + Thymeleaf 电商主题实战 阶段三:表单、布局与页面复用

本阶段聚焦完整 Web 页面的构建与复用。通过 th:field 实现表单双向绑定,结合后端校验规范处理用户输入;运用布局与片段进阶技巧提升页面模块化与可维护性;并掌握 #dates、#numbers 等内置工具对象,在模板中便捷完成日期格式化、数值处理等常见转换。学完即可独立开发结构清晰、交互完整的业务页面。

桃李不言下自成蹊 511

Spring Boot 集成 Spring Session:分布式会话管理与多端状态同步实战

把 Session 扔进 Redis 只是第一步,真正能上生产的会话中心,得把序列化体积、连接池水位、设备指纹绑定、并发踢人逻辑、降级预案全部跑通。Spring Session 提供的抽象足够好用,但别当黑盒用,底层 Key 怎么存的、过期怎么清的、集群事件怎么丢的,心里得有本账。架构选型从来不是非黑即白。高并发读走 JWT 无状态,强管控走 Session 有状态,网关层做路由收敛。把 TTL 卡准、内存控住、安全策略焊死,这套东西就能稳稳扛住线上流量。剩下的,就是日常盯监控、压瓶颈、修边角的活儿了。

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 297

Redis 介绍与 Spring Boot 实战入门

要点建议序列化生产环境一定要自定义 RedisTemplate 序列化,避免 JDK 默认乱码key 命名统一业务:类型:id风格,加业务前缀防止冲突TTL缓存数据务必设置过期时间,防止脏数据 + 内存膨胀缓存穿透空值也缓存 + 布隆过滤器缓存击穿热点 key 加互斥锁或逻辑过期缓存雪崩过期时间加随机抖动,避免同时大面积失效数据类型选择按场景选类型,如对象用 Hash、榜单用 ZSet、队列用 List分布式锁用原子组合,释放时校验 value 防止误删。

wangchunyu114的博客 607

Spring Boot Thymeleaf中使用Shiro标签

在《Spring-Boot-shiro权限控制》中,当用户访问没有权限的资源时,我们采取的做法是跳转到403页面,但在实际项目中更为常见的做法是只显示当前用户拥有访问权限的资源链接。配合Thymeleaf中的Shiro标签可以很简单的实现这个目标。实际上Thymeleaf官方并没有提供Shiro的标签,我们需要引入第三方实现,地址为。

wno704的博客 329

Java八股文之Spring Boot 中解决 MySQL 和 Elasticsearch (ES) 的数据一致性问题

Java八股文之Spring Boot 中解决 MySQL 和 Elasticsearch (ES) 的数据一致性问题

Meta39的博客 357

Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)

3.Set类型操作演示: @GetMapping(“/testSet”) @ResponseBody public String testSet() { redisTemplate.opsForSet().add(“key”, “aaa”, “bbb”, “ccc”);

2601_96217730的博客 201

oracle使用经验

NULL博文链接:https://haidaohudie123-126-com.iteye.com/blog/1717360

2025广东省道路路网矢量数据图层Shp数据最新版下载

2025广东省道路路网矢量数据图层,shp格式,包含多级道路分类属性,路名等属性,包含全省几十万条道路,坐标系为WGS1984坐标系统

上一篇: 如何抓住重点,系统高效地学习数据结构与算法?
下一篇: 深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理
苹果酱0567
博客等级 码龄2年 3039粉丝 475原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值