手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Redis中的数据对象

[日期:2017-06-25] 来源:Linux社区  作者:leriou [字体: ]

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_INTlong型的整数
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. 对于元素都是纯数字类型的, 例如,'1','2'这种会使用int类型存储,redis默认初始化了10000个数字对象
  2. 对于长度小于32的字符串类型,例如'hello',redis会使用embstr类型存储数据
  3. 对于长度超过32的使用row存储原字符

ps: embstr类型的字符串在修改后总会变成row编码类型

列表

列表的编码可以是linkedlist或者ziplist

  1. 当列表对象保存的所有字符串长度小于64字节
  2. 当列表对象保存的元素数量小于512个的时候

这个时候会使用,ziplist来作为列表对象的编码, 当不满足这两个条件的时候使用linkedlist

ps:这两个值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries

哈希对象

哈希对象的编码可以是ziplist或者hashtable

字典的每一个键和值都是一个字符串对象

  1. 哈希对象保存的所有键和值的长度都小于64字节
  2. 哈希对象保存的键值对数量小于512个的时候

满足以上两个条件,使用ziplist存储,否则采用hashtable存储

ps:这两个值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries

集合

集合对象的编码可以是intset或者hashtable

当集合对象满足以下两个条件的时候采用intset

  1. 集合对象保存的元素都是整数
  2. 集合对象保存的元素数量不超过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编码

  1. 有序集合元素数量小于128
  2. 有序集合元素长度小于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

linux
相关资讯       Redis数据对象 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款