Hash类型
Hash
类型,也叫散列,其Value
是一个无序字典
,其类似于Java
中的HashMap
结构。但我们都知道Redis本身就是基于Key-Value
存储的,但是Hash
表也是一个Key-Value
结构,那么也就是说**Hash
类型的Value
又是一个Key-Value
类型的结构**。上一篇文章提到过String类型是将对象序列化为Json
字符串之后存储,如图所示:
这样可以将一个对象以String
类型的Value
存储到Redis
中,但是当需要修改对象的某一个字段时相当不方便——必须对整个对象进行操作。而反观Hash
结构存储对象,因为其Value
又是一个Key-Value
结构,所以说对于对象的存储更加得心应手:
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段进行CRUD
。
上图是Hash类型的常见命令,可见和String
类型的操作其实是差不多的,只是Hash结构中的Value也是Key-Value形式存储的,所以说在操作的时候需要注意filed(字段)
(为了区别本身存储时的Key-Value,所以说将Hash类型的Value中的Key叫做filed
)。
List类型
Redis
中的List
类型和Java
中的LinkedList
类似,可以看做是一个双向链表结构
(但底层实现远比双向链表更加复杂,此处不讨论)。既可以支持正向检索也可以支持反向检索(双向链表的特性)。既然其底层可以看做双向链表结构
,其特性也和双向链表结构
类似:插入元素有序、插入元素可重复、插入和删除速度快、查询速度一般。
上图是List
类型的常见命令,在使用List
类型进行操作时,必须注意是从哪一边进行插入元素或移除元素的,因为其底层可以看作双向链表
,所以说元素之间是有方向的。
此时一个List
中已经有了两个元素A
和B
,此时对List
进行Lpush
一个元素C
,需要特别注意:因为元素是Lpush
到List中的,所以说插入之后List应该是:
Lpush
是从List
的左侧进行插入的,所以说元素C
此时就会在最左边,此时再对List
进行Lpush
一个元素D
,List
会变成这样:
Rpush
和Lpush
的使用方法完全一致,此时再对List
进行Rpush
一个元素E
,List
会变成这样:
总结Lpush
和Rpush
可以概括为:从左侧(Lpush
)插入的元素就会在List的左边;从右侧(Rpush
)插入的元素就会在List的右边。Lpop
和Rpop
的使用方法和Push
完全一致,对当前List
进行一次Lpop
之后会取得元素D
,进行一次Rpop
后会取得元素E
,此时List
将会变成:
这里特别说一下BLPOP
和BRPOP
这两个命令,其和LPOP
和RPOP
命令类似,但是在List中没有元素的时候会等待指定时间,而不是直接返回nil
。其可以用于实现阻塞队列
。
如何通过List
结构模拟一个栈?
通过数据结构的基础知识,我们可以知道栈(stack)
的结构是先进后出(LIFO
),那么我们只需要保证入口
和出口
是同一个即可,所以说可以配合使用L(R)PUSH
和L(R)POP
模拟一个栈。
如何通过List
结构模拟一个队列?
通过数据结构的基础知识,我们可以知道队列(queue)
的结构是先进先出(FIFO
),那么我们只需要保证入口
和出口
不是同一个即可,所以说可以配合使用L(R)PUSH
和R(L)POP
模拟一个队列。
如何通过List
结构模拟一个阻塞队列?
阻塞队列
是从队列
的结构上进化而来的,它必须满足队列的特性,只是在出队时需要等待,所以说我们可以使用所以说可以配合使用L(R)PUSH
来入队,但是在出队时使用BR(L)POP
模拟一个阻塞队列。