Redis的五种数据类型详解

news/2024/7/23 17:27:04

type命令实际返回的就是当前键的数据结构类型,他们分别是:String、hash、list、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构。
实际上每一种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。
每种数据结构都有两种以上的内部编码实现,例如list数据结构包含linkedlist和ziplist两种内部编码。同时有些内部编码,例如ziplist可以作为多种尾部数据结构的内部实现,可以通过object encoding 命令查询内部编码。

一 字符串(String)
字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据类型都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。字符串的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512M。
字符串的类型内部编码有3种:
1)int:8个字节的长整形。
2)embstr:小于等于39个字节的字符串。
3)raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用那种内部编码实现。

二 哈希(Hash)
几乎所有的编程语言都提供哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value = {{field1,value1},…{fieldN,valueN}}。
哈希类型的背部编码有两种:
1)ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为hash的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
2)hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

三 列表(List)
列表(list)类型是用来存储多个有序的字符串,例如:a、b、c、d、e五个元素从左到右组成一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储2的32次方减1个元素。在Redis中,可以对列表两端插入(push)
和弹出(pop),还可以取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,他可以充当栈和队列的角色,在实际开发中有很多应用场景。
列表类型有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引获取某个元素或者某个范围的元素列表,第二,列表中的元素是可以重复的。
列表类型的内部编码有两种:
1)ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis或选用ziplist来作为列表的内部实现来减少内存的使用。
2)likedlist(链表):当列表类型无法满足ziplist的条件时,Redis回事linkedlist作为列表的内部实现。

四 集合(Set)
集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素时无序的,不能通过索引下标获取元素。一个集合最多可以存储2的32次方减1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理的使用好集合类型,能在实际开发中解决很多实际问题。
集合类型的内部编码有两种:
1)intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会使用intset来作为集合的内部实现而减少内存的使用。
2)hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

五 有序集合(Zset)
有序集合相对于haxi、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是他和列表使用索引下标作为排序依据不同的是,它给每个元素都设置一个分数(score)作为排序的依据。有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
有序集合类型的内部编码有两种:
1)ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
2)skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。


另外,Redis典型的使用场景请移步:
Redis典型使用场景

摘自-Redis开发与运维


http://www.niftyadmin.cn/n/4556950.html

相关文章

B/S 与 C/S 相比各有何优缺点

相对于C/S结构 MYIE等)运行软件 如Internet Explorer 而客户端采用浏览器(Browse 就是只安装维护一个服务器(Server) B/S结构软件的好处 何谓B/S结构 1.首先 但与B/S相比 有了很大的进步 尽管C/S结构相对于更早的文件服务器来说 即…

Kafka 概念,安装,常用命令(一)

1、什么是Kafka Kafka可以看成一个流平台,这个平台上可以发布和订阅数据流,并把他们保存起来,进行处理。Kafka有点像消息系统,允许发布和订阅消息流,但是它和传统的消息系统有很大的差异,首先,…

Excel的用到的常规的技巧

这几天在做各种发票的报表,好几百的数据当然离不开EXCel,自己又是个白班,就记录下啦! EXCEL 判断某一单元格值是否包含在某一列中 就在Excel的表格中加入这个函数:IF(ISERROR(VLOOKUP(D2,A2:A87,1,0)),"N",&…

要漂亮免费好用的 300分求.Net下WinForm换肤控件

iegb2312&bsMFC%D6%D0%B9%D8%D3%DA%B1%A3%B4%E6%CA%FD%BE%DD%B5%BDExcel&sr&z&cl3&f8&wd.Net%CF%C2WinForm%BB%BB%B7%F4%BF%D8%BC%FE&ct0http://hi.baidu.com/dujinghong/blog/item/74d48e5c3abfeb46faf2c0ef.html这两个不错 我上个月还在开发KTV了…

IDE设置serialVersionUID自动生成

当实体实现Serializable接口的时候需指定一个serialVersionUID,虚拟机是否允许反序列化, 不仅取决于类路径和功能代码是否⼀致, ⼀个非常重要的⼀点是两个类的序列化 ID 是否⼀致。如果不指定系统也会根据类信息默认生成一个,但是…

JAVA-kafka-生产者(二)

1、概述(摘自Kafka权威指南) 2、kafka生产者的创建(摘自Kafka权威指南) 3、入门程序 3.1、pom文件 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kafka</groupId&…

控制其他进程的滚动条 帮帮忙

null) onDownLoadProgress(100 current }); } else ...{ this.progressBar1.Maximum (int)total; this.progressBar1.Value (int)current; } } } /** <summary> /// 下载类 /// </summary> public class Downloader ...{ //委托 public delegate void dDownloadP…

Qt Console Application

代码编译完生成的.o文件&#xff08;又称对象文件&#xff0c;是可执行文件&#xff09;和链接.o文件形成的.exe可执行文件都保存在“build-Project-Desktop_Qt_5_8_0_GCC_64bit-Debug”中。在代码中直接输入输出的文件的默认路径也是在“build-Project-Desktop_Qt_5_8_0_GCC_6…