zoukankan      html  css  js  c++  java
  • Redis数据结构之简单动态字符串

      Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将SDS用作Redis的默认字符串表示。在Redis中,C字符串只会作为字符串字面量,用在一些无需对字符串值进行修改的地方,例如打印日志。

    一、SDS的结构定义

    示例:

    二、SDS与C字符串的区别
    1. 常数复杂度获取字符串长度
    C字符串长度计算:遍历整个字符串直至遇到代表字符串结尾的空字符,时间复杂度为O(N)。
    SDS长度计算:只要访问SDS的'len'属性即可,时间复杂度为O(1)。
    注:设置和更新SDS长度的工作是由SDS的API在执行时自动完成的,使用SDS无须进行任何手动修改长度的工作。
    2. 杜绝缓冲区溢出
    C字符串:增加长度时,需要开发者手动申请分配足够的空间,否则会发生缓冲区溢出。
    SDS:SDS的空间分配交由SDS API自动实现,无需手动申请分配,不会发生缓冲区溢出。
    3. 减少修改字符串时带来的内存重分配次数
    C字符串:每次增长或缩短字符串,都需要进行一次内存重分配操作,否则会发生缓冲区溢出或内存泄漏。
    SDS:通过使用"free"属性记录未使用空间,实现空间预分配和惰性空间释放两种优化策略,从而减少内存重分配次数。
    (1)SDS空间预分配:
      SDS API对SDS的空间进行扩展的时候,不仅会为SDS分配必需的空间,还会分配额外的未使用空间。若修改后SDS长度小于1M,则预分配和"len"一样大小的未使用空间;若修改后SDS长度大于等于1M,则预分配1M的未使用空间。以后再需要扩展SDS空间时,SDS API会优先使用SDS的"free"未使用空间。
    (2)SDS惰性空间释放:
      SDS API对SDS的空间进行缩短的时候,不会立即使用内存重分配来回收多余空间,而是使用"free"属性将这些空间的字节数量记录起来,等待以后使用。SDS也提供了相应的API,让我们可以在有需要时,真正地释放SDS中未使用的空间。
    注:内存重分配涉及复杂的算法,并且可能需要执行系统调用,通常是一个比较耗时的操作,若频繁执行可能会对性能造成影响。
    4. 二进制安全
    C字符串:字符必须符合某种编码,而且除了字符串末尾,不能包含空字符,所以C字符串只能保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据。
    SDS:SDS API都是二进制安全的,可以保存任意格式的二进制数据。
    5. 兼容部分C字符串函数
      SDS API总会将SDS保存的数据末尾设置为空字符,所以若SDS保存的是文本数据,则可以重用一部分<string.h>库定义的函数,避免不必要的代码重复。

    三、SDS在Redis中的用途
    1. 在Redis的数据库中,包含字符串值的键值对在底层都是由SDS实现的。
    2. 除此之外,SDS还被用作缓冲区,例如AOF模块的AOF缓冲区、客户端状态中的输入缓冲区。

  • 相关阅读:
    Node Sass could not find a binding for your current environment : Node.js 8.x -SpiritMark
    SpringBoot从入门到精通教程(八)
    注解 @CrossOrigin
    出现VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录。 未能将管道连接到虚拟机: 所有的管道范例都在使用中。
    说一下 JSP 的 4 种作用域?
    jsp有哪些内置对象?作用分别是什么?
    MVC的各个部分都有那些技术来实现?如何实现?
    你所了解的的软件测试类型都有哪些,简单介绍一下。
    你的测试职业发展目标是什么?
    您认为做好测试用例设计工作的关键是什么?
  • 原文地址:https://www.cnblogs.com/wujuntian/p/9129558.html
Copyright © 2011-2022 走看看