【Redis入门到精通三】Redis核心数据类型(List,Set)详解
目录
Redis数据类型
编辑
1.List类型
(1)常见命令
(2)内部编码
2.Set类型
(1)常见命令
(2)内部编码
Redis数据类型
查阅Redis官方文档可知,Redis提供给用户的核心数据类型有以下九个,从上到下依次是字符串,哈希,列表,集合,有序集合,流,位图,位域,地址空间。因为Redis本身就是通过键值对的方式存储数据,这些数据类型都存在于Redis的value中 ,不同的数据类型,所需要的插入命令也不相同。下面我将依据官方文档对这九种数据类型依次进行介绍,本篇文章将着重对List,Set两种数据类型进行介绍。
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类型
(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路线会用到的技术。
🎃求点赞!求收藏!求评论!求关注!
🤷♀️谢谢大家!!!!!!!