一.概述

  在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串、链表(双端链表)、字典、跳跃表、 整数集合、压缩列表(后面再了解)。Redis没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建一个对象系统,这个系统对象包括:字符串对象、列表对象、哈希对象(散列)、集合对象、有序集合对象这五种类型,每种类型对象都用到了至少一种前面所介绍的数据结构。

  通过这五种不同类型的对象,可以针对不同的使用场景, 在Redis 内部会为对象设置不同的数据结构实现,从而优化对象在不同场景下的使用效率。下面先直观看下关系图(五种对象与type与encoding编码与ptr底层数据结构),然后再来详细介绍它们之间的关系。

        

二. 对象类型与编码(五种类型的对象)

  Redis中的每个对象都由一个RedisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性、ptr属性。

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

  2.1  type类型

  对象的type属性记录了对象的类型,对于键来说它总是一个字符串对象,而值可以是五种类型,这五种类型如下表格:

type取值的类型常量

五种对象的名称

Type命令输出

Redis_string

字符串对象

string

Redis_list

列表对象

list

Redis_hash

哈希对象

hash

Redis_set

集合对象

set

Redis_zset

有序集合对象

zset

  例1: 下面使用type命令,该命令返回结果为数据库键对应的值对象类型,而不是键对象的类型。

-- 值为字符串对象
127.0.0.1:> set msg "hello world"
OK
127.0.0.1:> type msg
string -- 值为列表对象
127.0.0.1:> rpush number
(integer)
127.0.0.1:> type number
list -- 值为哈希对象
127.0.0.1:> hmset profile name tom age career programmer
OK
127.0.0.1:> type profile
hash -- 值为集合对象
127.0.0.1:> sadd fruit apple banana cherry
(integer)
127.0.0.1:> type fruit
set -- 值为有序集合对象
127.0.0.1:> zadd price 8.50 apple 3.30 banana
(integer)
127.0.0.1:> type price
zset

  2.2 编码和底层实现(encoding, ptr)

    对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定,encoding记录了对象所使用的编码。使用object encoding命令查看不同编码的输出。表格如下:

    (1) 底层数据结构与encoding编码的对应关系:

底层数据结构

encoding编码常量取值

object encoding 输出

整数

Redis_encoding_int

int

Embstr编码的SDS字符串(长字符值)

Redis_encoding_embstr

embstr

SDS字符串

Redis_encoding_raw

raw

字典

Redis_encoding_ht

hashtable

链表

Redis_encoding_linkedlist

linkedlist

压缩列表

Redis_encoding_ziplist

ziplist

整数集合

Redis_encoding_intset

intset

跳跃表和字典

Redis_encoding_skiplist

skiplist

    (2) 五种对象类型与encoding编码的对应关系

五种对象类型常量

对应encoding编码常量

对象说明

Redis_string

Redis_encoding_int

使用整数值实现的字符串对象

Redis_string

Redis_encoding_embstr

使用embstr编码的简单动态字符串实现的字符串对象

Redis_string

Redis_encoding_raw

使用简单动态字符串实现的字符串对象

Redis_list

Redis_encoding_ziplist

使用压缩列表实现的列表对象

Redis_list

Redis_encoding_linkedlist

使用双端链表实现的列表对象

Redis_hash

Redis_encoding_ziplist

使用压缩列表实现的哈希对象

Redis_hash

Redis_encoding_ht

使用字典实现的哈希对象

Redis_set

Redis_encoding_intset

使用整数集合实现的集合对象

Redis_set

Redis_encoding_ht

使用字典实现的集合对象

Redis_zset

Redis_encoding_ziplist

使用压缩列表实现的有序集合对象

Redis_zset

Redis_encoding_skiplist

使用跳跃表和字典实现的有序集合对象

    例2: 下面使用object encoding命令,该命令查看一个数据库键的值对象的编码:

127.0.0.1:> set msg "hello wrold"
OK
127.0.0.1:> object encoding msg
"embstr" 127.0.0.1:> set story "long long long long long long long long long ..."
OK
127.0.0.1:> object encoding story
"raw"
127.0.0.1:> sadd num
(integer)
127.0.0.1:> object encoding num
"intset" 127.0.0.1:> sadd num "one"
(integer)
127.0.0.1:> object encoding num
"hashtable" 127.0.0.1:> zadd fruit-price 5.0 banana 6.5 cherry 8.0 apple
(integer)
127.0.0.1:> object encoding fruit-price
"ziplist" 127.0.0.1:> rpush integers "" "" "" "" "" "" "" "" "" ""
(integer)
127.0.0.1:> object encoding integers
"quicklist"

   

  总结:通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大提升了redis的灵活性和效率。例如:上面演示的zadd fruit-price 添加列表元素,redis使用压缩列表作为列表对象的底层实现,因为压缩列表比链表更节约内存,并且在元素数量较少时,在内存中以连续块方式保存的压缩列表比链表可以更快被载入到缓存中。但随着列表对象元素越来越多时,这种压缩优势就会消失,此时对象就会将底层实现从压缩列表转向链表。 其它类型的对象也会通过使用多种不同的编码来进行类似的优化。

    使用对象key通过Type命令查看value值的对象类型,通过object encoding命令查看value值的底层数据结构。

redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系的更多相关文章

  1. Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构

    一.提高Redis使用性能秘诀 KEY尽量少的原则,能放在1个KEY的就放入1个KEY,KEY开销很大尽量减少与Redis发生的交互次数,能批量的就批量,能事务.管道的就事务.管道从业务架构分析确定使 ...

  2. redis系列之------对象

    前言 Redis 并没有直接使用数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象, 每种对象都 ...

  3. 浅谈Redis五个对象类型的底层原理

    本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html Redis是一种key/value型数据库,其 ...

  4. redis列表和有序集合

    redis中的list数据类型是可以插入重复数据的,有去重的需求的话可以用redis有序集合数据类型 Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中. 如果某个成员已经是 ...

  5. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  6. Redis对象类型

    Redis对象类型 Redis基于基础的数据结构创建的对象: 字符串对象. 列表对象. 哈希对象. 集合对象 有序集合对象. 对象回收:Redis对象系统实现了基于引用计数技术的内存回收机制,当程序不 ...

  7. 一文读懂Redis常见对象类型的底层数据结构

    Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...

  8. 五:python 对象类型详解二:字符串(上)

    一:常量字符串 常量字符串用起来相对简单,也许最复杂的事情就是在代码中有如此多的方法来编写它们. eg:单引号:'spam"m'   , 双引号: “spa'm” , 三引号:‘’‘... ...

  9. Redis 系列(02)数据结构

    目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...

随机推荐

  1. Java中超大文件读写

    如果文件过大不能一次加载,就可以利用缓冲区: File file = new File(filepath); BufferedInputStream fis = new BufferedInputSt ...

  2. windows下apache+https环境配置

    windows下apache+https环境配置 转 https://www.cnblogs.com/sandaizi/p/7519370.html 1.修改配置文件conf/httpd.conf,去 ...

  3. PC端问题列表及解决方案

    一.CSS相关 1.PC站百度文件引用不到,出现报错,问题可能是电脑拦截了百度广告. 解决方案:把拦截广告的浏览器插件关掉. 2.ie6双倍边距:在使用了float的情况下,不管是向左还是向右都会出现 ...

  4. layedit第三次改造

    原文链接:http://www.bianbingdang.com/article_detail/105.html 作为技术人员,在网上写代码,常常涉及代码块的编写.一个好的代码块,让页面美化很多. 由 ...

  5. # xrdp 在linux deploy 折腾记录

    xrdp 在linux deploy 折腾记录 1. xrdp connect fail vnc 不管用tiger or vnc4server都可以正常用,但xrdp无法连接 netstat -tnl ...

  6. 12-JSP&EL&JSTL

    JSP & EL & JSTL jsp Java Server Page 什么是jsp 从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了se ...

  7. 初入linux系统

    作为微软的老铁粉了,看到微软进军linux这么久了,是时候该跟上脚本了,不然该落后了,脚步是如此之快,着实让我吃了一惊,说干就干, 绝不是开玩笑的,谁也阻止不了.net开源,跨平台的脚步了.以前别人说 ...

  8. nodejs操作mysql常见错误

    1.Cannot enqueue Handshake after already enqueuing a Hand shake.这个错误提示意思是某个数据库连接已经执行了,不能进行多次连接了.遇到此类 ...

  9. layui layer弹框中表格的显示

    场景描述:点击iframe里面的一个按钮,需要在父级弹出一个弹框表格. 问题描述:这个弹框的分页不能正常显示,如果把layer.open前面的parent去掉,就可以正常显示. 代码展示: paren ...

  10. window server 2008 安装Oracle10g

    oracle安装都大同小异. 开始安装步骤 输入完之后点击下一步 这时候稍等一会儿. 这时候也要稍等一会儿. 直接安装. 设置口令管理,设置SCOTT的密码为tiger就好了. 这时候稍等一会儿. o ...