Redis底层数据库之SDS


  1. 高速的存储介质:内存
  2. 优秀的底层数据结构
  3. 高效的IO模型
  4. 高效的线程模型

1. 动态字符串SDS


Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是redis中最常用的一种数据结构。

C语言种字符串存在的一些问题:

  1. 获取字符串长度需要遍历运算
  2. 非二进制安全:假设之间有个结束字符(但未结束),就会提前被终止
  3. 不可修改:字符串被创建之后,被放在内存常量池中,不能修改某个字符,也不能拼接
    ![[Pasted image 20240402142712.png]]

所以Redis构建了一种新的字符串结构,成为简单动态字符串,简称SDS

Redis是C语言实现的,其中SDS是一个结构体,源码如下:
![[Pasted image 20240402143305.png]]

uint8_t:表示无符号整型
由于len是uint8_t类型,最大值为254,所以字符串最大长度为254(因为char buf[]仍然是C语言的字符串,会有一个结束符)
flags:表示不同的结构体类型
![[Pasted image 20240402144252.png]]

其中一个实例如下图所示:

![[Pasted image 20240402144554.png]]

SDS叫做动态字符串的原因在于其具有动态扩容的能力,分配策略如下:

  • 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1(1表示结束字符);
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1,称为预分配,为了减少频繁去申请内存(消费Cpu性能和时间)
    ![[Pasted image 20240402145311.png]]

假如在该字符串追加一段”,AMY“,那么会去申请新空间(alloc为申请的存放字符的空间,不包含结束字符)
![[Pasted image 20240402145524.png]]

SDS的优点在于:

  1. 获取字符串长度的时间复杂度为O(1)
  2. 支持动态扩容
  3. 减少内存分配次数
  4. 二进制安全

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

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

相关文章

代码随想录刷题day42| 01背包理论基础分割等和子集

文章目录 day41学习内容一、 01背包之二维数组解法1.1、什么是01背包1.2、动态规划五部曲1.2.1、 确定dp数组(dp table)以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…

C++经典面试题目(十九)

1、什么是析构函数?它有什么作用? 析构函数是类的特殊成员函数,用于在对象被销毁时执行清理工作。它的名称与类名相同,前面加上波浪号(~)。析构函数的作用在于确保在对象被销毁时释放占用的资源&#xff0…

【嵌入式智能产品开发实战】(十四)—— 政安晨:通过ARM-Linux掌握基本技能【链接静态库与动态库】

目录 链接静态库 动态链接 与地址无关的代码 全局偏移表 延迟绑定 共享库 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论…

初阶数据结构—算法的时间复杂度和空间复杂度

第一章:数据结构前言(Lesson 1) 1. 什么是数据结构? 数据结构 (Data Structure) 是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。 2. 什么是算法? 算法(Algorithm)…

【数据处理包Pandas】多级索引的创建及使用

目录 一、元组作为一级索引(一)示例1(二)示例2 二、引入多级索引(一)多级索引的创建(二)多级索引中的数学选取 首先,导入 NumPy 库和 Pandas 库。 import numpy as np i…

Client sent an HTTP request to an HTTPS server

背景 最近踩坑了 我发现域名:8000可以访问我的服务 但是域名:443却不行,这很反常 结果发现是nginx配置的问题,需要把http改成https! 原因 如果你的后端服务(运行在8000端口上)已经配置了SS…

JS与C#的交互

原文链接&#xff1a;https://blog.csdn.net/Marcus2006/article/details/104986130 背景&#xff1a;1. 为了最大限度复用我们自己之前写的C#库的功能 2. 给我们的工具只提供了JS的流程(:<) &#xff0c;组织忽悠其他人员C#难用&#xff0c;JS好用。 目前edge-js提供了强…

monitor link 联合smart link配合应对复杂的网络

monitor link关键词&#xff1a;上行和下行端口&#xff0c;当上行端口异常&#xff0c;下行端口立即down掉&#xff0c;也就是一种联动机制 如果上行端口里面是smart link方式&#xff0c;则当主从端口都出问题时候&#xff0c;下行端口才会down掉 monitor link 配置步骤 1创…

力扣之每日四题day01--二叉树遍历篇

二叉树遍历 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历102.二叉树的层序遍历 144.二叉树的前序遍历 力扣地址 import java.util.ArrayList; import java.util.List;/*** Definition for a binary tree node.* public class TreeNode {* int val;* …

Vue基础配置、组件通信、自定义指令

基础配置 Vue框架已经集成了webpack配置 小注意点 vbase 快速生成vue模板 组件名必须是多词格式(驼峰模式) 具体三种写法: ①小驼峰:abcDef.vue ②大驼峰&#xff1a;AbcDef.vue ③中横线&#xff1a;abc-def.vue 假如文件名不符合多次格式的补救办法&#xff1a; 导出重命名…

EFPN代码解读

论文 Extended Feature Pyramid Network for Small Object Detection python3 D:/Project/EFPN-detectron2-master/tools/train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --num-gpus 1 训练脚本 cfg 中的配置 先获取配置…

基于51单片机的智能门禁系统仿真设计

**单片机设计介绍&#xff0c;基于51单片机的智能门禁系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能门禁系统仿真设计概要 一、设计概述 本设计旨在利用51单片机为核心控制器&#xff0c;结合…

Python程序设计 多重循环(二)

1.打印数字图形 输入n&#xff08;n<9)&#xff0c;输出由数字组成的直角三角图形。例如&#xff0c;输入5&#xff0c;输出图形如下 nint(input("")) #开始 for i in range(1,n1):for j in range(1,i1):print(j,end"")print()#结束 2.打印字符图形 …

pytest教程-22-用例依赖插件-pytest-dependency

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest失败重跑插件pytest-rerunfailures&#xff0c;本小节我们讲解一下pytest用例依赖插件-pytest-dependency。 用例依赖 编写用例的时候&#xff0c;我们会注意用例之间的独立性&#xf…

【电源专题】电池不均衡的影响与原因

在使用多节电池设计产品时,大家都知道如果多节电池不均衡会影响电池寿命与充电安全。特别是在充电末端与放电末端时表现较为明显。 电池不均衡的影响 那么为什么会影响安全与寿命呢?其原因如下: 如果电池不均衡时,相当于木桶的短板效应。一方面没法充满,充电时电压高的那一…

利用ChatGPT提升学术论文写作技巧

ChatGPT无限次数:点击直达 利用ChatGPT提升学术论文写作技巧 在当今信息爆炸的时代&#xff0c;学术界对于深入研究和撰写高质量论文的要求越来越高。然而&#xff0c;许多研究人员和学生常常感到写作过程困难&#xff0c;需要花费大量时间和精力。这时候&#xff0c;人工智能…

在Ubuntu上使用Caddy轻松搭建WebDAV服务器

嘿&#xff0c;各位码农朋友们&#xff01;今天我要和大家介绍一下在 Ubuntu 下使用 Caddy 部署 WebDAV 的技术&#xff0c;让你的文件共享变得更加简单顺畅。 &#x1f31f;嗯&#xff0c;我得承认&#xff0c;三丰云的免费服务器真是不错&#xff01;它提供了1核CPU、1G内存…

提升性能与精准追踪:SkyWalking自定义跟踪忽略插件

前言 当使用分布式追踪系统时&#xff0c;有时需要排除某些端点或路径&#xff0c;以减轻追踪系统的负载或减少不必要的数据收集。为了满足这种需求&#xff0c;SkyWalking 提供了一个可选的插件&#xff0c;即 apm-trace-ignore-plugin&#xff0c;它允许自定义需要跳过的路径…

【跟小嘉学 Linux 系统架构与开发】三、如何查看帮助文档

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍 【跟小嘉学 Linux 系统架构与开发】三、如何查看帮助文档 文章目录 系列文章目录[TOC](文章目录) 前言一、 命令…

nodejs爬图片(二)

前言 网上一张一张下载是不是很麻烦&#xff0c;直接批量下载&#xff0c;解决你的问题。高清不是梦&#xff01; 具体步骤不说了&#xff0c;直接上代码 const cheerio require("cheerio"); const axios require("axios"); const fs require(…