redis学习笔记01:String类型的实现SDS

2023-11-07

看了《Redis设计与实现》第二章关于redis底层对于String类型的实现:SDS(Simple Dynamic String,简单动态字符串)的内容,在这里做一点简单的总结笔记。

一.SDS结构

struct sdshdr {

//记录buf数组中已经使用的字节的数量
//等于sds所保存字符串的长度

int len;

//记录buf数组中未使用字节的数量
int free;

//字节数组,用于保存字符串
char buf[];

}

二.SDS是在C字符串的基础上进行再封装

C语言使用长度为N+1的字符数组来表示长度为N的字符串,并且字符数组的最后一个元素总是空字符'\0',不满足Redis对字符串在安全性、效率以及功能的要求:

1.用空间换时间:C字符串不记录自身的长度信息,为了获取长度,需要遍历整个字符串,而SDS记录了本身的长度在len中,获取长度的复制度从O(N)变为O(1);

2.杜绝缓存区溢出:c字符串在增加内容时需要手动地为其分配足够的空间,否则容易缓存区溢出--->意外修改别的内存区域,SDS的空间配策略使得SDS在进行修改时会先检查空间是否满足修改所需的要求。不满足的话,会自动扩展空间。

3.减少内存重分配次数:提前预留未使用空间,减少耗时的复杂的内存重分配操作(亦是空间换时间)。通过未使用空间,SDS实现了空间预分配惰性空间释放

4.二进制安全:C字符数组是以空字符'\0'来判断字符串是否结束,二进制数据里若包含空字符将为误认为是字符串结尾,因此C字符串只能保存文本数据,而SDS不用空字符来判断字符串是否结束,因此SDS是二进制安全(binary-safe)的。--->可以保存二进制数据

5.兼容部分C字符串函数:在需要时重用<string.h>函数库,避免代码重复(redis是基于c语言写的)

三.SDS与JAVA中的字符串的对比

未完待续,哈哈

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

redis学习笔记01:String类型的实现SDS 的相关文章

  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”

    我在加载 Redis 模块时遇到一些问题 我只是复制来自的示例https redis io topics modules intro https redis io topics modules intro 但我把它剥下来了 include
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get
  • Redis 中存储整数和字符串的区别

    这两个命令有什么区别吗 LPUSH myset 123 LPUSH myset 123 我想存储大约 500 万个整数 并且我想以最有效的方式做到这一点 不 没有什么区别 两者都存储为字符串 从redis io http redis io
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • 使用 Redis 中的键

    我是 Redis 和键值数据库的新手 你能告诉我如何在redis中正确实现这种关系方法吗 我有一个关系表 其中两个键对应一个值 master id slave id 价值 Example 主站 ID 从属ID 价值 1 1 值1 2 1 值
  • 无法使用 ASP.NET 会话状态提供程序连接到 Redis 服务器

    一段时间以来 我一直在尝试用 Redis 替换 ASP NET Session 多个小时与适用于 Redis 的 Microsoft ASP NET 会话状态提供程序 http blogs msdn com b webdev archive

随机推荐

  • js string转json有斜杠_详解json串反转义(消除反斜杠)

    JSon串在被串行化后保存在文件中 读取字符串时 是不能直接拿来用JSON parse 解析为JSON 对象的 因为它是一个字符串 不是一个合法的JSON对象格式 例如下面的JSON串保存在文件中 读出来不能直接解析 resourceId
  • C++类模板的特化(三)

    本文主要介绍类模板的特化 局部特化和缺省模板实参 1 类模板的特化 类模板的特化 Class Template Specialization 是指为特定的模板参数提供自定义实现的过程 通过特化 我们可以针对某些特定的类型或条件提供不同的行为
  • Java分页工具类

    通用分页工具类 import java io Serializable import java util List b 分页通用类 b author hcw param
  • 自定义同步器

    自定义同步器 假如你想要实现一个自定义同步器 官方推荐的做法是将继承了AQS类的子类作为自定义同步器的内部类 而自定义同步器中相关的操作只需代理成子类中对应的方法即可 往下用一个简单的例子看看如何实现自己的锁 由于同步器被分为两种模式 独占
  • [USACO

    网址链接或者是链接 题目描述 After spending so much time around his cows Farmer John has started to understand their language Moreover
  • 域用户登录的方式-使用登录主名和登录名登录

    1 1 1 域用户登录的方式 以下演示域用户使用登录名或登录主名在域中的计算机上登录 销售部的域用户账号 王瑞胜 在销售部的计算机Sales上登录 默认显示上次登录过的帐户 点击 切换用户 点击 其他用户 使用登录名登录 输入ESS wan
  • C++类型擦除

    转自 http www cnblogs com liyiwen archive 2009 12 10 1621451 html 关于类型擦除 在网上搜出来的中文资料比较少 而且一提到类型擦除 检索结果里就跑出很多 Java 和 C 相关的文
  • 使用Clang作为编译器 —— Assembling a Complete Toolchain

    装配一个完整的工具链 1 介绍 2 工具 2 1 Clang 前端 2 2 其他语言的语言前端 2 3 汇编器 2 4 链接器 3 运行时库 3 1 编译器运行时 Compiler runtime 3 2 原子库 Atomics libra
  • maven学习笔记 maven的安装和配置

    maven是什么 maven是一个Java项目管理工具 maven提供了大量命令行工具 可以方便的管理java项目建立 开发 测试 打包 生成 部署等各个生命周期的操作 极大的方便开发者 同时 maven还提供了统一的项目结构 简化了项目的
  • Matlab 自编雅可比矩阵 (jacobi) 函数与官方的Jacobian matrix(雅可比矩阵)函数对比及创新

    目录 0 引言 1 雅可比矩阵 2 matlab中函数表达式两种方法 2 1 符号表达式 2 2 函数句柄 2 3 函数句柄与符号表达式相互转化 2 4 常会用到的一些函数 3 自编代码 4 官方函数 5 参考文献 0 引言 最近遇到了一些
  • 点云边界提取及可视化

    include
  • qt自定义qtablemodel实现改变item的背景色

    如果你使用的是qtablewidget就非常简单 只需要 qtablewidget gt item i j gt setBackground QBrush 0 0 0 如果你的qtableview的时候 需要使用自定义模型 也就是继承QAb
  • SQL server 2016 安装步骤

    SQL server 2016 安装步骤 1 进入安装中心 可以参考硬件和软件要求 可以看到一些说明文档 2 选择全新安装模式继续安装 3 输入产品秘钥 这里使用演示秘钥进行 4 在协议中 点击同意 并点击下一步按钮 继续安装 5 进入全局
  • 程序出现以下报错现象 解决办法 在程序开始加上 from urllib request import urlopen
  • 基于FPGA的一维卷积神经网络CNN的实现(七)池化层实现

    池化层实现 环境 Pytorch Pycham Matlab 订阅后有问题 或者需要该节的文件 请私信 说明 上一节已经介绍了卷积层电路实现的原理 这一节主要介绍池化层实现的原理 第一节 基于FPGA的一维卷积神经网络CNN的实现 一 框架
  • PHP数字金额转中文大写金额

    今天开发一个项目功能的时候突然需要将数字金额转换成大写中文金额 故在百度搜索了一翻 再针对性都修改一点点 记录此处 金额转汉字大写 function cny ns static cnums array 零 壹 贰 叁 肆 伍 陆 柒 捌 玖
  • 微信小程序开发布局——Flex

    微信小程序开发布局 Flex 问题背景 微信小程序页面布局方式采用的是 Flex 布局 本文将介绍微信开发过程Flex布局的相关知识 问题分析 1 任何一个容器都可以指定为Flex布局 box display flex 行内元素也可以使用F
  • 亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨

    2023年7月12日 全国信息技术标准化技术委员会数据库标准工作组 SAC TC28 WG31 秘书处组织召开数据库标准研讨会 会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流 亚信科技AntDB数据库相关专家出席会议 并
  • 红黑树 java

    1每个节点是红色或者黑色 2根节点是黑色 3每一个叶子节点 最后的空节点 是黑色 4如果一个节点是红色 那么他的孩子节点都是黑色 红色节点都是向左倾斜 5从任意一个节点到叶子节点 经过的黑色节点是一样的 也满足二分搜索树的性质 是绝对平衡的
  • redis学习笔记01:String类型的实现SDS

    看了 Redis设计与实现 第二章关于redis底层对于String类型的实现 SDS Simple Dynamic String 简单动态字符串 的内容 在这里做一点简单的总结笔记 一 SDS结构 struct sdshdr 记录buf数