REDIS字符串-二进制安全的含义 一、sds vs c字符串


在 C 语言中,字符串可以用一个 \0 结尾的 char 数组来表示。

比如说, hello world 在 C 语言中就可以表示为 "hello world\0" 。

这种简单的字符串表示,在大多数情况下都能满足要求,但是,它并不能高效地支持长度计算和追加(append)这两种操作:

  • 每次计算字符串长度(strlen(s))的复杂度为 O(N)
  • 对字符串进行 N 次追加,必定需要对字符串进行 N 次内存重分配(realloc)。

而redis除了要处理c语言字符串之外,还需要处理redis的服务器协议等等。所以,redis实现的sds(简单动态字符串),是二进制安全的。

数据结构的定义如下:

[java]  view plain  copy
  1. typedef char *sds;  
  2.   
  3.   
  4. struct sdshdr {  
  5.   
  6.     // buf 已占用长度  
  7.     int len;  
  8.   
  9.     // buf 剩余可用长度  
  10.     int free;  
  11.   
  12.     // 实际保存字符串数据的地方  
  13.     char buf[];  
  14. };  

从上面的数据结构定义,可以看出,redis的sds和c语言的区别就是,sds是通过buf以及len来判断字符串内容的,而不是通过“\0”来判断

二、二进制安全 

看下面代码

c语言:
str = "1234\0123"
strlen(str)=4
redis:
strlen(str)=7

 

所以,简单来说,二进制安全就是,字符串不是根据某种特殊的标志来解析的,无论输入是什么,总能保证输出是处理的原始输入而不是根据某种特殊格式来处理。

比如这边redis通过len来表示字符串长度,不会因为中间插入了“\0”就返回错误结果。

再举个例子:(展示非二进制安全)

main(){  
    char ab[] = "Hello";  
    char ac[] = "Hello\0Hello";  
    strcmp(ab, ac); /*返回0, 由于是非二进制安全,误判为相等 */
 }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值