哈希对象的编码有两种:ziplist.hashtable. 编码一:ziplist ziplist 已经是我们的老朋友了,它一出现,那肯定就是为了节省内存啦.那么哈希对象是怎么用 ziplist 存储的呢? 每次插入键值对的时候,在 ziplist 列表末尾,挨着插入 field 和 value .如下图: 常见操作 增删改查都涉及到一块很类似的代码,那就是查找. redis 这几个函数的查找部分,几乎都是直接复制粘贴...可能有改动就有点难维护了. 获取 先从 ziplist 中拿到 fiel…
目录 字符串类型(String) 散列类型(Hash) 列表类型(List) 集合类型(Set) 有序集合类型(SortedSet) 其它命令 一.字符串类型(String) 1.介绍: 字符串类型是 Redis 中最基本的数据类型,可以存储二进制数据.图片和 Json 的对象. 字符串类型也是其他 4 种数据库类型的基础,其它数据类型可以说是从字符串类型中进行组织的,如:列表类型是以列表的形式组织字符串,集合类型是以集合的形式组织字符串. 2.命令: [备注]包括 INCR 在内的所有 Red…
前文 Redis 设计与实现 2:Redis 对象 说到,五大数据类型都会封装成 RedisObject. typedef struct redisObject { unsigned type:4; // 类型 unsigned encoding:4; // 编码 // ... void *ptr; // 指向具体底层数据的指针 } robj; 不同数据类型的主要区别就是 type 和 encoding 属性的差异,同一种数据类型,有不同的编码. 一.编码类型 字符串的编码有raw.embstr…
前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构.在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象系统也就是前面说的五大数据类型,每一种数据类型都至少用到了一种数据结构.通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型判断一个对象是否可以执行给定的命令,而且可以针对不同的场景,为对象设置多种不同的数据结构,从而优化对象在不同场景下的使用效率. 1.对象的类型与编码 Red…
目录 1.对象的类型与编码 ①.type属性 ②.encoding 属性和 *prt 指针 2.字符串对象 3.列表对象 4.哈希对象 5.集合对象 6.有序集合对象 7.五大数据类型的应用场景 8.内存回收和内存共享 ①.内存回收 ②.内存共享 9.对象的空转时长 前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构.在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象系统也就是前面说的五大数据类型…
1.对象的类型与编码 Redis使用前面说的五大数据类型来表示键和值,每次在Redis数据库中创建一个键值对时,至少会创建两个对象,一个是键对象,一个是值对象,而Redis中的每个对象都是由 redisObject 结构来表示: typedef struct redisObject{ //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层数据结构的指针 void *ptr; //引用计数 int refcount; //记录最后一次被程序访问…
列表对象有 3 种编码:ziplist.linkedlist.quicklist. ziplist 和 linkedlist 是 3.2 版本之前的编码. quicklist 是 3.2 版本新增的编码,ziplist 和 linkedlist 在 3.2 版本及后续版本将不再是列表对象的编码. 编码定义如下(server.h): #define OBJ_ENCODING_LINKEDLIST 4 #define OBJ_ENCODING_ZIPLIST 5 #define OBJ_ENCODI…
集合对象的编码有两种:intset 和 hashtable 编码一:intset intset 的结构 整数集合 intset 是集合底层的实现之一,从名字就可以看出,这是专门为整数提供的集合类型. 其结构定义如下,在 intset.h: typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset; contents…
有序集合 sorted set (下面我们叫zset 吧) 有两种编码方式:压缩列表 ziplist 和跳表 skiplist. 编码一:ziplist zset 在 ziplist 中,成员(member)和分数(score)是挨在一起的,元素按照分数从小到大存储. 举个例子,我们用以下命令创建一个zset: redis> ZADD key 26.1 z 1 a 2 b (integer) 3 那么这个zset的结构大致如下: 下面我们来分析一下 zscore 命令的源码,进一步了解 zset…
1.NoSQL数据库简介 解决应用服务器的CPU和内存压力:解决数据库服务的IO压力: ----->>> ① session存在缓存数据库(完全在内存里),速度快且数据结构简单: 打破了传统关系型数据库以业务逻辑为依据的存储模式,而针对不同数据结构类型改为以性能为最优先的存储方式--非关系型数据库K, V. ② 缓存数据库:减少io的读操作(缓存数据库中有的直接从缓存数据库里边去取,没有再去数据库里边查找,减少了IO的操作): 列式数据库如Hbase.文档数据库Mongodb:水平切分.…