redis 中有五种常用对象
我们所说的对象的类型大多是值的类型, 键的类型大多是字符串对象, 值得类型大概有以下几种, 但是无论哪种都是基于 redisObject 实现的
redisObject 的结构如下
- typedef struct redisObject {
- unsigned type: 4; //类型 有五种,分别对应五种常见的值类型
- unsigned encoding: 4; // 编码,标明底层数据结构的类型
- unsigned lru: LRU_BITS;
- /* LRU time (relative to global lru_clock) or
- * LFU data (least significant 8 bits frequency
- * and most significant 16 bits decreas time). */
- int refcount; //引用计数
- void * ptr; // 存储结构指针
- }
- robj;
type 的可选值有五种. 分别是
- REDIS_STRING,
- REDIS_LIST,
- REDIS_SET,
- REDIS_ZSET,
- REDIS_HASH
encoding 的可选值有八种
REDIS_ENCODING_INT | long 型的整数 |
---|---|
REDIS_ENCODING_EMBSTR | embstr 编码的简单动态字符串 |
REDIS_ENCODING_ROW | 简单动态字符串 |
REDIS_ENCODING_LINKEDLIST | 双端链表 |
REDIS_ENCODING_HH | 字典 |
REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ENCODING_INTSET | 整数集合 |
REDIS_ENCODING_SKIPLIST | 跳跃表 |
type 和 encoding 共同决定了数值对象的底层结构和存储
字符串对象的编码可以是 int,embstr 和 row
redis 中的字符串对象是最常用的数据对象之一, redis 中的许多键都是采用的字符串对象
字符串类型在 redis 中根据情况不同有 3 中情况
ps: embstr 类型的字符串在修改后总会变成 row 编码类型
列表的编码可以是 linkedlist 或者 ziplist
这个时候会使用, ziplist 来作为列表对象的编码, 当不满足这两个条件的时候使用 linkedlist
ps: 这两个值是更改的, list-max-ziplist-value 和 list-max-ziplist-entries
哈希对象的编码可以是 ziplist 或者 hashtable
字典的每一个键和值都是一个字符串对象
满足以上两个条件, 使用 ziplist 存储, 否则采用 hashtable 存储
ps: 这两个值是更改的, hash-max-ziplist-value 和 hash-max-ziplist-entries
集合对象的编码可以是 intset 或者 hashtable
当集合对象满足以下两个条件的时候采用 intset
不满足以上两个条件都是用 hashtable 存储
ps: 该数值可以使用 set-max-intset-entries 设置
有序集合对象的编码可以是 ziplist 或者 skiplist
有序集合对象跟前面的几个对象不大一样
- typedef struct zset {
- zskiplist * zsl;
- dict * dict;
- }
- zset;
zsl 中保存一个跳跃表, 表节点的对象即使键, score 即是分值, 该结构主要为 zrange,zrank 等函数服务
同时还保存一个 dict,dict 中也保存有键和对应的分值, 获取某键的函数 zscore 使用这个结构,
同时持有字典和跳跃表是为了性能考虑
当有序集合满足一下两个条件时候, 使用 ziplist 编码
不能满足以上两个条件的使用 skiplist
redis 的对象资源垃圾回收是基于引用计数
当一个对象被使用一次, 引用计数增加 1
当一个引用被销毁, 对象的引用计数会减 1
当一个对象的引用计数为 0, 会被销毁
redis 默认创建了 0 到 9999 的数字对象供 1 万个
其他用到这些对象的时候可以不用创建新对象, 直接使用已有的对象。
下面关于 Redis 的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm
CentOS 7 下 Redis 的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm
Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm
Ubuntu 16.04 环境中安装 php7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Redis 单机 & 集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm
CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm
Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm
来源: http://www.linuxidc.com/Linux/2017-06/145174.htm