redis数据类型有哪些?redis数据类型该怎么应用?

TheDisguiser 2020-03-22 15:05:00 java常见问答 8573

大家好,你们知道redis吗?它是一个支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,现在非常多人在使用它。那么,你们知道redis的数据类型有哪些吗?它们又该怎么应用呢?下面就给大家介绍介绍。

Redis提供五种数据类型,分别为:string,hash,list,set及zset(sorted set)。

String(字符串)

首先是String,String类型是最基础的类型,在redis里面字符串可以存储三种类型的值,字节串、整数、浮点数。这里整数或者浮点数是可以执行自增或自减的。

redis数据类型

String常用命令redis数据类型

Dict(hash表)

hash数据类型 在Redis中哈希类型是指键本身又是一种键值对结构,也就是我们所说的对象,所以hash数据类型用来存储对象是最合适的数据类型。Hash数据类型的编码可以是zipList或HashTable。当哈希对象保存的所有键值对长度小于64字节并且元素数量少于512时使用zipList,否则使用HashTable。zipList与List数据类型中的zipList实际上基本一致,唯一区别在于Hash存储entry数量成对增加,所以长度一定为2的整数倍。当然,使用zipList与push和pop时间复杂度为O(n),所以只能在数据量少的情况下才允许使用。而HashTable其实有点类似于Java中的HashTable,HashTTable主要依赖于三个结构:dict、dictht、entry。

List(双向链表)

List数据结构是用来存储多个有序的字符串,List中的每个字符串成为元素,List提供了节点重排和节点顺序访问的能力,在Redis中,List可以在两端push和pop元素,还可以获取指定范围的元素列表,获取指定索引下标的元素等,List数据结构主要有zipList(压缩链表)和LinkedList(双向链表)两种实现方式。首先我们先看看LinkedList的结构: type struct list{ //表头节点 listNode *head; //表尾节点 listNode *tail; //包含的节点总数 unsigned long len; };

可以看到每个LinkedList中都会包含一个表头节点head和一个表尾结点tail,在LinkedList中每个节点都会有一个prev指向前一个元素,同时还有一个next指向后一个元素,每个节点的value就是节点的值。从而实现双向链表,理解起来实际上和C中的双向链表有很大程度的相似性。而另一种实现方式zipList是基于连续内存实现,有点类似于数组方式,但是和数组有点不一致的是zipList的每一个entry的大小可能不一致,需要特殊方法去控制解决,但是在执行push,pop操作时会有数据的迁移,时间复杂度为O(n), 所以一般只有在元素较少时才会使用zipList,我们可以看看zipList的结构:

type struct ziplist{ //整个压缩列表的字节数 uint32_t zlbytes; //记录压缩列表尾节点到头结点的字节数,直接可以求节点的地址 uint32_t zltail_offset; //记录了节点数,有多种类型,默认如下 uint16_t zllength; //节点 List entryX; }

Set(集合)

Set是redis中的集合,是无序的,不可重复的。

redis数据类型
redis数据类型

Zest(排序Set)

Zset是有序集合,与set的区别在于每个元素都会关联一个double类型的分数,通过分数为集合中的成员从小到大进行排序。Zset的成员是唯一的,但分数可以重复。

有序集合是在Set集合的基础上,保留了Set集合中不能存在重复元素的特性,但是不同的是,Zset集合中元素是可以排序的,Zset排序和List排序都可以使用索引下标作为排序依据,所以说Zset实现了数据有序且键值对唯一的集合,Zset的数据结构有两种:zipList和skipList + HashTable,zipList已经非常少用,是用于数据量较少的情况,默认排序为元素从小到大。而采用skipList + HashTable的数据结构,skipList会在保证集合有序的情况下优化范围查找的时间复杂性,而HashTable它可以优化push和pop元素时的时间复杂性。skipList基于有序链表,可以创建多层索引,实现以空间复杂度来换取时间复杂度的做法,最终实现时间复杂度为O(logN)的元素查询过程,当需要push或者pop元素时,则使用HashTable实现时间复杂度仅为O(1)。

这便是关于redis数据类型的介绍,更多相关内容请持续关注本站。