设为首页 收藏本站
查看: 1955|回复: 0

[经验分享] Redis学习笔记-Redis内部数据结构

[复制链接]

尚未签到

发表于 2015-7-22 13:48:02 | 显示全部楼层 |阅读模式
  Redis内部数据结构
  Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值。它支持的value值的类型如下:


  • sds (simple dynamic string) 简单动态字符串
  • 双端链表
  • 字典(dictionary/map/associative array)
  • 跳跃表(skiplist)
  下面将对以上的各个类型在redis内部的实现进行分析。
  
  一、sds (simple dynamic string) 简单动态字符串
  Redis并没有使用C的字符串,而是在其上面进行了封装,以适应更多频繁的耗时操作。在前面的内容中,我们一直将sds 作为一种抽象数据结构来说明,实际上,它的实现由以下两部分组成:



1 typedef char *sds;


1 struct sdshdr {
2 // buf 已占用长度
3 int len;
4 // buf 剩余可用长度
5 int free;
6 // 实际保存字符串数据的地方
7 char buf[];
8 };
  这样的设计对于strlen()和append()操作来说是效率很高的。对于strlen()操作来说,很明显可以通过len属性在O(1)的时间内拿到。对于append()操作,参考下面的例子:



redis> SET msg "hello world"
OK
redis> APPEND msg " again!"
(integer) 18
redis> GET msg
"hello world again!"
  看看这个过程中sdshdr的变化情况:
  首先,set msg后,sdshdr如下:



1 struct sdshdr {
2 len = 11;
3 free = 0;
4 buf = "hello world\0";
5 }
  然后,append msg后,sdshdr如下:



1 struct sdshdr {
2 len = 18;
3 free = 18;
4 // 空白的地方为预分配空间,共18 + 18 + 1 个字节
5 buf = "hello world again!\0 ";
6 }
  可以看到,Redis的sds会预分配2倍自己大小的空间,这样就减少了内存的追加操作,即减少了字符串追加操作的时间。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-89528-1-1.html 上篇帖子: Redis采用不同内存分配器碎片率对比 下篇帖子: redis 小姐来啦
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表