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

你了解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.kler.cn/a/146894.html

相关文章:

  • 多线程4:线程池、并发、并行、综合案例-抢红包游戏
  • 【HCIP]——OSPF综合实验
  • AIGC----生成对抗网络(GAN)如何推动AIGC的发展
  • 无人机在森林中的应用!
  • 【论文阅读】主动推理:作为感知行为的理论
  • 《Spring 基础之 IoC 与 DI 入门指南》
  • JS 单线程还是多线程,如何显示异步操作
  • Linux篇:文件系统
  • autojs-练手-批量下载JK图片
  • Windows bat批处理zip打包排除bat文件自身不打包
  • 10、静态数码管显示
  • vatee万腾的科技征途:Vatee独特探索的数字化力量
  • excel单元格内换行按什么快捷键
  • 【Spring整合Junit】Spring整合Junit介绍
  • 边缘计算网关:智能制造的“智慧大脑”
  • 【高效开发工具系列】MapStruct入门使用
  • Idea常用的快捷键
  • SpringBoot封装Elasticsearch搜索引擎实现全文检索
  • vulfocus apache-cve_2021_41773 漏洞复现
  • Hive中常出现的错误(不定时更新)
  • SpringBoot——国际化
  • 【MySQL系列】PolarDB入门使用
  • KubeVela核心控制器原理浅析
  • Introducing the Arm architecture
  • 黑马点评Redis笔记
  • java springboot测试类Transactional解决 测试过程中在数据库留下测试数据问题