咨询热线:15174985937 联系人:彭金兰 地址:新疆维吾尔自治省乌鲁木齐市乌鲁木齐市延安路吉利商务基地地
redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
来源:欧亿测速登录 发布时间:2019-11-09 点击量:15
一.概述
在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串、链表(双端链表)、字典、跳跃表、 整数集合、压缩列表(后面再了解)。Redis没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建一个对象系统,这个系统对象包括:字符串对象、列表对象、哈希对象(散列)、集合对象、有序集合对象这五种类型,每种类型对象都用到了至少一种前面所介绍的数据结构。
通过这五种不同类型的对象,可以针对不同的使用场景, 在Redis 内部会为对象设置不同的数据结构实现,从而优化对象在不同场景下的使用效率。下面先直观看下关系图(五种对象与type与encoding编码与ptr底层数据结构),然后再来详细介绍它们之间的关系。
二. 对象类型与编码(五种类型的对象)
Redis中的每个对象都由一个RedisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性、ptr属性。
typeof struct redisObject{ //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现数据结构的指针 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:6379> set msg "hello world"OK127.0.0.1:6379> type msgstring-- 值为列表对象127.0.0.1:6379> rpush number 1 3 5 (integer) 3127.0.0.1:6379> type numberlist-- 值为哈希对象 127.0.0.1:6379> hmset profile name tom age 25 career programmerOK127.0.0.1:6379> type profilehash-- 值为集合对象127.0.0.1:6379> sadd fruit apple banana cherry(integer) 3127.0.0.1:6379> type fruitset-- 值为有序集合对象127.0.0.1:6379> zadd price 8.50 apple 3.30 banana(integer) 2127.0.0.1:6379> type pricezset
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:6379> set msg "hello wrold"OK127.0.0.1:6379> object encoding msg"embstr"127.0.0.1:6379> set story "long long long long long long long long long ..."OK127.0.0.1:6379> object encoding story"raw"127.0.0.1:6379> sadd num 1 3 4(integer) 0127.0.0.1:6379> object encoding num"intset"127.0.0.1:6379> sadd num 1 3 4 "one"(integer) 1127.0.0.1:6379> object encoding num"hashtable"127.0.0.1:6379> zadd fruit-price 5.0 banana 6.5 cherry 8.0 apple(integer) 0127.0.0.1:6379> object encoding fruit-price"ziplist"127.0.0.1:6379> rpush integers "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"(integer) 20127.0.0.1:6379> object encoding integers"quicklist"
总结:通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大提升了redis的灵活性和效率。例如:上面演示的zadd fruit-price 添加列表元素,redis使用压缩列表作为列表对象的底层实现,因为压缩列表比链表更节约内存,并且在元素数量较少时,在内存中以连续块方式保存的压缩列表比链表可以更快被载入到缓存中。但随着列表对象元素越来越多时,这种压缩优势就会消失,此时对象就会将底层实现从压缩列表转向链表。 其它类型的对象也会通过使用多种不同的编码来进行类似的优化。
使用对象key通过Type命令查看value值的对象类型,通过object encoding命令查看value值的底层数据结构。
相关产品
-
潘基文在记者会上在谈到叙利亚问题时,敦促各方将叙利亚人民、而非各个利益派别的利益放在谈判的首要位置。他呼吁迅速结束战斗、围困和其它严重侵犯人权的行为。除叙利亚问题之外,潘基文在记者会上还谈到了索马里、利比亚、安理会改革等问题。
-
在移动互联到来之前,中国的VC投资了很多智能手机公司。到2014年,移动互联网的人数差不多达到3-4亿规模,这时移动互联网开始大规模普及各种应用,模式也不断创新。
-
众所周知,现在芯片的工艺基本都已经是10nm工艺了,但是国产的光刻机(能生产高精度芯片的设备)技术不够,达不到这个标准,最高精度只能生产22nm工艺芯片。
-
“锋菲恋”也是强强联合,回想十多年前,王菲与窦唯离婚,有人感叹没有窦唯操刀,王菲的音乐肯定大打折扣,而很快的“锋菲恋”,让王菲人气大增,不仅甩掉了她与窦唯离婚的负面形象,还让媒体看到了一个女性的强大,敢于追求真爱,尽管这个男生出道不久,还属于娱乐圈的新生,但他星二代的出身使其未来一定不可估量,加之香港成熟的“造星机制”,很快把谢霆锋这个新人送上了一线的位置,王菲不仅保住了天后位置,还完成了自己的华丽转身,由流行歌手向女神的转身。
-
中新网6月8日电 昨天晚上,叶诗文在微博中晒出一张个人美照,照片中叶诗文虽然用手遮阳,但阳光还是洒在她的脸上,显得白皙透亮。网友看后大赞叶诗文皮肤好,甚至还有网友把叶诗文作为找女朋友的范本。
-
网上有梅黑们在生硬地喷道:那是梅西点球命中率不高,怯手了,才选择把压力推给队友。但是,在这次非凡点球之前,梅西已经射进了一个无解的直接任意球。有了把直接任意球当点球踢的霸道实力,才能有把点球玩成间接任意球的充沛底气,这么简单的逻辑还需要推敲和辩解吗!
-
B、堵疏结合,加强学生网络道德文化教育,杜绝学生进入营业性网吧的不良现象,引导他们自觉遵守《全国青少年网络文明公约》,兼收并蓄网络优秀文化,把握好网络这把"双刃剑"。
-
其实在很早之前网上就流传出了一些让人无法忍受的“反人类”设计,这些内容之所以能够广泛流传,主要是因为不少情况是居家生活常常遇到的。比如电插座虽同时有两相、三相插头,却只能插进去一个;又如笔记本电脑把网线接口放在右手边,鼠标用着极其不舒服,USB接口也难以分清正反面,每次都要试好几次才能插上……
热点资讯
- 农业和农村部:建立育种推广一体化的市场化现代种业体系2019-11-06
- 高通因与中国手机品牌合作,Q4营收超预期2019-10-29
- IT之家iOS版6.26发布:隐藏地理位置/iPad竖屏取消分栏显示2019-10-29
- 苹果Macmini四大使用场景,你日常会用它做什么?2019-10-29
- 小牛电动首日开盘报8.50美元较发行价下跌5.56%2019-10-29
- 2020年台湾领导人选举非常活跃!另一位政治明星已经放弃2019-10-30
- 银川机场有望成为中国西北地区第三个千万级机场。2019-06-17
- 戴尔升级Alienware15/17R4笔记本:现可支持单按键定制灯光2019-06-17