redis的基本数据结构是动态数组

一、c语言动态数组

先看下一般的动态数组结构

struct MyData
{
int nLen;
char data[];
};  

这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:

1.不需要初始化,数组名直接就是所在的偏移  
2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间。 

这个数组不占用任何内存,意味着这样的结构节省空间;

该数组的内存地址就和他后面的元素的地址相同,意味着无需初始化,数组名就是后面元素的地址,直接就能当做指针使用。

这样的写法最适合制作动态buffer。因为可以这样分配空间:   malloc(sizeof(struct  XXX)+  buff_len);   看出来好处没有?直接就把buffer的结构体和缓冲区一块分配了。用起来也非常方便,因为现在空数组其实变成了buff_len长度的数组了。   这样的好处是:   一次分配解决问题,省了不少麻烦。大家知道为了防止内存泄漏,如果是分两次分配(结构体和缓冲区),那么要是第二次malloc失败了,必须回滚释放第一个分配的结构体。这样带来了编码麻烦。

其次,分配了第二个缓冲区以后,如果结构里面用的是指针,还要为这个指针赋值。同样,在free这个buffer的时候,用指针也要两次free。如果用空数组,所有问题一次解决。

其次,大家知道小内存的管理是非常困难的,如果用指针,这个buffer的struct部分就是小内存了,在系统内存在多了势必严重影响内存管理的性能。要是用空数组把struct和实际数据缓冲区一次分配大块问题,就没有这个问题。     如此看来,用空数组既简化编码,又解决了小内存碎片问题提高了性能,何乐不为?应该广泛采用。

二、Redis数据类型定义

sds(Simple Dynamic Strings)是 Redis中最基本的底层数据结构, 它既是 Redis 的 String 类型的底层实现, 也是实现 Hash 、 List 和 Set 等复合类型的基石。

除此之外,sds 还是 Redis 内部实现所使用的字符串类型,

//与 sds 实现有关的数据类型有两个,一个是 sds :
// 字符串类型的别名
typedef char *sds; //另一个是 sdshdr :
// 持有 sds 的结构
struct sdshdr
{
  int len; // buf 中已被使用的字符串空间数量
  int free; // buf 中预留字符串空间数量
  char buf[]; // 实际储存字符串的地方
};
  

//与 sds 实现有关的数据类型有两个,一个是 sds :
// 字符串类型的别名
typedef char *sds;
 
//另一个是 sdshdr :
// 持有 sds 的结构
struct sdshdr
{
  int len; // buf 中已被使用的字符串空间数量
  int free; // buf 中预留字符串空间数量
  char buf[]; // 实际储存字符串的地方
};

最新文章

  1. [转]复制虚拟机后linux中的eth0变成eth1问题
  2. SVD
  3. angular.js form
  4. spring读取properties的方法
  5. JDBC事务控制管理
  6. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)
  7. Python的模块,模块的使用、安装,别名,作用域等概念
  8. 刚開始学习的人制作VMOS场效应管小功放
  9. net.sf.json 迄今 时刻 格式 办法
  10. loadrunner必用函数web_reg_save_param获取多个符合边界值条件的使用方法
  11. Katana-CookieAuthenticationMiddleware-源码浅析
  12. 用vue2.x注册一个全局的弹窗alert组件
  13. maven构建项目时硬编码中文乱码问题解决
  14. LVS+Keepalived+Mysql+主主数据库架构[2台]
  15. leetcode1023
  16. hdu 2444 The Accomodation of Students 【二分图匹配】
  17. mvn deploy 推送到私有仓库,注意当前日期
  18. 【Android】android string.xml前后加空格的技巧
  19. 20155333 2016-2017-2 《Java程序设计》第十周学习总结
  20. open() 函数以 w+ 模式打开文件

热门文章

  1. poj: 2262
  2. Extjs布局
  3. HDU 1724 Ellipse(数值积分の辛普森公式)
  4. 三台CentOS 5 Linux LVS 的DR 模式http负载均衡安装步骤
  5. 软件需求分析之NABCD模型
  6. mysql+keepalived主从切换脚本 转
  7. oracle 定时备份
  8. 修改Linux时间一般涉及到3个命令: date, clock, hwclock
  9. Android系统版本与API Level对照表
  10. ecshop第一讲之安装