今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 《Redis 设计与实现(第一版)》

于是决定从这个开始入门。

1.数据类型定义

typedef char *sds;

struct sdshdr {

    // buf 已占用长度
int len; // buf 剩余可用长度
int free; // 实际保存字符串数据的地方
char buf[];
}; 2.重新计算新的长度
newlen = sdshdr.len + required_len
if newlen < SDS_MAX_PREALLOC:
newlen *= 2
else:
newlen += SDS_MAX_PREALLOC 3. 关于这种分配策略会浪费内存吗?
执行 APPEND 命令的字符串键数量通常并不多, 占用内存的体积通常也不大, 所以这一般并不算什么问题
如果执行 APPEND 操作的键很多, 而字符串的体积又很大的话, 那可能就需要修改 Redis 服务器, 让它定时释放一些字符串键的预分配空间, 从而更有效地使用内存。

小结

  • Redis 的字符串表示为 sds ,而不是 C 字符串(以 \0 结尾的 char*)。
  • 对比 C 字符串, sds 有以下特性:
    • 可以高效地执行长度计算(strlen);
    • 可以高效地执行追加操作(append);
    • 二进制安全;
  • sds 会为追加操作进行优化:加快追加操作的速度,并降低内存分配的次数,代价是多占用了一些内存,而且这些内存不会被主动释放。
												

最新文章

  1. 《App研发录》面世
  2. 微信支付JSAPI模式及退款CodeIgniter集成篇
  3. 使用bat/vbs/ahk对Windows下进行自动化操作
  4. [转]libevent简介和使用
  5. ArcEngine批量添加XY数据
  6. 手机信号强度单位dB、dBm和asu
  7. Objective-C 学习记录6--dictionary
  8. Tcp/Ip协议族简单解读及网络数据包/报/帧数据格式及封装及解包;
  9. git fetch 拉取而不合并
  10. 【Android】数据库的简单应用——创建数据库
  11. ArcGis : unable to save as template this document is already based on another template
  12. &amp;quot;蓝筹&amp;quot;如何使程序猿?
  13. MyEclipse导入Maven项目报错 Plugin execution not covered by lifecycle configuration:
  14. MySql 跟踪命令
  15. 微信小程序教程(第四篇)
  16. web前端笔记整理一---HTML
  17. Hibernate持久化对象的三种状态深入理解
  18. flex 输入框布局
  19. 快速构建一个使用axios的vue应用程序(转)
  20. 『实践』Matlab实现Flyod求最短距离及存储最优路径

热门文章

  1. Ubuntu 16.04粘贴板增强工具Diodon
  2. JFinal Weixin 微信极速 SDK
  3. mysql: reinit the password
  4. [教程] NETGEAR R7800 路由器TFTP刷机方法(适用于.img格式固件各种刷)
  5. HTTP请求方式之GET和POST比较
  6. Ubuntu 16.04 LTS 搭建LAMP
  7. iOS开发 - NSScanner的使用方法
  8. java8-接口变化-默认方法-静态方法
  9. Array.Copy vs Buffer.BlockCopy
  10. ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?