各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站尚硅谷的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
💡Redis知识点速览
- 🍖 五大数据类型——列表(List)
- 🥩 List的底层数据结构
- 🥩 列表常用命令
- 🍖 五大数据类型——集合(Set)
- 🥩 Set的底层数据结构
- 🥩 集合常用命令
- 🍖 五大数据类型——哈希(Hash)
- 🥩 Hash的底层数据结构
- 🥩 哈希常用命令
- 🍖 五大数据类型——有序集合(Zset)
- 🥩 Zset的底层数据结构
- 🥩 有序集合常用命令
🍖 五大数据类型——列表(List)
首先应该明确的一点就是,Redis中的五大数据结构是对value的概念,而不是指key的数据类型。Redis中的列表是一个简单的字符串列表,按照插入的顺序进行存储并非是一个无序列表。List的底层实际上是一个双向链表,所以你可以快速的向链表头部或者尾添加元素,但是如果操作链表中间的元素的话性能就会很差
🥩 List的底层数据结构
List的数据结构为快速链表quickList,那么有的小伙伴可能会有疑问了,你之前不是说过List的底层是一个双向链表吗,怎么又成快速链表了?实际上快速链表和双向链表的概念并不冲突。
什么是快速链表?
快速链表是Redis3.2之后引入的一种数据类型, 该结构是将许多的压缩链表采用双向链表的形式连接起来的一种结构, 这种链表中的每一个节点是一个压缩链表. 这样的设计能在时间效率和空间效率上实现较好的折中 在列表数据比较少的时候只使用一块连续的内存存储,这个结构就是压缩链表(ziplist),当数据比较多的时候就,就使用很多个压缩链表进行存储,每个压缩链表又作为一个节点采用双向链表的形式连接起来,这就形成了一个快速链表
🥩 列表常用命令
左插或者右插的方式创建K-V:
lpush / rpush K V V V … lpush相当于双向链表的头插法,rpush相当于双向链表的尾插法,关于这两种方法的详细介绍参考下面这篇博客:https://blog.csdn.net/jankin6/article/details/80954203
获取key对应List索引范围内的value:
从左向右lrange key from to
从左边或者右边删除一个值并返回:
lpop / rpop key 从第一个List的右边删除一个值插到第二个List的左边:
rpoplpush K K 获取key对应List的索引位置元素:
lindex key index
获取key对应List的长度:
llen key
在key对应List的某个元素之前插入元素:
linsert key before ele newele
在key对应List的某个元素之后插入元素:
linsert key after ele newele 在key对应List的某个元素之后插入元素:
linsert key after ele newele
🍖 五大数据类型——集合(Set)
Set集合的功能实际上与List列表很是类似,与List不同的就是集合内部的元素是无序不重复的,他可以对添加的元素实现自动去重功能,如果你想存储一个列表数据但是又不想出现重复数据,还不在乎数据的存储顺序的话,可以是使用set集合实现。set集合的底层实际上就是一个value值为null的hash表,所以它查找数据的速度很快
🥩 Set的底层数据结构
Set的底层数据结构就是一个字典,只不过字典的实现方式是哈希表(hashtable),hashtable就是普通的哈希表(key为set的值,value为null)
🥩 集合常用命令
创建一个K-V:sadd K V V V…
查看key对应的value集合:smembers key判断集合中是否有该元素:sismember key value
key对应的value集合长度:scard key
删除集合中的元素:srem K V V V…随机删除集合中元素并返回:spop key
随机取出集合中指定个元素:srandmember key num将集合的元素移动到另一个集合:smove K K V
两个集合的交集:sinter K K
两个集合的并集:sunion K K
两个集合的差集:sdiff K K
🍖 五大数据类型——哈希(Hash)
Redis中的Hash实际上就是一个键值对的集合,Hash也是针对K-V中value的概念,就是value中存储了一个String类型的field和value的映射表,十分类似于Java中Map集合元素存储的映射关系,下面以Hash中的一个K-V为例画图帮助理解
🥩 Hash的底层数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
🥩 哈希常用命令
添加K-V数据: hset K field value field value…
添加K-V数据: hmset K field value field value…
查看K对应的V中field的值: hget K field
判断K对应的V中field是否存在: hexistst K field获取K对应的V中所有的field: hkeys K
获取K对应的V中所有的field的值: hvals K
K对应的V中的field的值加几: hincrby K field num
添加一个映射关系存在则失败: hsetnx K field value
🍖 五大数据类型——有序集合(Zset)
有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),结合会按照这个评分(score)从低最高排序集合中的成员。集合的成员是唯一的,但是评分可以重复。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
🥩 Zset的底层数据结构
SortedSet(zset)底层使用了两个数据结构:使用hash关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。还用跳跃表给元素value排序,根据score的范围获取元素列表
什么是跳跃表(skiplist)?跳跃表就是每往上一层就跳一个元素组成链表,跳跃表都是从最高层开始查找,比如说查找51的过程大致如下:
- 从第2层开始,1节点比51节点小,向后比较到41节点比51节点小,继续向后比较,后面就是NULL了,所以从41节点向下到第1层
- 在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以返回从41向下到第0层
- 第0层中,41节点比51节点小,继续向后到要查找的51节点
共经历查找4次,流程如下
🥩 有序集合常用命令
添加K-V数据(带上评分): zadd K score value score value…
查看K-V数据: zrange K from to
查看K-V数据(带上评分): zrange K from to withscores按照评分查看范围内的值
从小到大排: zrangebyscore K min max
从大到小排: zrevrangebyscore K max min增加value对应的score: zincrby K num value
按照value删除: zrem K value
计算score在范围内的个数: zcount K min max
查询value按score的排名: zrank K value