博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Redis 设计与实现》- 第 1 章:数据结构与实现
阅读量:6072 次
发布时间:2019-06-20

本文共 1476 字,大约阅读时间需要 4 分钟。

@(Redis 笔记)[Redis, 数据库]

Redis 对象

  1. Redis 中使用对象表示数据库中的键和值,每创建一个键值对,至少创建 2 个对象。

  2. 对象的 type 属性记录了对象的类型,有 5 种:

    类型常量 对象
    REDIS_STRING 字符串对象
    REDIS_LIST 列表对象
    REDIS_HASH 哈希对象
    REDIS_SET 集合对象
    REDIS_ZSET 有序集合对象
  3. 编码与底层实现:对象的 ptr 指针指向对象的底层实现数据结构,数据结构由对象的 encoding 属性决定。 encoding 属性记录了对象所使用的编码,即该对象是用什么类型的数据结构决定的。

    类型常量 编码 对象
    REDIS_STRING REDIS_ENCODING_INT 整数值实现的字符串对象
    REDIS_STRING REDIS_ENCODING_EMBSTR 使用 embstr 编码的简单动态字符串实现的字符串对象
    REDIS_STRING REDIS_ENCODING_RAW 简单动态字符串实现的 字符串对象
    -- -- --
    REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表对象
    REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表列表对象
    -- -- --
    REDIS_HASH REDIS_ENCODING_ZIPLIST 使用压缩列表实现的哈希对象
    REDIS_HASH REDIS_ENCODING_HT 使用字典实现的哈希对象
    -- -- --
    REDIS_SET REDIS_ENCODING_INTSET 使用整数实现的集合对象
    REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象
    -- -- --
    REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用压缩列表实现的有序集合对象
    REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳跃表实现的有序集合对象

简单动态字符串 SDS

  • Redis 中没有采用 C 字符串,而是自己构建了 SDS
  • C 字符串应用在一些字符串常量值,不需要修改
  1. sds.h/sdshdr 结构表示一个 SDS:
// 总长度为 len + free + 1, 1 用于存储 /0struct sdshdr {	// 1. sds 中已使用的字节	int len;	// 2. sds 中空闲的字节	int free;	// 3. 字符串	char buf[];}复制代码
  1. SDSC string 区别:
  • SDS 获取字符串长度的时间为 O(1)
  • SDS 记录字符串长度,可以防止缓冲区溢出
  • 减少修改字符串时,导致的内存重分配次数:C 字符串增加元素而数组大小不够时,需要先扩展数组大小,否则会产生内存溢出。在删除元素时,若忘记释放内存,则会导致内存溢出。SDS 通过 lenfree ,解除了字符串长度与底层数组长度之间的关系。可以 实现空间预分配惰性空间释放 两种优化策略。
  • 空间与分配:扩展 SDS 时,会同时分配修改所需要的空间和额外未使用的空间。进行修改之后, SDSlen 将变成 13 字节, 那么程序也会分配 13 字节的未使用空间。
  • 惰性空间释放:缩短 SDS 时,不会直接回收内存,而是用 free 来收集空闲区域。
  • 二进制安全C字符串只能保存文本数据,会忽略 \0 以后的内容。
  • 兼容部分 C 字符串函数

转载地址:http://anfgx.baihongyu.com/

你可能感兴趣的文章
挨踢部落第一期:Spark离线分析维度
查看>>
bash之条件测试及if语句
查看>>
ldd命令,查看依赖的动态库信息 nm命令可以列出一个函数库文件中的符号表
查看>>
缓存实例的举例---java.lang.Integer类
查看>>
内存溢出之Tomcat内存配置-catalina.sh or catalina.bat
查看>>
mysql触发器总结
查看>>
我的友情链接
查看>>
Linux云计算架构师成长之路-第一章 计算机硬件基础-1.4 服务器主要部件
查看>>
json遍历
查看>>
Linux运维工程师面试题
查看>>
常用shell脚本
查看>>
10.31 springMVC 与 hibernate 配置
查看>>
总结最近学的struts学习笔记《1》
查看>>
windows server 2008系统IOS镜像下载地址
查看>>
Sharesdk 2.6.1 真坑
查看>>
python登录加随机验证码校验程序(装饰器内置函数的理解)
查看>>
adt 升级r22 之后ClassNotFoundException的解决方法
查看>>
脚本练习(1)
查看>>
Android_调试命令
查看>>
学习笔记之爬虫篇
查看>>