一.概述

  在前面章节中,主要了解了 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. 使用Cordova打包Vue项目

    因为公司项目要求, 原本的vue移动端项目, 现在要求能使用定位, 调用摄像头等功能, 并且开发成混合APP. 一个小白的孤军奋战史, 记录一下, 以备后用.... 第一步: 安装cordova 在命 ...

  2. jquery 操作服务端控件,select 控件

    <asp:DropDownList ID="ddl" runat="server"></asp:DropDownList> <se ...

  3. Html开发中document.getElementByTagName无法找到所有DOM元素的问题解决方法

    let eleList = document.querySelectorAll('li') for (let i = 0; i < eleList.length; i++) { // 遍历操作 ...

  4. Javascript Read Excel

    本文引用以下路径 https://www.cnblogs.com/liuxianan/p/js-excel.html

  5. mybatis 之数据库 include refid ="base_column_list"

    mybatis 之数据库 include refid ="base_column_list" 对于刚学习使用SSM框架的新手来说,mybatis中的数据库语句有点不一样,下面便是对 ...

  6. Round A - Kick Start 2019

    a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6 题意: ...

  7. React Native搭建开发环境 之 --走过的坑

    React Native是使用JavaScript和React编写原生移动应用 我的开发平台是基于windows系统,所以只支持android,要是想开发ios系统,那就只能考虑使用沙盒环境 接下来就 ...

  8. dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决,后面就没办法跟着做了

     Java Code  123456789101112 dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决 - test] Unknown error: Unable to build:  ...

  9. C++之几个最常

    1.同类对象间的数据共享——静态成员 静态数据成员声明静态数据成员要采用关键字static:类静态数据成员的定义和初始化定义:static 数据类型 成员名:初始化:数据类型 类名::静态数据成员名= ...

  10. Dora.Interception,为.NET Core度身打造的AOP框架 [5]:轻松地实现与其他AOP框架的整合

    这里所谓的与第三方AOP框架的整合不是说改变Dora.Interception现有的编程,而是恰好相反,即在不改变现有编程模式下采用第三方AOP框架或者自行实现的拦截机制.虽然我们默认提供基于IL E ...