共计 2676 个字符,预计需要花费 7 分钟才能阅读完成。
redis 对象
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 中情况
- 对于元素都是纯数字类型的, 例如,’1′,’2’ 这种会使用 int 类型存储,redis 默认初始化了 10000 个数字对象
- 对于长度小于 32 的字符串类型, 例如 ’hello’,redis 会使用 embstr 类型存储数据
- 对于长度超过 32 的使用 row 存储原字符
ps: embstr 类型的字符串在修改后总会变成 row 编码类型
列表
列表的编码可以是 linkedlist 或者 ziplist
- 当列表对象保存的所有字符串长度小于 64 字节
- 当列表对象保存的元素数量小于 512 个的时候
这个时候会使用,ziplist 来作为列表对象的编码, 当不满足这两个条件的时候使用 linkedlist
ps: 这两个值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries
哈希对象
哈希对象的编码可以是 ziplist 或者 hashtable
字典的每一个键和值都是一个字符串对象
- 哈希对象保存的所有键和值的长度都小于 64 字节
- 哈希对象保存的键值对数量小于 512 个的时候
满足以上两个条件, 使用 ziplist 存储, 否则采用 hashtable 存储
ps: 这两个值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries
集合
集合对象的编码可以是 intset 或者 hashtable
当集合对象满足以下两个条件的时候采用 intset
- 集合对象保存的元素都是整数
- 集合对象保存的元素数量不超过 512 个
不满足以上两个条件都是用 hashtable 存储
ps: 该数值可以使用 set-max-intset-entries 设置
有序集合
有序集合对象的编码可以是 ziplist 或者 skiplist
有序集合对象跟前面的几个对象不大一样
typedef struct zset{
zskiplist *zsl;
dict *dict;
} zset;
zsl 中保存一个跳跃表, 表节点的对象即使键,score 即是分值, 该结构主要为 zrange,zrank 等函数服务
同时还保存一个 dict,dict 中也保存有键和对应的分值, 获取某键的函数 zscore 使用这个结构,
同时持有字典和跳跃表是为了性能考虑
当有序集合满足一下两个条件时候, 使用 ziplist 编码
- 有序集合元素数量小于 128
- 有序集合元素长度小于 64
不能满足以上两个条件的使用 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