Redis----数据结构

Redis之数据结构 Redis 为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效地处理。因此,这次我们就来好好聊一下 Redis 数据结构:String(字符串)对象、List(列表)对象、Hash(哈希)对象、Set(集合)对象和 Zset(有序集合)。底层(3.0和3.2之后有变化)对应的分别是:SDS、双向链表、压缩列表、哈希表、跳表、整数集合、quicklist、listpack。 阅读详情

一.认识Redis

什么是Redis

一款基于内存的非关系型数据库,对数据的读写操作都是在内存中完成的,具有高性能 高并发的特点,可以用来作为缓存降低mysql数据库的压力,还可以用来做分布式锁 以及轻量级消息队列等

与Memcached的区别

具备许多Memcached不具备的功能,多种可满足不同需求的数据类型,数据持久化,原生集群

为什么用 Redis 作为 MySQL 的缓存

Redis具有高性能与高并发的特性 可以提前将部分MySql中存储的数据存储到 Redis中 进行数据访问时直接访问Redis即可 即使在高并发的场景下也可以做到较 快的响应速度 避免大量请求直接访问MySql导致服务宕机

二.Redis中的数据结构

Redis具有哪些基础数据结构

Redis具有七种基础数据结构,其中六种基本数据结构以及RedisObject,Redis中的所有数据类型都封装在RedisObject中

SDS动态字符串

Redis是利用C语言开发的 由于c语言原生的字符串具有非二进制安全,不可修改等缺点,构建了全新的字符串结构 SDS动态字符串

SDS实际是C语言中的结构体 分为Header与 字符串数组两部分 实际数据保存在字 符数组中Header中保存 字符串已经占用的字节数 申请的总字节数 SDS类型(控 制可保存数据的上限) 通过头信息可以可以直接得知数组长度无需再受'\0'的影响 还具有 动态扩容的能力 解决了c语言原生字符串 不可修改 二进制安全等问题

动态扩容: 当SDS申请的空间不足以容纳要添加的新字符串时则会申请新的内存空间 根据 新字符串的大小还会有不同的申请方式(小于1M 新字符串长度2倍+1 大于1M 新字符串长度+1M+1)

IntSet 整数数组

InSet结构体 encoding编码方式决定存放整数大小范围 length记录存放元素个数 contents指针 指向实际数组起始地址 长度可变 有序

编码升级:当即将添加的元素超过了当前编码方式每个元素可表示的范围,就会发生编码升级,每个元素占用的字节数会改变,按新的编码方式进行数组扩容,倒序将数组中的旧元素拷贝到正确位置(正序拷贝会覆盖原数据),将待添加的元素添加到末尾 最后更改结构体中的encoding(编码方式) 以及length

Inset的元素是唯一有序的,具备升级机制,当元素小时采用占用内存空间小的编码方式元素过大时才会升级编码节省内存空间,底层采用二分查找查询元素,不适合存储大量数据,数据量大查询效率低 且InSet申请的是连续内存空间 数据量大时不便申请较大的连续内存空间

Dict字典(数组+单向链表)

Dict内部维护了一个指向哈希表数组的指针,实际数据都存储在哈希表数组的元素DictEntry中,每个节点都包含key value next(哈希冲突时 升级成链表),内部有两张哈希表,一张用于存储现有数据另一张用于rehash

Rehash:当负载因子(哈希数组长度/已存储元素) >=1,表示hash数组已存满,再存储数据必然会出现哈希冲突升级为链表,避免链表出现,链表过长影响存储性能,则需要进行rehash;rehash的时机: Redis本身没有进行需要消耗算力资源的后台进程例 如 BGSAVE(异步RDB持久化) BGREWRITEAOF(AOF重写)或负载因子大于5 直接扩容;当删除元素时,检查负载因子,负载因子<0.1时 哈希表收缩

渐进式rehash: 当哈希表负载因子超过阈值时,会分配一个更大的新哈希表 ht[1],并设置 rehashidx=0标记迁移起点;随后在每次数据访问时,Redis 会顺带将 ht[0] 中 rehashidx 位置的键值对迁移到 ht[1],并递增rehashidx,同时新数据直接写入 ht[1](如果有数据写入操作);当所有数据迁移完成后,释放 ht[0] 并将 ht[1] 设为新的主表,完成平滑扩容或缩容。避免因扩容造成阻塞,Redis对底层数据结构优化的代表性实例。

Dict字典,底层利用hash表存储数据,精确查询性能好,但会产生内存碎片,且内部维护了较多指针,指针本身会占据较多内存空间

ZipList压缩链表

便于首尾操作:每个元素占用空间不定需要多少占多少节省内存,连续内存空间 头部维护了几个变量分别记录了当前ZipList占用的总内存空间,尾偏移量记录尾节点距离其实地址有多少字节,可以确定尾节点地址;由于头部变量占用的字节数固定,且记录了链表总占用内存空间,以及尾偏移量记录了起始到最后一个起点起始之间的空间,所以可以方便的得出第一个元素与最后一 个元素的地址,便于头尾操作

Entry内部结构: previous 记录前一个节点的总长度 encoding编码属性 记录 contents的数据类型(字符串或整数) 以及contents的长度 contents 节点保存的数据;既不满足数组遍历规律也不满足链表遍历规律,通过记录每个节点的长度遍历

缺点: 连续内存空间不便于存储大量数据,随机读取性能差,存在连锁更新问题

连锁更新: 若一个ZipList中保存了N个连续的长度为250~253字节的entry其长度,刚好不超过254 则每个entry只需要1字节记录上一个entry的长度,假如此时在第一个entry前插入了一个,长度大于等于254字节的元素,那么此时该entry的长度用1字节就无法表示,需要用5 字节表示,那么下一个entry的pre就由1字节变更为5字节,那么其本身的长度也会增大,表示其长度也需要5字节,就导致了联锁反应,之后的每个entry都需要改变其占用的内存空间,导致频繁的产生内存的申请销毁数据迁移

QuickList(双端链表,每个节点都是一个ZipList)

解决ZipList无法保存大量数据的问题,数据分片思想

ZipList虽然节省内存,但其申请的内存必须是连续空间,若其需要存储较大的数据量,则需要一大块连续的内存空间,而内存往往是分散、碎片化的,申请大块连续内存的效率很低

双端链表,QuickList每个节点都是一个ZipList,将数据分片储存在单个ZipList当中,解决了ZipList难以存储大量数据的缺点

QuickList: 节省内存,但每个节点占用的内存空间无法确定,无法随机访问只能顺序遍历或倒序遍历,不具备随机读取的能力;QuickList可以对节点ZipList进行压缩由于首位访问需求大,首位不压缩,压缩中间部分进一步节省内存

SkipList跳表

建立多级指针,指针跨度不同 牺牲存储空间 换取随机读写能力

SkipList首先是链表,但与传统链表不同,建立了多层指针,不同层指针跨度不同,通过建立多级指针,以牺牲部分存储空间为代价,换取随机读写能力较大的提升

RedisObject

Redis中所有数据类型都被封装在RedisObject中,也叫Redis对象

3个国产AI大模型实战:如何用DeepSeek+豆包+千问批量生成高质量测试用例(附完整代码) 本文详细介绍了如何利用DeepSeek、豆包和千问三大国产AI大模型批量生成高质量测试用例的实战方法。通过Python环境配置、多模型SDK安装和统一接口封装,实现高效测试用例生成,并结合结构化提示词设计和多模型结果对比分析,显著提升测试效率和覆盖率。 阅读详情

相关推荐

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string

rocketmq JSONException: not close json text, token : string 问题解决

qq_21067307的博客 5573

为了拿捏 Redis 数据结构,我画了 40 张图(完整版)

大家好,我是小林。 Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。 因此,这次我们就来好好聊一下 Redis 数据结构,这个在面试中太常问了。 注意,Redis 数据结构并不是指 String(字符串)对象、List(列表)对象、Hash(哈希)对象、Set(集合)对象和 Zset(有序集合)对象,因为这些是 Redis 键值对中值的数据类型,也就是数据的保存形式,这些对象的底

小林coding 1万+

数字信号的艺术演绎:用FPGA+DAC实现音乐合成器的核心原理

本文深入探讨了如何利用FPGA和DAC技术实现数字音乐合成器的核心原理,涵盖DDS架构、多波形合成、MIDI协议解析及动态包络控制等关键技术。通过详细的Verilog代码示例和硬件实现方案,展示了数字信号处理在音乐合成中的艺术演绎,为电子音乐创作提供了强大的硬件支持。

weixin_28256233的博客 390

最详细的Redis底层数据结构全面详解

因此Redis构建了一种新的字符串结构,称为(Simple DynamicString),简称那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含jack”的SDS。

Gaomengsuanjia_的博客 2719

高效静音黑科技 —— 单相直流无刷电机驱动器

然而,传统的BLDC电机驱动通常依赖于三相架构,电路复杂,成本高昂,且在低功率应用中显得有些“大材小用”。单相直流无刷电机驱动器作为一项高效、静音、经济的技术,正逐渐改变着各个领域的电机驱动方式。其精巧的控制策略、显著的优势以及广阔的应用前景,都预示着这项技术将在未来扮演越来越重要的角色。它相较于传统的三相驱动,显著简化了电路结构,降低了成本,尤其适用于低功率、对静音要求极高的应用场景。通过这些模块的协同工作,单相直流无刷电机驱动器能够实现对电机速度、扭矩的精确控制,并最大程度地降低噪声和振动。

wen8789的博客 1766

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 461

你真的懂Redis的5种基本数据结构吗?

一、简介 Redis中所有的的数据结构都是通过一个唯一的字符串key来获取相应的value数据。 Redis有5种基础数据结构,分别是: string(字符串) list(列表) hash(字典) set(集合) zset(有序集合) 其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则: create if not exists:容器不存在则创建 drop if no elements:如果容器中没有元素,则立即删除容器,释放内存 本文将详细讲述

Yuki1127918的博客 3879

Blender----利用DEM(tif)生成三维模型

利用DEM(tif)生成三维模型

LongJ_Sir的博客 5428

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

本章主要内容 简单介绍redis redis中的五种数据结构分析 应用场景分析 总结   关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处...

xpsallwell的专栏 5万+

别再手动切换了!用SP3485+三极管搞定RS485自动收发电路(附完整原理图)

本文详细介绍了如何利用SP3485芯片和三极管设计RS485自动收发电路,解决传统手动切换带来的IO资源占用和软件复杂度问题。通过原理分析、电路设计拆解和实战注意事项,帮助工程师打造稳定可靠的自动收发通信模块,显著提升系统性能和可靠性。

weixin_26833939的博客 514

传感器:MQ-5燃气模块测量燃气值(底部附代码)

本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1

Mr_zhang1911116的博客 1万+

Redis基本结构体分析

  &lt;span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"&gt;Redis基础数据结构的实现分为5种: 字符串; 普通双向链表; hash字典; 压缩链表; 压缩图&lt;/span&gt;   一、字符串 redis内部对字符串处理相关集合进行了...

325

uniapp - 详解使用高德地图在地图上实现绘制边界/点聚合/行政区域高亮等功能,Uniapp高德地图点聚合标记及绘制点线面示例代码(全端兼容H5网页、小程序、安卓app、苹果app、nvue)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,高德地图,uniAPP高德地图实现点聚合,地图区域描边、点标记、点信息详情弹窗,实现绘制边界区域,uniapp H5使用高德地图实现点聚合、行政区域高亮,实现高德地图的marker聚合功能,高德地图进行marker标点,点信息展示,点击标记点弹出对话框,点击聚合点后显示信息模态框,打标点,【Uniapp】高德地图的接入自定义标点与信息窗体使用,绘制行政区域边界,绘制多边形,电子围栏,高德行政区划边界,

✅ 精选推荐文章 1万+

Redis数据结构

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

makersy的博客 1万+

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis07 - Redis底层数据结构

Redis07 - Redis底层数据结构

qq_43350524的博客 1557

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Redis 数据结构

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

2401_87046050的博客 1259

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis之底层数据结构

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

qq_44784918的博客 1340

Redis的底层数据结构

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

yan245294305的博客 996

Redis原理篇 之数据结构

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

weixin_49429082的博客 1390

Redis数据结构的最佳实践

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

JavaEdge全是干货的技术号 3049

Redis 数据结构全览

Redis 数据结构全览

1182

redis:redis的底层数据结构

一提到redis,我们就会想到“快"。那redis的快到底是快在哪里呢?实际上,这里有一个重要的表现:它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。 为什么redis能有这么突出的表现呢? 一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快 另一方面,这要归功于它的数据结构。这是因为,键值对是按照一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是redis快速处理的基础。 redis中的数据结构有两种意思:

OceanStar的博客 1万+

Redis 常见数据结构及命令

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

luming的博客 2677

【2024最新版,redis7】redis底层的10种数据结构

前言:本文redis版本:7.2.4 本文语雀原文地址(首发更新):https://www.yuque.com/wzzz/redis/xg2cp37kx1s4726y 本文优快云转载地址: https://blog.youkuaiyun.com/u013625306/article/details/136842107Redis常见的数据结构有5种: String,List, Set, ZSet, Hash,这只是对外的数据结构 Redis对内的底层数据结构具体实现方法还有如下几种:int, raw, embstr,

u013625306的博客 2529

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

redis主要的底层数据结构

kingandsong的博客 4888

Redis的数据结构

Redis 的数据结构是其高性能和灵活性的重要基础。每种数据结构都针对不同的场景和需求设计,了解每种结构的细节能帮助我们更好地使用 Redis。

yymagicer的博客 1038
上一篇: 二叉树----4.对称二叉树
下一篇: 二叉树----5.二叉树的直径
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值