Featured image of post redis之set

redis之set

redis的数据类型set的概述、应用以及数据结构介绍

本文阅读量

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"

应用场景

抽奖

商品筛选

黑白名单

分库分表异构索引

数据结构

使用 Hugo 构建
主题 StackJimmy 设计