zoukankan      html  css  js  c++  java
  • redis(二)数据类型-动态字符串

    redis 动态字符串

    概述

    Sda(Simple Dynamic String) 简单动态字符串是 redis中用来表示字符串的结构,而不是传统 C 字符串。 主要的特点就是Sda要做到高效和
    

    二进制安全的,

    Sda 在Redis中的主要作用有以下两个 :

    • 实现字符串对象
    • 在 Redis 程序中内部用作 char* 类型的替代品

    Sda的特性

    • 常数复杂度获取字符串长度
    • 杜绝缓冲区溢出
    • 减少内存重新分配次数
    • 二进制安全(什么是二进制安全

    Sda 分析

    sda结构

    传统C的字符串识别结束的标志是‘/n’, Sda和这有很大区别,它的结构如下 : 
    
    typedef char *sds;
    
    struct sdahdr{
    	//buf 已占用长度
    	int len;
    
    	//buf 剩余可用长度
    	int free;
    
    	//实际保存字符串数据的地方
    	char buf[];
    }
    
    
    例如我们放入‘hello world’的字符串。那么结构就如下图一样。
    

    测试图片 len 属性可以为 sda 实现复杂度为 0(1)的长度计算操作,另外一方面,free 字段在分配空间时记录未使用的空间大小。

    减少修改字符串时带啦IDE内存从分配次数

    字符串追加,就像 java 中 StringBuild 的 append 操作,sda内部使用了内存预分配优化和惰性空间释放策略,空间预分配简单点说就是当接近空间容量时,会预先申请空间;而惰性空间分配则是
    

    当sda字符串缩短的时候,程序并不会立即马上回收去除字符串的空间,而是增加在 free 字段中,以便在后续使用。

    二进制安全

    C字段串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片,音频,视频, 这样的二进制数据,而sda 没有这个问题。
    

    参考资料

    • 《redis设计及实现》
  • 相关阅读:
    跨站的艺术-XSS Fuzzing 的技巧
    腾讯云数据库团队:PostgreSQL TOAST技术理解
    Git commit message和工作流规范
    前端识别验证码思路分析
    Akamai在内容分发网络中的算法研究(翻译总结)
    Nginx网站使用CDN之后禁止用户真实IP访问的方法
    常用机器性能评估工具
    解决关于ArcGIS10.2服务手动启动的问题
    林业通用平台上线
    土地承包经营权地块示意图打印
  • 原文地址:https://www.cnblogs.com/Benjious/p/11636584.html
Copyright © 2011-2022 走看看