Redis底层数据结构.md

2023-11-16

1.Redis 概述

Redis 数据库里面的每个键值对(key-value) 都是由对象(object)组成的:
数据库键总是一个字符串对象(string object);
数据库的值则可以是字符串对象、列表对象(list)、哈希对象(hash)、集合对象(set)、有序集合(sort set)对象这五种对象中的其中一种。

2.Redis 底层数据结构

有以下数据类型:
简单动态字符串(SDS), 链表, 字典, 跳跃表, 整数集合, 压缩列表

2.1 SDS

Redis构建了一种名为简单动态字符串的抽象类型,作为默认字符串表示
结构:

/*  
 * 保存字符串对象的结构  
 */  
struct sdshdr {  
    // buf 中已占用空间的长度  
    int len;  
  
    // buf 中剩余可用空间的长度  
    int free;  
  
    // 数据空间  
    char buf[];  
};

SDS 与C字符串的区别:

1.获取字符串长度(SDS O(1)/C 字符串 O(n))
传统的C 字符串 使用长度为N+1 的字符串数组来表示长度为N 的字符串,所以为了获取一个长度为C字符串的长度,必须遍历整个字符串。
和C 字符串不同,SDS 的数据结构中,有专门用于保存字符串长度的变量,我们可以通过获取len 属性的值,直接知道字符串长度

2.杜绝缓冲区溢出
C 字符串 不记录字符串长度,除了获取的时候复杂度高以外,还容易导致缓冲区溢出。
假设程序中有两个在内存中紧邻着的 字符串 s1 和 s2,其中s1 保存了字符串“redis”,二s2 则保存了字符串“MongoDb”。将s1 的内容修改为redis cluster,但是又忘了重新为s1 分配足够的空间。那么s2原来的内容会被覆盖掉。
Redis 中SDS 的空间分配策略完全杜绝了发生缓冲区溢出的可能性:
当我们需要对一个SDS 进行修改的时候,redis 会在执行拼接操作之前,预先检查给定SDS 空间是否足够,如果不够,会先拓展SDS 的空间,然后再执行拼接操作。

3.减少修改字符串时带来的内存重分配次数   
C语言字符串在进行字符串的扩充和收缩的时候,都会面临着内存空间的重新分配问题。
SDS在拓展时会进行预分配策略&

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis底层数据结构.md 的相关文章

  • Predis 给出“从服务器读取行时出错”

    我在用predis https github com nrk predis 它已订阅频道并正在收听 它抛出以下错误 如下 并在 60 秒后死亡 这肯定不是我的网络服务器错误或其超时 有一个类似的问题正在讨论here https github
  • 在节点中使用redis获取hash key的所有字段和值

    红色是使用哈希 我需要存储具有多个字段和值的哈希键 我尝试如下 client hmset Table1 Id 9324324 ReqNo 23432 redis print client hmset Table1 Id 9324325 Re
  • 是否可以使用带有 FUSE 文件系统的 Linux VFS 缓存?

    默认情况下 Linux VFS 缓存似乎不适用于 FUSE 文件系统 例如 read 调用似乎被系统地转发到 FUSE 文件系统 我在 FUSE 特定的远程文件系统上工作 我需要一个非常积极的缓存 我需要实现自己的页面缓存吗 或者是否可以为
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis

随机推荐

  • Adobe Bridge 2024:解锁创意力的数字媒体利器

    在当今数字化的时代 创意工作者们需要处理和管理大量的数字媒体资源 如照片 视频 音频等 为了提高工作效率和创作质量 他们需要一个功能强大 易于使用的工具来组织 浏览和共享这些媒体文件 幸运的是 Adobe Bridge 2024 正好满足了
  • 十大MES系统排行 制造执行系统 生产管理系统榜中榜

    MES系统十大品牌数据由CN10排排榜技术研究部门和CNPP品牌数据研究部门通过资料收集整理 并基于大数据统计及人为根据市场和参数条件变化的分析研究专业测评而得出 是大数据 云计算 数据统计真实客观呈现的结果 更多行业榜单尽在买购网 1 S
  • CentOS7.9设置ntp时间同步

    文章目录 应用场景 基础知识 服务端操作步骤 客户端操作步骤 应用场景 我们公司是做智慧交通的 主要卖交通相关的硬件和软件 硬件包括信号机 雷达 雷视 边缘盒子等 软件包括信控平台 管控平台等 路口前端设备 信号机设备 雷达设备 边缘计算单
  • Flutter安装最详细的教程(Android studio)

    本文假设你已经知道Android开发是什么 且已安装git Android sdk jdk等必要的环境 1 安装flutter插件 2 安装dart 3下载flutter sdk 去flutter官网下载其最新可用的安装包 点击下载 注意
  • 内存数据库SQLite和H2比较

    内存数据库 顾名思义就是将数据放在内存中直接操作的数据库 相对于磁盘 内存的数据读写速度要高出几个数量级 将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能 AD 2013云计算架构师峰会课程资料下载 本文中主要为大家介绍两种内存数
  • STM32学习——端口复用及映射

    1 复用 STM32有很多的内置外设 这些外设的外部引脚都是与GPIO复用的 也就是说 一个GPIO如果可以复用为内置外设的功能引脚 那么当这个GPIO作为内置外设使用的时候 就叫做复用 哪些端口可以复用为什么 这个查表就可以了 2 如何进
  • volatile 关键字 详解,为何不能保证复合操作的原子性

    一直对volatile 有些许的疑惑 就是它既然实时刷新主内存中的值 并且能保证可见 为啥不能保证原子性n 下面分析 使用volatile 关键字修饰共享变量时 变量就会有以下特点 1 变量对其他线程具有可见性 2 禁止进行指令重排 保证了
  • MATLAB如何画三轴图

    MATLAB如何画三轴图 前言 使用MATLAB绘图非常方便 它提供了非常丰富的图形 如 line bar stem等 用户可以直接调用相应的函数 但有时直接使用这些 高级 的函数不能满足我们的绘图要求 比如 如何绘制三Y轴的图形 即一个f
  • docker push 镜像上传至仓库

    目的 docker push chengzy busybox v2 问题 denied requested access to the resource is denied 原因 登录的账户名不匹配 解决 使用 tag 更改镜像名字前缀为
  • 数据库导入导出详解

    1 数据库导入导出 1 传统方式 exp 导出 和 imp 导入 2 数据泵方式 expdp 导出 和 impdp 导入 3 第三方工具 PL sql Developer 2 三种导入导出方式优缺点比较 2 1 exp imp 优点 代码书
  • deepin20.3 的问题

    deepin显示器无法唤醒解决方法 发现系统无法唤醒是因为和nvida驱动有冲突 当直接使用nvidia驱动的显卡作为显示器输入信号源就会出现这个问题 但如果小伙伴又需要使用NVIDIA的显卡运行深度学习程序 可以参考这个办法 安装deep
  • 解决win7下安装Mysql卡在Start service的问题

    由于之前在电脑上安装过MySQL 所以旧的服务器依然存在电脑上 再重新安装时startservice会报错 mysql下载地址http www mysql com downloads mysql 1 打开cmd 键入sc delete my
  • Linux日志误删了怎么办,Linux下误删messages文件的找回方法

    如果有进程正在使用的文件 如果被误删了 可以找回 如果没有进程在使用 就无法找回被误删的文件了 假如 var log messages文件被误删了 1 查询正在使用该文件的进程 root www lsof grep message rsys
  • 报错:selenium.common.exceptions.WebDriverException: Messag‘geckodriver‘ execute

    问题原因 使用pip安装selenium 默认安装的是最新版本的selenium selenium 3 x开始 webdriver firefox webdriver py的 init 中 executable path geckodriv
  • Git——Day3(Github Pages搭建个人网站)

    1 个人站点访问 https github用户名 github io 2 搭建步骤 1 创建个人站点 gt 新建仓库 注 仓库名必须是 用户名 github io 2 在仓库下新建index html的文件即可 注意 1 github pa
  • Python报错socket.gaierror: [Errno 11001] getaddrinfo failed

    1 报错 from scapy all import sr IP ICMP target 192 168 142 129 pkt IP dst target ICMP ans unans sr pkt timeout 1 for s r i
  • GitHub Desktop客户端下载安装,以及上传到服务端

    下载安装地址 https desktop github com 使用教程 https blog csdn net qqw666666 article details 125652869 操作流程 就是不同应用端的交互 做好相关验证即可
  • 应用中间件二、Tomcat单机多实例部署

    Tomcat 常见的几种部署场景 通常 我们在同一台服务器上对 Tomcat 部署需求可以分为以下几种 单实例单应用 单实例多应用 多实例单应用 多实例多应用 实例的概念可以理解为上面说的一个 Tomcat 目录 单实例单应用 比较常用的一
  • Python3.x opencv操作中文文件

    我用的是python3 5 本身用file打开中文文件是没有问题的 但是用opencv就不行 网上看到很多解决版本 可能都是针对python2 x的 没有效果 后来在知乎上看到一个解决方法 测试有效 引用在这里 冯卡门 由于python3字
  • Redis底层数据结构.md

    1 Redis 概述 Redis 数据库里面的每个键值对 key value 都是由对象 object 组成的 数据库键总是一个字符串对象 string object 数据库的值则可以是字符串对象 列表对象 list 哈希对象 hash 集