发表于: 2017-11-16 19:57:31
0 840
今天完成的事情:
看redis设计与实现
明天计划的事情:
继续看
遇到的问题:
无
收获:
1:redis登陆
redis如果没输入密码,输入一切命令都会显示
(error) NOAUTH Authentication required
然后进入./redis-cli客户端登陆
会有一个127.0.0.1:6379
这时候需要输入auth "你的密码"
密码正确返回ok就可以使用了
2:
sds是redis自己构件的一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示
C语言使用长度为N+1的字符数组来表示长度为N的字符串,并且字符数组的最后一个元素总是空字符'\0'
sds遵循了以空字符结尾的惯例,为空字符分配额外一字节空间以及添加空字符到字符串末尾等操作,都是由SDS函数自动完成的.
遵循空字符结尾这一惯例的好处是,sds可以直接重用一部分c字符串函数库里的函数
C字符串和SDS的区别在于:
这样设置的原因:
1:C字符串并不记录自身的长度,所以获取其的长度,程序必须遍历整个字符串,对遇到的每个字符进行计数直到遇到代表字符串结尾的空字符为止,这个操作的复杂度为0(N).//0(N)是时间复杂度,线性阶,属于第二阶,阶段越高越复杂
而SDS在len属性中记录了SDS本身的长度,所以获取一个SDS长度的复杂度仅为0(1)//常数阶复杂度,属于第一阶.
所以即使我们对一个非常长的字符串键反复执行strlen命令,也不会对系统性能造成任何影响,因为复杂度仅为0(1).这是优化的地方
2:除了获取字符串长度的复杂度高以外,C字符串不记录自身长度带来的另一个问题是容易造成缓冲区溢出.
而SDS空间分配策略完全杜绝了发生缓冲区溢出的可能性
3:C字符串中的字符必须符合某种编码(ASCII),并且除了字符串末尾以外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这使得C字符串只能保存文本数据,而不能保存图片,音频,视频,压缩文件这样的二进制数据.
评论