加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Redis概念以及底层数据结构

发布时间:2019-04-18 12:15:24 所属栏目:MySql教程 来源:佚名
导读:副标题#e# Redis 简介 REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通

intset是一个整数集合,里面存的为某种同一类型的整数,支持如下三种长度的整数:

  1. #define INTSET_ENC_INT16 (sizeof(int16_t))  
  2. #define INTSET_ENC_INT32 (sizeof(int32_t))  
  3. #define INTSET_ENC_INT64 (sizeof(int64_t))  

intset是一个有序集合,查找元素的复杂度为O(logN),但插入时不一定为O(logN),因为有可能涉及到升级操作。比如当集合里全是int16_t型的整数,这时要插入一个int32_t,那么为了维持集合中数据类型的一致,那么所有的数据都会被转换成int32_t类型,涉及到内存的重新分配,这时插入的复杂度就为O(N)了。

intset不支持降级操作。

  • 有序集合对象

有序集合的编码可能两种,一种是ziplist,另一种是skiplist与dict的结合。

ziplist作为集合和作为哈希对象是一样的,member和score顺序存放。按照score从小到大顺序排列

skiplist是一种跳跃表,它实现了有序集合中的快速查找,在大多数情况下它的速度都可以和平衡树差不多。但它的实现比较简单,可以作为平衡树的替代品。它的结构比较特殊。下面分别是跳跃表skiplist和它内部的节点skiplistNode的结构体:

  1. /*  
  2. * 跳跃表  
  3. */  
  4. typedef struct zskiplist {  
  5. // 头节点,尾节点  
  6. struct zskiplistNode *header, *tail;  
  7. // 节点数量  
  8. unsigned long length;  
  9. // 目前表内节点的最大层数  
  10. int level;  
  11. } zskiplist;  
  12. /* ZSETs use a specialized version of Skiplists */  
  13. /*  
  14. * 跳跃表节点  
  15. */  
  16. typedef struct zskiplistNode {  
  17. // member 对象  
  18. robj *obj;  
  19. // 分值  
  20. double score;  
  21. // 后退指针  
  22. struct zskiplistNode *backward;  
  23. // 层  
  24. struct zskiplistLevel {  
  25. // 前进指针  
  26. struct zskiplistNode *forward;  
  27. // 这个层跨越的节点数量  
  28. unsigned int span;  
  29. } level[];  
  30. } zskiplistNode;  

head和tail分别指向头节点和尾节点,然后每个skiplistNode里面的结构又是分层的(即level数组)

用图表示,大概是下面这个样子:

总结

以上简单介绍了Redis的简介,特性以及五种对象类型和五种对象类型的底层实现。事实上,Redis的高效性和灵活性正是得益于同一个对象类型采用不同的底层结构,并且在必要的时候对二者进行转换,还有就是各种底层结构对内存的合理利用。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读