阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis中的数据对象

129次阅读
没有评论

共计 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. 对于元素都是纯数字类型的, 例如,’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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2676字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中