Redis对象(一) - 类型和编码

对象

前边学习了Redis底层实现的各种数据结构, 包括SDS, list, skiplist, dict, intset, ziplist等, 但redis并未直接使用这些数据结构来构建数据库、而是基于这些数据结构构建了一个对象系统, 这个系统包括 字符串对象, 列表对象, hash对象, 集合对象, 有序集合对象这五种类型的对象.

通过这5种不同的对象、Redis可以在执行命令前, 根据对象的类型来判断一个对象是否可以执行给定的命令, 使用对象的另一个好处是, 可以针对不同的使用场景、为对象设置不同的数据结构的实现、优化对象在不同使用场景下的使用效率.

此外、Redis的对象系统还实现了基于引用计数技术的内存回收机制、当程序不再使用某个对象时、对象占用的内存会被自动释放, 且: Redis 还通过引用计数技术实现了对象共享机制, 可以在适当调节下、让多个数据库键共享同一个对象来节约内存

Redis的对象带有访问时间记录信息, 该信息可以用于计算数据库键的空转时长, 在服务器启用了 maxmemory功能的情况下、空转时长较大的键会被优先删除

对象的类型和编码

Redis使用对象表示数据库中的键和值, 当在redis数据库中创建一个键值对时、至少会创建两个对象: 键对象 和 值对象. eg. Set 命令在数据库中创建一个键值对

redis> set msg "hello world"
OK

就包含了一个键对象msg的字符串对象 和 一个值对象 hello world

Redis中每个对象由一个redisObject结构表示, 和保存数据有关的3个属性分表是 type属性encoding属性ptr属性

typedef struct redisObject {
  unsigned type:4; // 类型
  unsigned encoding:4; // 编码
  void *ptr; // 指向底层实现数据结构的指针
  //...
}
类型

对象的type属性记录了对象的类型, 属性值可以是下边任何一个

类型常量 对象名称 type命令输出
REDIS_STRING 字符串对象 String
REDIS_LIST 列表对象 List
REDIS_HASH hash对象 Hash
REDIS_SET 集合对象 Set
REDIS_ZSET 有序集合对象 Zset

对于Redis保存的键值对来说、键总是一个字符串对象, 而值则可以是上边任意一种对象, 所以:

  1. 当我们称呼一个键为字符串键时, 指的是对应的值是字符串对象
  2. 当我们称呼一个键为列表键时, 指的是对应的值是列表对象

type命令的实现方式与此类似, 执行type命令返回的是值对象的类型, 而不是键对象的类型

编码和底层实现

对象的ptr指针指向对象的底层实现数据结构, 而这些数据结构由对象的encoding属性决定,

encoding属性记录了对象使用的编码, 即 对象使用了什么数据结构作为对象的底层实现, 可以是下表的任意一个

编码常量 编码对应的底层数据结构
REDIS_ENCODING_INT long类型的整数
REDIS_ENCODING_EMBSTR embstr编码的简单动态字符串
REDIS_ENCODING_RAW 简单动态字符串
REDIS_ENCODING_HT 字典
REDIS_ENCODING_LIKEDLIST 双端链表
REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ENCODING_INTSET 整数集合
REDIS_ENCODING_SKIPLIST 跳表

Reids每种类型的对象都至少使用了2种不同的编码

类型 编码 对象
redis_string redis_encoding_int<br />redis_encoding_embstr
redis_encoding_raw
使用整数值实现的字符串对象<br />使用embstr编码的简单动态字符串
用简单动态字符串实现的字符串对象
redis_list redis_encoding_ziplist<br />redis_encoding_linkedlist 使用压缩列表实现的列表对象<br />使用双端链表实现的列表对象
redis_hash redis_encoding_ziplist<br />redis_encoind_ht 使用压缩列表实现的hash对象<br />使用字典实现的hash对象
redis_set redis_encoding_intset<br />redis_encoding_ht 使用整数集合实现的集合对象<br />使用字典实现的集合
redis_zset Redis_encoding_ziplist
redis_encoding_skiplist
使用压缩列表实现的有序集合对象
使用跳表实现的有序集合对象

使用object encoding命令可以查看一个数据库键的值对象编码

redis> set msg "hello world"
OK

redis> object encoding msg
"embstr"

redis> set story "long long long ..."
OK

redis> object encoding story
"raw"

通过encoding属性来设定对象使用的编码、而不是为特定类型的对象关联一种固定的编码、极大的提高了redis的灵活性和效率, 允许redis在特定场景下未一个对象设置不同的编码, 优化使用效率.

eg. 在列表包含对象较少时, redis使用压缩列表作为底层实现, 因为:

  1. 压缩列表比双端链表节省内存, 且元素数量少时、在内存中连续存储的压缩列表比双端链表可以更快的载入缓存
  2. 随元素增多、使用压缩列表保存元素的优势消失时、对象会将底层实现从压缩列表转向功能更强、也适合保存大量元素的双端链表上

其它类型的对象也会使用不同类型的编码进行类似的优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Redis 是一个键值对数据库(key-value DB),数据库的值可以是字符串、集合、列表等多种类型的对象,而...
    吴昂_ff2d阅读 3,071评论 0 5
  • 对象 当称呼一个数据库键为"字符串键"、"列表键"时,指的是这个键对应的值为"字符串对象"、"列表对象"。 Red...
    xMustang阅读 256评论 0 0
  • 转载:可能是目前最详细的Redis内存模型及应用解读 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据...
    jwnba24阅读 620评论 0 4
  • 很长一段时间没写字,大伙一定问我干嘛去了呢。先卖个关子,一直以来我都羡慕学经济学市场的人。觉得他们学的东西紧贴...
    芳悦之境阅读 732评论 0 1
  • 🍋.🍉.🍊 距离上一次写香水,已经过去快2年了。期间还收到了朋友的催稿~ 其实爱用的香水基本没怎么变,购入了1-2...
    一只兔呀zZ阅读 246评论 0 0