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字符串函数

猜你喜欢

转载自www.cnblogs.com/zkdayup/p/10794294.html