Redis 入门(二):五大类型 4:集合类型

闭包潮汐
• 阅读 1288

介绍

  • 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的散列表实现的,所以这些操作的时间复杂度都是O(1)。

命令

1.增加/删除元素

SADD key member [member]
SREM key member [member]

SADD 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。本命令的返回值是成功加入的元素数量。

redis> SADD letters a
(integer) 1
redis> SADD letters a b c
(integer) 2

第二条SADD命令的返回值为2是因为元素“a”已经存在,所以实际上只加入了两个元素。
SREM 命令用来从集合中删除一个或多个元素,并返回删除成功的个数。

redis> SREM letters c d 
(integer) 1

由于元素“d”在集合中不存在,所以只删除了一个元素,返回值为 1。

2.获得集合中的所有元素

SMEMBERS key

SMEMBERS 命令会返回集合中的所有元素。

redis> SMEMBERS letters
1) "b"
2) "a"

3.判断元素是否在集合中

SISMEMBER key member

当值存在时返回1,不存在时返回0。

redis> SISMEMBERS letters a
(integer) 1
redis> SISMEMBERS letters d
(integer) 0

4.集合间运算

SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]

SDIFF 命令用来对多个集合执行差集运算。

redis> SADD setA 1 2 3
(integer) 3
redis> SADD setB 2 3 4
(integer) 3
redis> SDIFF setA setB
1) "1"
redis> SDIFF setB setA
1) "4"

SDIFF 命令支持同时传入多个键

redis> SADD setC 2 3 
(integer) 2
redis> SDIFF setA setB setC
1) "1"

计算顺序为:setA - setB 之后的结果 - setC

SINTER 命令用来对多个集合执行交集运算。

redis> SINTER setA setB
1) "2"
2) "3"

SINTER 命令同样支持同时传入多个键。

redis> SINTER setA setB setC
1) "2"
2) "3"

SUNION 命令用来对多个集合执行并集运算。

redis> SUNION setA setB
1) "1"
2) "2"
3) "3"
4) "4"

SUNION 命令同样支持多个键,这里就不赘述了。
5.获得集合中元素个数

SCARD key

例如:

redis> SMEMBERS letters
1) "b"
2) "a"
redis> SCARD letters
(integer) 2

6.进行集合运算并将结果存储

SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]

SDIFFSTORE 命令与 SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在 destiantion 键中。
SDIFFSTORE 命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。
SINTERSTORE 和 SUNIONSTORE 命令与之类似,不再赘述。
7.随机获得集合中的元素
SRANDMEMBER key [count]
SRANDMEMBER 命令用来随机从集合中获取一个元素。

redis> SRANDMEMBER letters
"a"
redis> SRANDMEMBER letters
"b"
redis> SRANDMEMBER letters
"a"

还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。
(1)当count为正数时,SRANDMEMBER 会随机从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的全部元素。
(2)当count为负数时,SRANDMEMBER 会随机从集合里获得|count|个的元素,这些元素都有可能相同。

redis> SADD letters c d
(integer) 2

目前letters集合中有 “a”,“b”,“c”,“d”。

redis> SRANDMEMBER letters 2
1) "a"
2) "c"
redis> SRANDMEMBER letters 2
1) "a"
2) "b"
redis> SRANDMEMBER letters 100
1) "b"
2) "a"
3) "c"
4) "d"
redis> SRANDMEMBER letters -2
1) "b"
2) "b"
redis> SRANDMEMBER letters -10
1) "b"    
2) "b"    
3) "a"    
4) "c"    
5) "b"    
6) "a"    
7) "b"    
8) "d"    
9) "b"    
10) "b"

8.从集合中弹出一个元素

SPOP key

因为集合是无序的,所以弹出元素也是随机的。

redis> SPOP letters
"b"
redis> SMEMBERS letters
1) "a"
2) "c"
3) "d"


整理自《Redis 入门指南第二版》。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Spring Boot Redis RedisTemplate 相关API介绍
Redis五大类型:字符串(String)、哈希/散列/字典(Hash)、列表(List)、集合(Set)、有序集合(sorted set)五种。SpringBoot集成redis的RedisTemplate,也分别提供的对这些数据类型的操作。主要有5大类:redisTemplate.opsForValue();//操作字符串redis
Stella981 Stella981
3年前
Python中的list详解
Python中内置的一种数据类型list,列表。list是一个有序集合,所谓有序集合就是可以通过Key或者Index进行访问(无序集合,集合的元素只能遍历,比如set)。list能随时随地进行增加和删除。python中list用\\进行表示。例如:\\\friends\'fanbinbin','libinbin','xijin
Stella981 Stella981
3年前
Redis常用命令
Redis常用命令Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset:有序集合)等https://gitee.com/nmwork/RedisUtil(https://gitee.com/nmwork/RedisUtil)1.  Redis数
Stella981 Stella981
3年前
Redis的列表(List)类型
列表类型(List)可以存储一个有序的字符串列表,常用的操作就是向列表两端添加元素,或者获取列表中某一个片段。列表类型内部使用双向链表(doublelinkedlist)实现的,所以向列表两端添加或删除元素的速度非常快,越是接近两端的元素就越快,但是,也有弊端,就是通过索引访问元素的速度比较慢。因为使用了双向链表实现存储的,所以在命令上也有
Stella981 Stella981
3年前
Redis 常用操作命令,非常详细!
!(https://oscimg.oschina.net/oscnet/f24c1814ac9b4a53b6182bef31b71023.jpg)下面总结并演示了Redis的常用管理命令、key操作、字符串、集合、列表、散列类型的操作命令。你需要掌握的Redis知识史上最全Red
Stella981 Stella981
3年前
Redis命令行之Zset
一、Redis之Zset简介1\.有序集合Zset是String类型的有序集合。2\.Zset中每个元素都会关联一个double类型的分数值,redis通过分数值来为集合中所有成员进行从小到大排序。3\.Zset的成员是唯一的,但分数值可以重复。4\.Zset是通过hash表实现的,添加、删除、查找的复杂度都是O(1)。5
Stella981 Stella981
3年前
Redis 有序集合(sorted set)
Redis有序集合(sortedset)Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是
Wesley13 Wesley13
3年前
Java_Learn
20180417集合类Collection如果是实现了list接口的集合类,具备的特点是有序,可重复;如果是实现了set接口的集合类,具备的特点是无序,不可重复;Collection中的方法 增加 删除查看  add("添加任意类型的元素到集合中"); addall("添加一个集合的元素到另外一个集合中") clear("
Stella981 Stella981
3年前
Redis数据结构
Redis数据结构有序集合有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数。分数是一个浮点数,在Java中是使用双精度表示的,对于每一个元素都是唯一的,但是对于不同元素而言,它的分数可以一样。元素也是String数据类型,也是一种
菜园前端 菜园前端
2年前
什么是集合?
原文链接:什么是集合?集合是一种无序且唯一的数据结构,其中的唯一是指集合中的元素。在ES6中新增了一种数据结构Set就是集合。实现功能new()实例化一个集合add()添加元素delete()删除元素has()判断是否存在元素size()获取集合大小应用场
小万哥 小万哥
2年前
Redis数据结构:高频面试题及解析
概述Redis是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。Redis支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩
闭包潮汐
闭包潮汐
Lv1
帘旌微动,峭寒天气,龙池冰泮。
文章
4
粉丝
0
获赞
0