• Redis数据类型之SDS简单动态字符串


    一,简单的动态字符串

        1,Redis自己构建了一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示,

        2,在redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的

            举个栗子:set msg "hello word"

            (1)键值对的键是一个字符串对象,对象的底层是一个保存字符串msg的SDS

            (2)键值对的值也是一个字符串对象,对象的底层是个保存字符串"hello word"的SDS

        3,SDS的定义

            (1) SDS遵循C字符串以空字符串结尾的规则(空字符串不计入长度)

        4,SDS与C字符的区别

            (1)常数复杂度获取字符的长度

                    SDS:在SDS中len属性记录了该字符串的长度,它的时间复杂度为O(1)

                    C字符:需要程序遍历整个字符串,它的时间复杂度为O(N)

            (2)杜绝缓冲区溢出

                    C:将一个字符串拼接到另一个字符串后面时,当分配的内存不够时,就会产生缓冲区溢出,

                    SDS:当需要对SDS修改时,会先检查当前空间是否满足修改所需要的空间,不满足会自动扩展空间

            (3)减少修改字符串时带来的内存重分配次数

                    C:每一次的修改都会对这个字符串的组进行一次内存重分配操作,而且很容易产生内存泄漏和缓冲区溢出

                    SDS:在SDS中主要有两种优化策略

                        □空间预分配

                            当对一个SDS字符串进行修改时,程序就会为SDS分配额外的未使用空间

                            公式:当SDS的长度小于1MB时就会多分配出1MB ,2MB时就是多分配2MB

                        □惰性空间释放

                            这个只针对于对SDS字符串缩短时操作,当字符串缩短时,程序不立即使用内存重分配,而是将这个字节记录起来,并等待将来使用

            (4)二进制安全

                    C:它的字符串必须符合某种编码格式,并除字符串末尾外,字符串不能包含空字符,如果包含空字符,就会被误认为字符串结尾

                    SDS:它并不是用结尾是空字符串来代表字符串结尾,而是通过length来表示是否是结尾

            (5)兼容部分C字符串函数

  • 相关阅读:
    ztree
    SAMEORIGIN
    Unity shader学习之折射
    Unity shader学习之反射
    Unity shader学习之标准的Unity shader
    Unity shader学习之Alpha Test的阴影
    Unity shader学习之阴影,衰减统一处理
    Unity shader学习之阴影
    Unity shader学习之Forward Rendering Path
    AsyncClientUtils
  • 原文地址:https://www.cnblogs.com/zkdayup/p/10794294.html
Copyright © 2020-2023  润新知