【Redis入门到精通三】Redis核心数据类型(List,Set)详解

news/2024/11/13 14:07:16/

目录

 

Redis数据类型

​编辑

1.List类型

(1)常见命令

(2)内部编码

2.Set类型

(1)常见命令

(2)内部编码


 

Redis数据类型

         查阅Redis官方文档可知,Redis提供给用户的核心数据类型有以下九个,从上到下依次是字符串,哈希,列表,集合,有序集合,流,位图,位域,地址空间。因为Redis本身就是通过键值对的方式存储数据,这些数据类型都存在于Redis的value中 ,不同的数据类型,所需要的插入命令也不相同。下面我将依据官方文档对这九种数据类型依次进行介绍,本篇文章将着重对List,Set两种数据类型进行介绍。

5e7507231a354fe18f1df6d7f93e8414.png

1.List类型

         List类型是用来存储多个有序的字符串(需要注意此处的有序指的是插入先后顺序,并不是大小)。在 Redis 中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。

(1)常见命令

操作List类型的常用命令有:lpush,lpushx,rpush,rpushx,lrange,lpop,rpop,lindex,linsert,llen,blpop,brpop。下面将按顺序依次介绍用法。

操作类型命令时间复杂度
添加
rpush key value [value ...]
O(k),k 是元素个数
lpush key value [value ...]
O(k),k 是元素个数
linsert key before | after pivot value
O(n),n 是 pivot 距离头尾的距离
查找
lrange key start end
O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围
lindex key index
O(n),n 是索引的偏移量
llen key
O(1)
删除
lpop key
O(1)
rpop key
O(1)
lremkey count value
O(k),k 是元素个数
ltrim key start end
O(k),k 是元素个数
修改
lset key index value
O(n),n 是索引的偏移量
阻塞操作
blpop brpop
O(1)
LPUSH key element [element ...]

 lpush命令用于将一个或多个元素从左侧插入。

LPUSHX key element [element ...]

lpushx命令用于当key存在时,将元素从左侧插入,不存在则直接返回。 

RPUSH key element [element ...]

rpush命令用于将一个或多个元素从右侧(尾部)插入。 

RPUSHX key element [element ...]

 rpushx命令用于当key存在时,讲一个或者多个元素从右侧插入。

LRANGE key start stop

 lrange用于获取从start到end区间的所有元素,左闭右闭。

LPOP key

 lpop用于从list左侧取出元素(头删)。

RPOP key

rpop用于从list右侧取出元素(尾删) 。

LINDEX key index

 lindex用于获取从左数第indedx位置的元素。

LINSERT key <BEFORE | AFTER> pivot element

 linsert用于在特定位置前或后插入元素。

LLEN key

llen用于获取list长度 。

BLPOP key [key ...] timeout

 blpop是lpop的阻塞版本,当所有key对应的列表都为为空时执行该命令的客户端将会阻塞,直到某个列表被其他客户端插入元素,或者设置的timeout时间到。

 BRPOP key [key ...] timeout

 brpop是rpop的阻塞版本,具体机制参考上面的blpop。

(2)内部编码

        List类型在内存中存储时的内部编码有ziplist,linkedlist两种方式。Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。

  • ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤ziplist 来作为列表的内部编码实现来减少内存消耗。
  • linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现。

2.Set类型

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是⽆序的,元素不允许重复。Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。

(1)常见命令

操作Set类型的常用命令有:sadd,smembers,sismember,scard,spop,smove,srem,sinter,sinterstore,sunion,sunionstore,sdiff,sdiffstore。下面将按顺序依次介绍用法。

SADD key member [member ...]

时间复杂度O(1),sadd用于将一个或者多个元素添加到set中,重复的元素无法添加到set中。 

SMEMBERS key

 时间复杂度O(N),smembers用于获取一个set中的所有元素,元素间的顺序是无序的。

SISMEMBER key member

时间复杂度O(1), sismember用于判断一个元素在不在set中。

 SCARD key

 时间复杂度O(1),scard用于获取set的元素个数。

SPOP key [count]

时间复杂度O(N),spop用于从set中删除并返回一个或多个元素。 

SMOVE source destination member

 时间复杂度O(1),smove用于将一个元素从源set取出并放入目标set中。

SREM key member [member ...]

 时间复杂度O(N),srem用于将指定的元素从set中删除。

SINTER key [key ...]

时间复杂度O(N*M)N 是最⼩的集合元素个数. M 是最⼤的集合元素个数, sinter用于获取给定set的交集中的元素。

 SINTERSTORE destination key [key ...]

时间复杂度O(N*M)N 是最⼩的集合元素个数. M 是最⼤的集合元素个数, sinterstore用于获取给定set的交集中的元素并保存在目标set中。

SUNION key [key ...]

时间复杂度O(N)N 给定的所有集合的总的元素个数, sunion用于获取给定set的并集中的元素。

SUNIONSTORE destination key [key ...]

时间复杂度O(N), sunionstore用于获取给定set的并集中的元素并保存在目标set中。

SDIFF key [key ...]

 时间复杂度O(N)N 给定的所有集合的总的元素个数,sdiff用于获取指定set的差集中的元素。

SDIFFSTORE destination key [key ...]

时间复杂度O(N),sdiffstore用于取给定set的并集中的元素并保存在目标set中。

(2)内部编码

集合类型在内存中存储时的内部编码方式有inset,hashtable两种方式。Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。

  • intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
  • hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。

❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

🍔我是小皮侠,谢谢大家都能看到这里!!

🦚主页已更新Java基础内容,数据结构基础,数据库,算法

🚕未来会更新Java项目,SpringBoot,Redis以及各种Java路线会用到的技术。

🎃求点赞!求收藏!求评论!求关注!

🤷‍♀️谢谢大家!!!!!!!

 


http://www.ppmy.cn/news/1528191.html

相关文章

do while循环练习

本篇章&#xff0c;咱们就来看看我做关于do while的题目&#xff0c;希望可以给有需要的小伙伴们带来灵感。 1.练习&#xff1a; 题目&#xff1a;输入一个正整数&#xff0c;计算这个整数是几位。 例如&#xff1a;输入&#xff1a;1234&#xff0c;输出&#xff1a;4 输出…

深度学习-物体检测SSD

一&#xff1a;SSD结构 以VGG-16为基础&#xff0c;使用VGG的前五个卷积&#xff0c;后面增加从CONV6开始的5个卷积结构&#xff0c;输入图片要求300*300 1. 分别将VGG16的全连接层FC6和FC7转换成3x3的卷积层Conv6和1x1的卷积层Conv7 2.去掉所有的Dropout层和FC8层 3.同时将…

Linux文件IO(二)-文件操作使用详解

前篇已经讲过open打开文件的操作使用&#xff0c;本篇文章介绍剩余的wirte、read、close、lseek等操作。 1.write写文件 调用 write 函数可向打开的文件写入数据&#xff0c;其函数原型如下所示&#xff08;可通过"man 2 write"查看&#xff09;&#xff1a; #inc…

基于SpringBoot+Vue的商场停车场管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

【Git原理与使用】版本管理与分支管理(1)

目录 一、基本操作 1、初识Git 2、Git安装[Linux-centos] 3、Git安装[ Linnx-ubuntu] 4、创建git本地仓库 5、配置Git 6、认识工作区、暂存区、版本库 7、添加文件 8、查看历史提交记录 9、查看.git文件目录结构 10、查看版本库对象的内容 11、小结&#xff08;在本地的.git仓库…

HTML中的零宽字符

概述 零宽字符是一组在文本中没有可见宽度的字符,它们通常用于处理文本的布局、分隔和合成。下面是一些常见的零宽字符及其详细介绍: 详细介绍 零宽空格 (Zero Width Space, ZWSP) Unicode 码位: U+200BHTML 实体: ​ 或 ​用途: 用于防止文字自动换行。用于在文本中插入不…

pandas:读取各类文件方法以及爬虫时json数据保存

文件的读取与写入 | 常用读文件方法 | 说明 | | -------------- | ---------------- | | read_csv | 读取CSV文件 | | read_excel | 读取Excel文件 | | read_html | 读取网页HTML文件 | | read_table | 通用读取方法 | | 常用写文…

leetcode160相交列表

思路 一开始以为要固定A&#xff0c;然后循环B&#xff0c;这个复杂度也太高了 题解&#xff1a; https://leetcode.cn/problems/intersection-of-two-linked-lists/?envTypestudy-plan-v2&envIdtop-100-liked 代码 /*** Definition for singly-linked list.* publi…