在Redis中,支持五种基本数据类型和多种高级数据类型。
首先,我们要知道Redis是一款免费、开源、遵循BSD协议的高性能结构化存储数据库,Redis自身是通过C语言实现的,同时,Redis是基于内存的,采用Key-Value结构化存储的NoSQL数据库,加上其底层采用单线程和多路I/O复用模型,所以Redis的查询速度很快。
Redis中的Key都是字符串类型的,但Value有五种基本数据类型。 这五种基本数据类型分别是:
- 字符串 String
- 列表 List
- 集合 Set
- 有序集合 SortedSet
- 哈希 Hash
Redis的命令不区分大小写,但是Key严格区分大小写。
字符串:
Redis中的Key都是字符串类型的,Redis自身也是通过C语言实现的,但是在C语言中,其实并没有字符串这种数据类型,C语言中的字符串通常都是一个以“\0”结尾的字符数组;但是Redis并没有使用C语言中这种传统的字符串表示方式,而是自己实现了SDS(Simple Dynamic String,简单动态字符串)的抽象类型,Redis中的字符串默认是通过SDS实现的。
String是Redis中最基本的类型,同时String类型是二进制安全的,也就是说,Redis的String数据类型可以包含任何数据,例如jpg图片或序列化的对象。但是注意,String类型的值最大不能超过512MB。
列表:
Redis列表是简单的字符串列表,是有序的,其中的元素也可以重复;我们可以将一个元素添加到列表的头部(左边)或者尾部(右边),也可以从头部或者尾部弹出一个元素。一个列表最多可以包含(2^32 - 1)个元素。
因为列表的这些操作,我们可以将列表视为队列(先进先出)、堆栈(先进后出)。我们也可以向列表中间插入元素,或者根据列表中元素的下标来更改某个元素。
需要注意的是:
访问列表头部或尾部的操作时间复杂度是O(1),这意味着它们非常高效。但是,操作列表中元素的命令时间复杂度通常是O(n),包括LINDEX
、LINSERT
和LSET
。运行这些命令时要小心,尤其是在对大型列表进行操作时。
集合:
Redis的集合(Set)是唯一字符串(成员)的无序集合。也就是说,集合中的元素都是字符串,并且包含两个特点:无序、不可重复。
集合是通过哈希表实现的,所以大多数集合操作(包括添加、删除和检查某元素是否为集合成员)的时间复杂度都是O(1)。但是,对于具有数十万或更多成员的大型集合,在运行SMEMBERS
命令获得集合所有成员时应格外小心。此命令时间复杂度为O(n),并在单个响应中返回整个集合。作为替代方法,可以考虑SSCAN
命令,它允许以迭代方式检索集合的所有成员。
集合最多可以包含(2^32-1)个元素。
有序集合:
Redis中的SortedSet和Set一样也是String类型元素的集合,且不允许有重复的成员。但不同的是每个元素都会关联一个double类型的分数,Redis正是通过分数来为集合中的成员进行排序。当多个字符串具有相同的分数时,字符串将按字典顺序排序。
有序集合大多数操作的时间复杂度是O(n),其中n是集合中的成员数。
注意:
ZRANGE
命令会返回有序集合Key中指定区间的元素。在运行具有较大返回值(数万或更多)的ZRANGE
命令时要小心,此命令的时间复杂度为O(log(n) + m),其中m是返回的结果数。
哈希:
我们需要知道,Redis本身就是采用Key-Value结构化存储的NoSQL数据库。Hash数据类型是指Key-Value中的Value是一个键值(key-value)对集合。
大多数的哈希命令的时间复杂度都是O(1);一些命令(如HKEYS
、HVALS
和HGETALL
)的时间复杂度是O(n),其中n是Value中键值对的数量。
每个哈希最多可以存储(2^32-1)个键值对。但实际上,哈希仅受限于部署Redis的VM的总内存限制。
此外,Redis还支持多种高级数据结构,如:Streams、Bitmap、Geospatial、HyperLogLog。