快捷搜索:

怎么精通Redis,不如先从基础数据结构开始

万丈高楼平地起,很多人说想深入学习下Redis,却不知道从何学习,不烦先试试从Redis的基础数据结构看起,当你使用命令的时候,再去思考内部是如何实现,往往可以事半功倍。

Redis对外提供5种基本的数据结构,分别是字符串、链表、哈希、字符串集合与有序集合。今天我们先简单学习这五中数据结构,后面我们再从具体的业务具体的命令出发,更输入的学习每种数据结构工作的流程。

怎么精通Redis,不如先从基础数据结构开始

String

我们最常用的,就是Redis的get set接口了。

怎么精通Redis,不如先从基础数据结构开始

无论是数字还是字符串,在redis的内部都是以字符串的形式进行存储,以字符串存储的好处是方便扩展,字符串的capacity字符串的容量,len是当前字符串的长度。这么设计的好处是如果原来的字符串上面存的是hello,现在要改成helloworld,只需要在原来的字符串后面拼上world就行,而不需要开辟新的内存空间,从而减少内存碎片的产生。

怎么精通Redis,不如先从基础数据结构开始

list

redis的另外一个常用的用法,是用来维护一个队列,常用的命令有lpush,rpush,lpop,rpop。使用这几个命令的组合,我们也可以实现一个单向队列或者一个栈。

怎么精通Redis,不如先从基础数据结构开始

我们发现,我们可以从左边入队,也可以从右边入队,可以从左边出队,也可以从右边出队,这便是双端队列。对Redis的内部,使用一个双向链表来维护。双向链表的优点,就是操作两端都非常的方便。

怎么精通Redis,不如先从基础数据结构开始

set

set是我们平时开发中最常实用的一个数据结构,例如我们判断用户的昵称有没有重复,可以把昵称放到set里面,如果是单机,我们很容易搞一个set来存放所有用户的用户名,如果是集群的模式,我们可以使用Redis的set。

怎么精通Redis,不如先从基础数据结构开始

Redis的set内部用到的是hash,相信大家对hash也不陌生,hash就是可以把字符串映射成数字,已方便计算机进行存储。如果两个不同的字符串的哈希值一样,我们通常称之为冲突,常见的处理冲突的手段就是开散列了。即把冲突的字段拉成一条链表。

怎么精通Redis,不如先从基础数据结构开始

hash

相信用redis来做缓存大家都使用过,不知道大家有没有思考过这么一个场景,要缓存的对象是一个结构体,结构体里面有着不少字段跟值。举个简单的例子,用户的购物车,我们经常缓存对应用户里面,每个skuid对应的添加到购物车的数量是多少,我们可以把把整个购物车的列表序列化后存到缓存里面。

怎么精通Redis,不如先从基础数据结构开始

这样做的问题是,每次修改里面一个东西,例如用户1芒果的数量从1变成2,都要把整个列表反序列化后修改再序列化后保存,非常的麻烦,并且性能较差,更要命的,是会有并发覆盖写的问题,如果你之前已经学习了redis的hash结构,相信这个问题可以迎刃而解。

怎么精通Redis,不如先从基础数据结构开始

如果你是学Java的,可以理解为由原来的Map

zset

这个数据结构的作用最为复杂,这个数据结构,主要是用来维护一个有序的列表。举一个简单的例子,在我们的直播业务中,经常有刷礼物排行版,排行版是根据用户刷礼物的数量进行排序的,又可以随时增加某个人的刷礼物的值,这里缓存往往就可以用到zset。

zset的内部实现是一个hash跟跳表,跳表负责维护顺序,跳表我们已经在之前的文章中已经介绍,文末有链接,hash用来维护在跳表中的位置。

您可能还会对下面的文章感兴趣: