redis之set
概述
redis集合(set)类型和list列表类型类似,都可以用来存储多个字符串元素的集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的,不存在元素下标。
redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。
内部编码有两种:
intset(整数集合):当集合元素小于set-max-ziplist-entries配置(默认配置512个),redis会使用intset作为集合的内部实现减少内存的使用
hashtable(哈希表):当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现
1
2
3
4
5
6
7
8
|
sadd setkey 1 2 3 4
object encoding setkey # intset
sadd setkeys 1 2 .... 513
object encoding setkeys # hashtable
sadd setkeyss a
object encoding setkeyss # hashtable
|
使用语法
基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
127.0.0.1:6379> sadd myset hello #添加元素
(integer) 1
127.0.0.1:6379> sadd myset snailsir
(integer) 1
127.0.0.1:6379> sadd myset !
(integer) 1
127.0.0.1:6379> smembers myset #查看所有元素
1) "hello"
2) "!"
3) "snailsir"
127.0.0.1:6379> sismember myset hello #判断某个元素是否存在
(integer) 1
127.0.0.1:6379> sismember myset word
(integer) 0
|
获取个数
1
2
|
127.0.0.1:6379> scard myset
(integer) 3
|
移除指定元素
1
2
3
4
5
|
127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> smembers myset
1) "!"
2) "snailsir"
|
set 无序不重复集合
随机抽取元素
1
2
3
4
|
127.0.0.1:6379> srandmember myset 1 #从集合myset中随机抽取一个元素
1) "snailsir"
127.0.0.1:6379> srandmember myset 1
1) "!"
|
随机删除元素
1
2
3
4
5
6
7
|
127.0.0.1:6379> smembers myset
1) "!"
2) "snailsir"
127.0.0.1:6379> spop myset #随机删除一些set集合中的元素
"!"
127.0.0.1:6379> spop myset
"snailsir"
|
将一个指定的值,移动到另外一个set集合!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset word
(integer) 1
127.0.0.1:6379> sadd myset snailsir
(integer) 1
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 snailsir
(integer) 1
127.0.0.1:6379> smembers myset
1) "word"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "snailsir"
2) "set2"
|
博客,b站,共同关注(并集)
数字集合类:
差/交/并集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 #key1与key2 差集
1) "b"
2) "a"
127.0.0.1:6379> sinter key1 key2 #key1与key2 交集
1) "c"
127.0.0.1:6379> sunion key1 key2 #key1与key2 并集
1) "a"
2) "c"
3) "d"
4) "e"
5) "b"
|
应用场景
抽奖
商品筛选
黑白名单
分库分表异构索引
数据结构