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

你了解Redis 的二进制安全吗

最近面试的时候被问到Redis 的二进制安全相关八股文面试题。Redis二进制安全内容比较多,以下是简单的总结大致的过程,需要深入学习的建议跳过

Redis是基于C语言进行开发的,而C语言中的字符串是二进制不安全的,所以Redis就没有直接使用C语言的字符串,而是自己编写了一个新的数据结构来表示字符串,这种数据结构称之为简单动态字符串(Simple dynamic string),简称sds。

在C语言中,字符串采用的是一个char数组(柔性数组)来存储字符串,而且字符串必须要以一个空字符串\0来结尾。字符串并不记录长度,所以如果想要获取一个字符串的长度就必须遍历整个字符串,直到遇到第一个\0为止(\0不会计入字符串长度),故而获取字符串长度的时间复杂度为O(n)。

正因为C语言中是以遇到的第一个空字符\0来识别是否到了字符串末尾,因此其只能保存文本数据,不能保存图片、音频、视频和压缩文件等二进制数据,否则可能出现字符串不完整的问题,所以其是二进制不安全的。

Redis中为了实现二进制安全的字符串,对原有C语言中的字符串实现做了改进。如下所示就是一个旧版本的sds字符串的结构定义:

struct sdshdr{int len;//记录buf数组已使用的长度,即SDS的长度(不包含末尾的'\0')int free;//记录buf数组中未使用的长度char buf[];//字节数组,用来保存字符串
}

经过改进之后,如果想要获取sds的长度不用去遍历buf数组了,直接读取len属性就可以得到长度,时间复杂度一下就变成了O(1),而且因为判断字符串长度不再依赖空字符\0,所以其能存储图片、音频、视频和压缩文件等二进制数据,不用担心读取到的字符串不完整。

以上是基于个人总结,如果发现有误,请指出,我立即更正。

http://www.lryc.cn/news/252579.html

相关文章:

  • 探索前端设计的新境界——介绍IVueUI工具助力Vue页面设计
  • 数据管理系统-week10-数据库安全
  • MySQL笔记-第05章_排序与分页
  • MySQL笔记-第02章_MySQL环境搭建
  • ★136. 只出现一次的数字(位运算)
  • 阿里云效一键部署前后端
  • 【算法集训】基础数据结构:一、顺序表(上)
  • 封装websocket并在vuejs中调用
  • 博捷芯:半导体芯片切割,一道精细工艺的科技之门
  • BiseNet实现遥感影像地物分类
  • 【SpringBoot系列】SpringBoot时间字段格式化
  • .net core 连接数据库,通过数据库生成Modell
  • 开发工具idea中推荐插件
  • [c++]—string类___深度学习string标准库成员函数与非成员函数
  • PHP 双门双向门禁控制板实时监控源码
  • 【源码解析】聊聊线程池 实现原理与源码深度解析(二)
  • 本地Lambda(SAM LI)+ MySQL(Docker)环境构筑注意点
  • Windows下打包C++程序无法执行:无法定位程序输入点于动态链接库
  • Android 12 打开网络ADB并禁用USB连接ADB
  • 基于Langchain的txt文本向量库搭建与检索
  • vue2-router
  • css新闻链接案例
  • Android wifi连接和获取IP分析
  • MLIR笔记(5)
  • abapgit 安装及使用
  • 园区无线覆盖方案(智慧园区综合解决方案)
  • 配置中心--Spring Cloud Config
  • 笔记-模拟角频率和数字角频率的关系理解
  • Zookeeper+Kafka集群
  • Sunshine+Moonlight+Android手机串流配置(局域网、无手柄)