浅谈redis之SDS

SDS

  • 什么是SDS
    • SDS结构
      • len的作用
      • free的作用
      • buf的作用
        • 简单示例
    • SDS机制
      • 重新分配内存
        • 分配内存机制
          • 小于1MB情况
          • 大于1MB情况
          • 为什么这样分配
      • 惰性释放内存

什么是SDS

SDS:全名 simple dynamic string,意为简单动态字符串,作为redis里的一种数据结构,它有着普通C字符所不具备的一些特点.

SDS结构

struct sdshdr {int len;int free;char buf[];
}
len 意指SDS所保存字符的长度
free 则指buf数组中未使用字节的数量
buf 字节数组,用于保存字符串

从结构设计上,我们可以对 SDS的设计的优点可窥一二

len的作用

首先从len开始,为什么SDS会记录一个len值,熟悉遍历大法的我们知道,要想知道一个字符串的长度,最原始的办法是从首位数到末位,假如我们有一个长度为n的字符串,在未记录其长度时,我们要想知道其len值,需要话费的时间会是O(N),如果我们是使用的SDS记录的字符串,则花费时间使用STRLENO(1),花费的时间越少,意味着性能越高.

free的作用

free,意指buf数组还有多少空间是未使用,这个值一般用在buf空间扩展,以及添加新值时会用到。不同于C字符串的扩张,SDS API在对SDS进行修改时,会先检查SDS的空间是否满足所需需求,若不满足,API会自动将SDS的大小扩展至所需空间.这样做的好处是不会有缓冲区的溢出.

buf的作用

SDS的API都是二进制安全(binary-safe)的,通俗的来说SDS的API通过某种机制,保证了读写字符串的时候不会损害其内容,因为在C语言中,“\0”表示了字符串的结束,出现这个字符,字符串就会被截断,造成错误的字符,而在sds中即使字符串里有“\0”,也不会被截断,除非是redis自己的结尾字符,保证了读写的一致性.虽然SDS是二进制安全的,但是它还是兼容了一部分C字符的特性.

简单示例

现在我们,往SDS保存madpudding,按照上述结构,存入字符的SDS的长度是10,而buf里的前10个字节分别保存madpudding 10个字符串.实际上buf里会有11个字符,sds还是会以\0,作为字符结尾.

SDS机制

重新分配内存

分配内存机制
小于1MB情况

如果对sds进行修改后,整体的长度小于1MB,那么redis分配的是和len属性同样的大小空间,以madpudding为例,是10(buf长度)+10(free空间)+1(结尾字符).

大于1MB情况

假如修改后整体长度大于20MB,则实际空间是20MB(buf长度)+1MB(free空间)+1(结尾字符).

为什么这样分配

为什么redis会为sds这样分配空间呢?假设在实际使用中,有个sds一直在增加,按上述分配法,则在n次扩展中,sds最多重新分配n次空间,要知道io是很消耗性能的,最多n次n次,性能差距是非常大的.

惰性释放内存

假如sds的字符,一直在减少,那么sds会立马释放未使用的空间嘛?答案是否定的,sds只会在free中依次记录,等待将来使用。这样做的目的是避免了缩减字符而重新释放内存,并为将来可能有的增长提供了空间基础.当然sds提供了真正需要释放空间的命令,让开发者不用担心惰性释放造成空间浪费.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六.生成makefile文件 并基于makefile文件编译opencv

1.点击【Generate】 生成makefile文件 2.进入目录下编译opencv源码,mingw32-make -j 8 3..编译出现报错 4.取消[WITH_OPENCL_D3D11_NV]选项,再次【configure】【generate】 然后再次编译:mingw32-make -j 8

科技守护大唐遗宝,预防保护传承千年

​ 一、“大唐遗宝——何家村窖藏出土文物展” 陕西历史博物馆的“唐朝遗宝——何家村窖藏出土文物展”算得上是博物馆展览的典范。展览不仅在于展现了数量之多、等级之高、种类之全,更在于对唐朝历史文化的深入揭露。 走入大唐财产展厅,好像穿越千年前…

解决TCP中Bind failed烦恼

文章目录 概要样例代码 概要 当第一次运行服务端时正常,第二次运行时出现Bind failed问题。 在实际使用中,如果您尝试启动一个服务端程序并且遇到了 “Bind failed” 的错误信息,这通常意味着尝试绑定(bind)的端口已…

Boss直聘聊天问答

主动打招呼常用语: 1.您好,我看到贵公司的招聘需求很符合我的技术栈,方便约个面试聊一聊嘛? 2.我叫郭治江,2022年毕业,物联网工程专业,目前从事Java开发工作已经三年了,上家公司是…

推理任务稳定提点大揭秘:力大砖飞背后的科学

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

GB/T 17639-2023 长丝纺粘针刺非织造土工布检测

长丝纺粘针刺非织造土工布是指以聚酯或聚丙烯为原料,经纺丝、铺网、针刺加固而成的长丝纺粘针刺非织造布。 GB/T 17639-2023 长丝纺粘针刺非织造土工布测试项目: 测试要求 测试标准 纵横向抗拉强度 GB/T 15788 纵横向最大负荷下伸长率 GB/T 15788 …

Nginx相关命令

进入nginx程序目录,使用cmd在本目录下打开, 启动nginx:使用命令start nginx 本地重启nginx:nginx -s reload 停止:nginx -s stop 或者 nginx.exe -s quit 查看Nginx版本:nginx -v

功率MOSFET体二极管的连续载流能力

功率MOSFET体二极管的连续载流能力 1.概述2.MOSFET 漏源电压限制3.体二极管电流能力4.计算案例5.降额 tips:资料主要来自网络,仅供学习使用。 在电力电子领域或者在大功率应用场境下,我们经常会用到开关管功率MOSFET以及其内部的二极管。 那…

Nginx是什么?怎么用?

Nginx介绍 Nginx (读作 “engine-x”) 是一款高性能的HTTP和反向代理服务器,同时也可用作IMAP/POP3/SMTP代理服务器。由俄罗斯程序员Igor Sysoev开发,首次公开发布于2004年。Nginx以其稳定性、高性能和低内存消耗闻名,尤其擅长处理静态文件、…

2.23学习总结

铅球杯https://www.luogu.com.cn/problem/B3911 题目描述 蓝边铅球组织了“铅球杯”数据标注大赛。为了实现 Au 大满贯的宏大征途,LeAuingZ 报名参加了比赛。 蓝边铅球给出了 �N 个 int 类型变量的名字及其值,并要求 LeAuingZ 对 &#xfffd…

安全生产:AI视频智能分析网关V4如何应用在企业安全生产场景中?

随着科技的不断进步,视频智能分析技术在安全生产领域中的应用越来越广泛。这种技术通过计算机视觉和人工智能算法,可以对监控视频进行自动分析和处理,以实现多种功能,如目标检测、行为识别、异常预警等。今天我们以TSINGSEE青犀AI…

Boom 3D for Mac 破解版(3D环绕立体声音效增强软件)2.0.2中文支持M3

Mac上想要听一场极致的音乐或看一场畅快淋漓的电影?这些Boom 3D for Mac都可以帮您实现,是一款Mac音效增强工具,可以将二维度的音效转换成三维度,让您彻底的享受一下极致的听觉盛宴! Boom 3D 2.0.2 Mac版主打音乐播放器…

【Rust】——控制流(if-else,循环)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

centos7 arm服务器编译安装onnxruntime-gpu

前言 ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎,但在arm服务器上,onnxruntime只有CPU版的,GPU版的没有,因此需要自行去编译GPU版本的才可以。 环境准备 1、python3.8 2、cmake:2.26.0版本以上,可以直接下载aarch64版本的进行…

[VulnHub靶机渗透] HA: Narak

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

洛谷 P2032 扫描 (Java)

洛谷 P2032 扫描 (Java) 传送门:P2032 扫描 题目: 扫描 题目描述 有一个 1 n 1 \times n 1n 的矩阵,有 n n n 个整数。 现在给你一个可以盖住连续 k k k 个数的木板。 一开始木板盖住了矩阵的第 1 ∼ k 1 \sim k 1∼k 个数&#x…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)

介绍&#xff1a;首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库&#xff0c;训练出一个具有中医知识理解力的预训练语言模型&#xff08;pre-trained model&#xff09;&#xff0c;之后在此基础上通过海量的中医古籍指令对话数据及通用指令…

Vite+Vue3+Ant Design3.2报错: Cannot read properties of null (reading ‘isCE‘)

最近的ViteVue3Ant Design Vue3.2开发的项目莫名其妙的报错&#xff1a; Uncaught (in promise) TypeError: Cannot read properties of null (reading isCE) 一直找不到原因出在哪&#xff0c;害的我费了好多时间调试 &#xff0c;百度上也找了各个解决方法&#xff0c;有说使…

React18源码: schedule任务调度messageChannel

React调度原理(scheduler) 在React运行时中&#xff0c;调度中心&#xff08;位于scheduler包&#xff09;是整个React运行时的中枢&#xff08;其实是心脏&#xff09;&#xff0c;所以理解了scheduler调度&#xff0c;就基本掌握了React的核心React两大循环&#xff1a;从宏…