Redis基础对象
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基础对象的更多相关文章
- redis基础02-redis的5种对象数据类型
表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...
- Redis 基础数据结构与对象
Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...
- linux redis基础应用 主从服务器配置
Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...
- Redis基础用法、高级特性与性能调优以及缓存穿透等分析
一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...
- Redis基础知识点面试手册
Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...
- redis基础之python连接redis(五)
前言 前面介绍了在数据库命令行直接操作redis,现在学习使用python的redis包来操作redis,本人安装的是redis==2.10.6: 系列文章 redis安装和配置 redis命令行操作 ...
- redis的使用和安装,redis基础和高级部分
redis的使用和安装,redis基础和高级部分 在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数 ...
- REDIS基础笔记
Redis基础笔记 资源链接 简介 简介 安装 五种数据类型及相应命令 1. 字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合 其他 事务 SORT 生存时间 任务队列 发布 ...
- Redis 基础特性讲解
目录 1.Redis基础杂项小节 1.是什么 2.能干嘛 3.去哪下 4.Redis启动后基础知识讲解 2.Redis数据类型 1.常用的五大数据类型 2.高级'玩家'才知道的其他数据类型 3.Red ...
随机推荐
- 《OD学spark》20160924scala基础
拓展: Hadoop 3.0 NameNode HA NameNode是Active NameNode是Standby可以有多个 HBase Cluster 单节点故障? HBaster -> ...
- centos 通过yum安装GlusterFS
1.环境 centos 6.5 64 bit glusterfs-3.5 2.配置yum源 http://download.gluster.org/pub/gluster/glusterfs/repo ...
- Zookeeper下载方法
Zookeeper官网地址:http://zookeeper.apache.org/ Zookeeper下载链接:http://mirrors.tuna.tsinghua.ed ...
- PAT天梯赛L3-005 垃圾箱分布
题目链接:点击打开链接 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的 ...
- Groovy xlsx
如果在JMeter安装的“bin”文件夹下有Excel(xlsx)文件,则test.xlsx可以使用以下方法动态填充请求参数: 将tika-app.jar添加到JMeter Classpath 重新启 ...
- P2375 [NOI2014]动物园 KMP
好,暴力能拿$50pts\space qwq$ 暴力的思路就是一直跳$nxt[j]$,直到它的长度小于串的一半,然后开始计数,当然要接着跳$nxt[j]$ 正解:考虑没有长度要求的(不要求不重合)公共 ...
- Luogu P1967 货车运输 倍增+最大生成树
看见某大佬在做,决定补一发题解$qwq$ 首先跑出最大生成树(注意有可能不连通),然后我们要求的就是树上两点间路径上的最小边权. 我们用倍增的思路跑出来$w[u][j]$,表示$u$与的它$2^j$的 ...
- python学习笔记(一)——关于正则表达式的学习小结
python中提供了re这个模块提供对正则表达式的支持. 一.正则表达式常用到的一些语法(并非全部): . 匹配任意单个字符 [...] 匹配单个字符集 \w 匹配单词字符,即[a-zA-Z0-9] ...
- Java面向对象_包装类访问修饰符
在java中有一个设计的原则"一切皆对象",java中的基本数据类型就完全不符合这种设计思想,因为八种基本数据类型并不是引用数据类型,所以java中为了解决这样的问题,jdk1.5 ...
- kettle5.4ODBC和OCI连接配置
1.kettle 5.4 使用JDBC连接的时候报错(测试不同的数据库,发现只是连接11gRAC 的时候会报JDBC的错误) 具体报错如下 java.sql.SQLException: 建数据库连接出 ...