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设计及实现》
  • 相关阅读:
    [C#网络编程系列]专题一:网络协议简介
    也谈校园应用微同济的用户体验
    iOS 富文本类库RTLabel
    遥控三通直升机飞行原理简介
    A Distributed Algorithm Exercise
    在Ubantu 下下载代码 android源码 2
    新手模拟器训练指南(固定翼版)
    datasnap 2010 利用心跳包清除TCP死连接
    datasnap 2011 连接池
    datasnap 2010 利用JSON序列化和反序列化任何类型的对象
  • 原文地址:https://www.cnblogs.com/Benjious/p/11636584.html
Copyright © 2011-2022 走看看