当前位置: 首页 > news >正文

二、Redis五种常用数据类型-String

1、用途

  • 简单的K-V缓存
  • 计数器
  • 分布式锁
  • session共享
  • 分布式ID生成(自增)

2、底层实现结构

Redis底层是c语言实现的,但是并没有使用c的string来表示字符串,而是使用自己的简单动态字符串的抽象类型(simple dynamic string,SDS)。
SDS结构:

struct sdshdr {    // 用于记录buf数组中使用的字节的数目// 和SDS存储的字符串的长度相等  int len;    // 用于记录buf数组中没有使用的字节的数目   int free;    // 字节数组,用于储存字符串char buf[];   //buf的大小等于len+free+1,其中多余的1个字节是用来存储’\0’的。
};

使用SDS,而不使用c语言string的好处:
1、常数复杂度获取字符串长度

C语言:字符串只是简单的字符的数组,当使用strlen获取字符串的长度时,内部其实是顺序遍历数组的内容,找到’\0’对应的字符,从而计算出字符串的长度,即O(n)
SDS:只需访问SDS结构中len属性,即可得到字符串的长度。复杂度为O(1)。

2、杜绝缓冲区溢出

Redis是C语言编写的,并没有方便的数据类型进行内存的分配,必须手动进行内存的分配和释放。对于字符串的拼接和复制操作,C语言开发者需要确保目标字符串的空间足够大,不然会出现溢出情况,

当使用SDS的api修改字符串时,遵循以下规则:

1、检查字符串的大小是否满足
如果空间满足,则像C语言那样操作字符串即可,如果不满足,则拓展buf空间。
2、拓展buf空间满足一下策略:

  1. 拓展前,如果字符串长度小于1MB,那么拓展后,字符串长度为2*len+1
  2. 拓展前,如果字符传长度大于1MB,那么拓展后,字符串长度为len+1Mb+1

PS:字符串的长度最多为512M。

3、减少修改字符串带来的内存重新分配次数

Redis主要通过以下两种方式来处理内存问题
1、字符串长度增加时,进行空间预分配
2、字符串长度减少时,进行惰性释放内存
当执行字符串长度减少时,SDS并不会直接减少数据结构的长度,而是修改SDS结构中的len和free(减少len,增加free,保持字符串的总长度不变),避免内存重新分配。
SDS也提供直接释放内存的API,在需要时,可以直接调用API释放内存。

4、二进制安全

C字符串除了末尾外不能出现空字符,否则会被认为是字符串的末尾。这使得C字符串只能存储文本数据,而不能存储图像,音频等二进制数据。

SDS不需要依赖控制符,而是以len来存储数的大小。SDS所有的API都是以二进制的方式处理buf数据,且不会对数据做任何处理,写入的时候是什么样子,读取到的也是什么样的。

相关文章:

二、Redis五种常用数据类型-String

1、用途 简单的K-V缓存计数器分布式锁session共享分布式ID生成(自增) 2、底层实现结构 Redis底层是c语言实现的,但是并没有使用c的string来表示字符串,而是使用自己的简单动态字符串的抽象类型(simple dynamic string,SDS)。 SDS结构: st…...

echarts柱状图实现左右横向对比

实现效果如上图 其实是两组数据&#xff0c;其中一组数据改为负数&#xff0c;然后 在展示的时候&#xff0c;在将负数取反 第一处修改坐标轴 xAxis: [{type: value,axisLabel: {formatter: function (value) {if (value < 0) {return -value;}else{return value;}}}}], 第…...

脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大,运行稳定,操作简单方便,用户界面美观,轻松统计数据的一脸通系统。无需安装,只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备管理中心、消费管理子系统、订餐管理子系统、水控管…...

spring笔记2

一、基于xml的AOP实现 基于注解管理Bean&#xff0c;注解扫描 <context:component-scan base-package"com.zhou.spring.aop.xml"></context:component-scan><aop:config> <!-- 设置一个公共的切入点表达式--><aop:pointcut id&q…...

【挑战30天首通《谷粒商城》】-【第一天】02、简介-项目整体效果展示

文章目录 课程介绍 ( 本章了解即可&#xff0c;可以略过)一、 分布式基础 (全栈开发篇) (初中级)二、 分布式高级 (微服务架构篇) ( 高级)三、高可用集群 (架构师提升篇)( 架构 ) one more thing 课程介绍 ( 本章了解即可&#xff0c;可以略过) 1.分布式基础(全栈开发篇)2.分布…...

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1&#xff1a;将数据发往指定 partition 示例2&#xff1a;有 key 的…...

GEE错误——image.reduceRegion is not a function

简介 image.reduceRegion is not a function 这里的主要问题是我们进行地统计分析的时候&#xff0c;我们的作用对象必须是单景影像&#xff0c;而不是影像集合 错误"image.reduceRegion is not a function" 表示你正在尝试使用reduceRegion()函数来处理图像数据&…...

rk356x 关于yocto编译linux及bitbake实用方法

Yocto 完整编译 source oe-init-build-envbitbake core-image-minimalYocto 查询包名 bitbake -s | grep XXX // 获取rockchip相关包 :~/rk3568/yocto$ bitbake -s | grep rockchip android-tools-conf-rockchip :1.0-r0 gstreamer1.0-rockchip …...

Chrome您的连接不是私密连接 |输入“thisisunsafe”命令绕过警告or添加启动参数

一、输入 thisisunsafe 在当前页面用键盘输入 thisisunsafe &#xff0c;不是在地址栏输入(切记)&#xff0c;就直接敲键盘就行了 因为Chrome不信任这些自签名ssl证书&#xff0c;为了安全起见&#xff0c;直接禁止访问了&#xff0c;thisisunsafe 这个命令&#xff0c;说明你…...

牛客面试前端1

HTML语义化 是什么 前端语义化是指在构建网页时多使用html语义化标签布局&#xff0c;多使用带有语义的标签如header&#xff0c;aside&#xff0c;footer等标签为什么 结构清晰利于开发者开发与维护 有利于seo搜索引擎优化 有利于在网络卡顿时&#xff0c;正常显示页面结构&a…...

Linux的软件包管理器-yum

文章目录 软件包的概念yum源的配置的原因yum的使用查看软件包安装软件卸载软件 软件包的概念 软件包(SoftWare Package)是指具有特定的功能&#xff0c;用来完成特定任务的一个程序或一组程序。可分为应用软件包和系统软件包两大类 在Linux系统中&#xff0c;下载安装软件的方式…...

选择排序(Selection Sort)

选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下: 遍历数组:从待排序的数列中,找到当前未排序部分(即整个数组或已排序部分之后的部分)中的最小(或最大,取决于排序方式)元素。 交换位置:将找到的最小元素与未排序部分的第一个元素交换位置,这…...

网络面试题目

1、BGP报文有哪些? 有5种报文,Open、 Update、 Notification、 Keepalive和 Route-refresh等5种报文类型。 2、Vxlan了解多少? VLAN作为传统的网络隔离技术,VXLAN完美地弥补了VLAN的上述不足。 VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),(VXL…...

Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析

随着万物互联&#xff0c;视频会议直播互动深入业务各方面&#xff0c;主流SFU并不适合管理&#xff0c;很多业务需要各种监控终端&#xff0c;互动SIP硬件设备&#xff0c;Web在线业务平台能相互融合&#xff0c;互联互通&#xff0c; 视频混流直播&#xff0c;录存直播推广&a…...

Unreal 编辑器工具 批量重命名资源

右键 - Editor Utilities - Editor Utility Blueprint&#xff0c;基类选择 Asset Action Utility 在类默认值内&#xff0c;可以添加筛选器&#xff0c;筛选指定的类型 然后新建一个函数&#xff0c;加上4个输入&#xff1a;ReplaceFrom&#xff0c;ReplaceTo&#xff0c;Add…...

Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg

本文首发于公众号&#xff1a;机器感知 Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg Converting Anyones Voice: End-to-End Expressive Voice Conversion with a Conditional Diffusion Model Expressive voice conversion (VC) conducts speak…...

短信群发平台分析短信群发的未来发展趋势

短信群发平台在当前的移动互联网时代已经展现出了其独特的价值和广泛的应用场景。随着技术的不断进步和市场的不断变化&#xff0c;短信群发的未来发展趋势也将呈现出一些新的特点。 首先&#xff0c;随着5G网络的推广和普及&#xff0c;短信群发的速度和稳定性将得到进一步提…...

supervisord 使用指南

supervisord 使用指南 supervisord的安装 supervisor是一系列python脚本文件&#xff0c;以python package的形式管理&#xff0c;可以用于UNIX类系统的进程管理。 安装supervisor也相当简单&#xff0c;只需要用pip安装即可。 sudo pip install supervisor但是有可能将其安…...

AngularJS 的生命周期和基础语法

AngularJS 的生命周期和基础语法 文章目录 AngularJS 的生命周期和基础语法1. 使用步骤2. 生命周期钩子函数3. 点击事件4. if 语句1. if 形式2. if else 形式 5. for 语句6. switch 语句7. 双向数据绑定 1. 使用步骤 // 1. 要使用哪个钩子函数&#xff0c;就先引入 import { O…...

docker-compose 网络

自定义网络 - HOST 与宿主机共享网络 version: "3" services:web:image: nginx:1.21.6restart: alwaysports:- 80:80network_mode: host自定义网络 - 固定ip version: "3" services:web:image: nginx:1.21.6restart: alwaysports:- 80:80networks:app&am…...

【稀缺首发】全球首份Midjourney 35mm风格LUT转换协议白皮书(附Adobe Lightroom联动预设+FFmpeg批量胶片渲染脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney 35mm风格的影像美学本源与技术定义 35mm胶片摄影所承载的颗粒质感、动态范围衰减、边缘柔焦与色彩偏移&#xff0c;并非缺陷&#xff0c;而是光学物理与化学显影共同作用下的美学签名。Mid…...

耳机选购指南:从音质佩戴到无线降噪,构建你的场景化耳机衣橱

1. 耳机选购的底层逻辑&#xff1a;从“听个响”到“场景化生存”我家里有个抽屉&#xff0c;专门用来放耳机&#xff0c;数了数&#xff0c;不下十几副。从最早那副压箱底的Koss头戴式&#xff0c;到如今几乎长在耳朵上的AirPods Pro&#xff0c;每一副都对应着我生活里一个特…...

VideoRAG框架解析:基于知识图谱的超长视频理解与对话系统

1. 项目概述&#xff1a;当视频太长&#xff0c;AI也“看”不过来时&#xff0c;我们做了什么作为一名长期混迹在AI和多媒体技术交叉领域的开发者&#xff0c;我经常遇到一个头疼的问题&#xff1a;现在的多模态大模型&#xff08;MLLM&#xff09;处理图片、理解短视频都挺溜&…...

基于MCP协议构建团队AI共享记忆中枢:Trapic项目实战指南

1. 项目概述&#xff1a;为团队AI工具构建共享记忆中枢 如果你和你的团队在日常开发中&#xff0c;已经习惯了与Claude Code、Cursor这类AI编程助手进行深度对话&#xff0c;那么一个共同的痛点可能已经浮现&#xff1a;每次开启一个新的会话&#xff0c;AI助手都像一张白纸&a…...

使用Hermes Agent框架时接入Taotoken自定义供应商的步骤详解

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Hermes Agent框架时接入Taotoken自定义供应商的步骤详解 对于使用Hermes Agent框架的开发者而言&#xff0c;将后端AI服务接入…...

终极指南:3分钟为Windows换上macOS专业级光标体验

终极指南&#xff1a;3分钟为Windows换上macOS专业级光标体验 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/macOS-cu…...

5大核心能力重构GTA5 Online体验:从繁琐操作到高效游戏的全流程指南

5大核心能力重构GTA5 Online体验&#xff1a;从繁琐操作到高效游戏的全流程指南 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 你是否厌倦了在洛圣都的街头重复着机械性的操作&#xff1f;是否曾为了完…...

记录红米note手机忘记屏幕密码找回过程

手上一台老红米note10忘记了开机密码&#xff0c;但里面还有一些重要资料&#xff0c;今天得到一个软件MOBILedit Forensic ULTRA 9.8.0.34378可以解出屏幕密码&#xff0c;我就拿来试一下&#xff0c;果然解开了&#xff0c;记录一下过程给大家参考。先查这个手机的处理器是天…...

基于MCP协议构建AI助手与外部应用桥接:以hikerapi-mcp为例的实战指南

1. 项目概述与核心价值最近在折腾一些自动化工作流&#xff0c;发现很多工具之间的数据流转是个大问题。比如&#xff0c;我想把某个文档里的关键信息提取出来&#xff0c;自动生成一个任务列表&#xff0c;再推送到另一个项目管理工具里。这个过程如果手动操作&#xff0c;不仅…...

Spring Boot 3.x 集成AD域实战:从SSL证书踩坑到密码重置,一篇讲透

Spring Boot 3.x 深度集成AD域实战&#xff1a;SSL证书配置与密码策略避坑指南 在企业级应用开发中&#xff0c;Active Directory&#xff08;AD&#xff09;集成是身份认证的核心环节。本文将带您深入Spring Boot 3.x与AD域集成的实战细节&#xff0c;特别聚焦于SSL证书配置和…...