Redis 中每个对象都由一个 redisObject 结构表示

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

type属性记录对象的类型

对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种。

字符串对象

字符串对象的编码可以是 int、raw 或者 embstr。

如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成long),并将字符串对象的编码设置为int。

如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw。

embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间中依次包含redisObject和sdshdr两个结构。

redis 127.0.0.1:> SET runoobkey redis
OK
redis 127.0.0.1:> GET runoobkey
"redis"

更多命令

http://www.runoob.com/redis/redis-strings.html

列表对象

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

当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:

·列表对象保存的所有字符串元素的长度都小于64字节;

·列表对象保存的元素数量小于512个;不能满足这两个条件的列表对象需要使用linkedlist编码。

redis 127.0.0.1:> LPUSH runoobkey redis
(integer)
redis 127.0.0.1:> LPUSH runoobkey mongodb
(integer)
redis 127.0.0.1:> LPUSH runoobkey mysql
(integer)
redis 127.0.0.1:> LRANGE runoobkey
) "mysql"
) "mongodb"
) "redis"

更多命令

http://www.runoob.com/redis/redis-lists.html

哈希对象

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

当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist编码:

·哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;

·哈希对象保存的键值对数量小于512个;不能满足这两个条件的哈希对象需要使用hashtable编码。

127.0.0.1:>  HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes  visitors
OK
127.0.0.1:> HGETALL runoobkey
) "name"
) "redis tutorial"
) "description"
) "redis basic commands for caching"
) "likes"
) ""
) "visitors"
) ""

更多命令

http://www.runoob.com/redis/redis-hashes.html

集合对象

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

集合成员是唯一的。

当集合对象可以同时满足以下两个条件时,对象使用intset编码:

·集合对象保存的所有元素都是整数值;

·集合对象保存的元素数量不超过512个。

不能满足这两个条件的集合对象需要使用hashtable编码。

redis 127.0.0.1:> SADD runoobkey redis
(integer)
redis 127.0.0.1:> SADD runoobkey mongodb
(integer)
redis 127.0.0.1:> SADD runoobkey mysql
(integer)
redis 127.0.0.1:> SADD runoobkey mysql
(integer)
redis 127.0.0.1:> SMEMBERS runoobkey
) "mysql"
) "mongodb"
) "redis"

更多命令

http://www.runoob.com/redis/redis-sets.html

有序集合对象

有序集合的编码可以是ziplist或者skiplist。

不允许重复的成员。

每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表

typedef struct zset {
zskiplist *zsl;
dict *dict;
} zset;

zset结构中的zsl跳跃表按分值从小到大保存了所有集合元素,每个跳跃表节点都保存了一个集合元素:跳跃表节点的object属性保存了元素的成员,而跳跃表节点的score属性则保存了元素的分值。通过这个跳跃表,程序可以对有序集合进行范围型操作,比如ZRANK、ZRANGE等命令就是基于跳跃表API来实现的。

除此之外,zset结构中的dict字典为有序集合创建了一个从成员到分值的映射,字典中的每个键值对都保存了一个集合元素:字典的键保存了元素的成员,而字典的值则保存了元素的分值。通过这个字典,程序可以用O(1)复杂度查找给定成员的分值,ZSCORE命令就是根据这一特性实现的,而很多其他有序集合命令都在实现的内部用到了这一特性。

有序集合每个元素的成员都是一个字符串对象,而每个元素的分值都是一个double类型的浮点数。值得一提的是,虽然zset结构同时使用跳跃表和字典来保存有序集合元素,但这两种数据结构都会通过指针来共享相同元素的成员和分值,所以同时使用跳跃表和字典来保存集合元素不会产生任何重复成员或者分值,也不会因此而浪费额外的内存。

当有序集合对象可以同时满足以下两个条件时,对象使用ziplist编码:

·有序集合保存的元素数量小于128个;

·有序集合保存的所有元素成员的长度都小于64字节;

不能满足以上两个条件的有序集合对象将使用skiplist编码。

redis 127.0.0.1:> ZADD runoobkey  redis
(integer)
redis 127.0.0.1:> ZADD runoobkey mongodb
(integer)
redis 127.0.0.1:> ZADD runoobkey mysql
(integer)
redis 127.0.0.1:> ZADD runoobkey mysql
(integer)
redis 127.0.0.1:> ZADD runoobkey mysql
(integer)
redis 127.0.0.1:> ZRANGE runoobkey WITHSCORES
) "redis"
) ""
) "mongodb"
) ""
) "mysql"
) ""

更多命令

http://www.runoob.com/redis/redis-sorted-sets.html

引用

《Redis 设计与实现》

http://www.runoob.com/redis/redis-tutorial.html

Redis基础对象的更多相关文章

  1. redis基础02-redis的5种对象数据类型

    表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...

  2. Redis 基础数据结构与对象

    Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...

  3. linux redis基础应用 主从服务器配置

    Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...

  4. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

     一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...

  5. Redis基础知识点面试手册

    Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...

  6. redis基础之python连接redis(五)

    前言 前面介绍了在数据库命令行直接操作redis,现在学习使用python的redis包来操作redis,本人安装的是redis==2.10.6: 系列文章 redis安装和配置 redis命令行操作 ...

  7. redis的使用和安装,redis基础和高级部分

    redis的使用和安装,redis基础和高级部分 在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数 ...

  8. REDIS基础笔记

    Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布 ...

  9. Redis 基础特性讲解

    目录 1.Redis基础杂项小节 1.是什么 2.能干嘛 3.去哪下 4.Redis启动后基础知识讲解 2.Redis数据类型 1.常用的五大数据类型 2.高级'玩家'才知道的其他数据类型 3.Red ...

随机推荐

  1. DMA缓冲区乒乓操作的处理

    http://www.51hei.com/bbs/dpj-141761-1.html https://blog.csdn.net/sunnydreamrain/article/details/8288 ...

  2. C++中struct和class定义类区别

    有一种常见的误解认为用struct保留字定义的类与用class定义的类有很大的区别.唯一的不同只是默认的成员保护级别和默认的派生保护级别,没有其他的区别. 1. 用class定义的类,默认的成员访问级 ...

  3. KONG -- 图形化管理(Kong Dashboard)

    前面安装的 KONG 的版本是社区版的 1.0.2,官方的 KONG Manager 好像只有企业版才提供.在 github 上找了一个开源的图形化管理应用 -- Kong Dashboard (ht ...

  4. (四)从输入URL到页面加载发生了什么

    一.从输入URL到页面加载发生了什么 1.在浏览器中输入URL 如:https://www.cnblogs.com/loveapple/ URL分成协议.地址.路径三部分 协议:http.https. ...

  5. kubernetes(安装dashboard)

    https://blog.csdn.net/qq_22917163/article/details/84527420 1. 通过yaml文件安装dashboard 我们可以从https://githu ...

  6. PowerDesigner如何将字段的注释显示出来

    选定一个编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷键Ctrl+U)- >Comme ...

  7. Codeforces Round #363 (Div. 2) A

     Description There will be a launch of a new, powerful and unusual collider very soon, which located ...

  8. 使用shell巧妙高效的批量删除历史文件或目录

    背景:有实时产生的数据按小时分文件保存,如“/data/2013/09/18/14.txt”.现需要保留30天的最新数据,而删除所有其它的历史数据.注意“保留30天的最新数据”,可能不是连续的30天, ...

  9. 08.Spring Bean 解析 - BeanDefinitionDocumentReader

    基本概念 BeanDefinitionDocumentReader ,该类的作用有两个,完成 BeanDefinition 的解析和注册 . 解析:其实是解析 Ddocument 的内容并将其添加到  ...

  10. HDU 6153 A Secret 套路,求解前缀在本串中出现的次数

    http://acm.hdu.edu.cn/showproblem.php?pid=6153 首先相当于翻转两个串,然后求s2前缀在s1中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个 ...