Redis 五大数据类型的常用命令——列表、集合、哈希、有序集合

举报
扎哇太枣糕 发表于 2022/09/19 08:21:32 2022/09/19
【摘要】   各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站尚硅谷的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ 🍖 五大数据类型——列表(List)  首先应该明确的一点就是,Redis中的五大数据结构是对value的概念,而不是指key的数据类型。Redis中的列表是一个简单的字符串列表,按照插入的...

  各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站尚硅谷的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

🍖 五大数据类型——列表(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类型的fieldvalue的映射表,十分类似于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==在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。