Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。
一、介绍
Set 集合用于存储无序且不重复的元素。
列表可以存储重复元素,而集合只会存储非重复元素。如添加已存在的元素将被忽略
Set 重要的特性:即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
二、数据结构
底层使用两种数据结构存储:
- inset 可理解为数组
- hashtable 普通的哈希表(key为set的值,value为null)
使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:
- 对象保存的所有元素都是整数值(int)
- 对象保存的元素数量不超过512个
set-max-inset-entries 512
三、操作命令
命令 | 功能 | 语法 | 描述 |
smembers | 查询 |
| 返回集合中所有元素 |
sadd | 添加 |
| 向集合添加一个或多个成员 |
srem | 删除指定元素 |
| 删除集合中一个或多个成员 |
spop | 随机删除 |
| 删除并返回集合中的一个或多个随机元素 |
smove | 移动指定元素 |
| 从源集合移动某个元素到目标集合中 |
scard | 获取长度 |
| 获取集合的成员数 |
sdiff | 差集 (不同) |
| 返回指定的所有集合的差集 |
sinter | 交集 (相同) |
| 返回给定所有集合的交集 |
sunion | 并集 (合并) |
| 返回所有给定集合的并集 |
srandmember | 随机返回 |
| 返回集合中一个或多个随机数 |
sismember | 判断是否存在 |
| 判断集合中是否存在某成员 |
sinterstore | 交集存入新集合 |
| 返回指定集合的交集,并存储到新集合 |
sdiffstore | 差集存入新集合 |
| 返回指定集合的差集,并存储到新集合 |
sunionstore | 合集存入新集合 |
| 返回指定集合的合集,并存储到新集合 |
(添加)
语法:
Sadd key 成员1 [成员2 ...]
[127.0.0.1:6379> sadd set a b c c d # 创建或往myset集合中添加“a、b、c、d“成员
(integer) 4
[127.0.0.1:6379> smembers set # [smembers key] 查询myset中所有成员
1) "c"
2) "b"
3) "a"
4) "d"
2、Srem 移除一个或多个指定成员 (删除指定成员)
语法:
Srem key 成员1 ..
# 原集合中所有成员
[127.0.0.1:6379> smembers myset
1) "b"
2) "a"
3) "d"
4) "c"
[127.0.0.1:6379> srem myset a b # 删除myset集合中 “a"、"b" 两个成员
(integer) 2
[127.0.0.1:6379> smembers myset # 查询集合中所有成员
1) "d"
2) "c"
3、Spop 移除并返回集合中的一个随机成员 (删除随机成员)
语法:
Spop key [count]
# 原集合中所有成员
[127.0.0.1:6379> smembers myset
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
# 1. 移除myset集合中随机2个成员
[127.0.0.1:6379> spop myset 2
1) "b"
2) "e"
# 原集合中所有成员
[127.0.0.1:6379> smembers myset
1) "a"
2) "d" # 成员“b、e"已被移除
3) "c"
# 2. 移除myset集合中随机1个成员
[127.0.0.1:6379> spop myset
"a"
# 原集合中所有成员
[127.0.0.1:6379> smembers myset
1) "d"
2) "c"
4、Smove 从源集合移动某个元素到目标集合中(移动成员)
语法:
Smove [源集合] [目标集合] 成员
# 创建并添加成员到myset集合中(注意newset集合不存在)
[127.0.0.1:6379> sadd myset a b c d
(integer) 4
[127.0.0.1:6379> smove myset newset a #1.移动源集合myset中“a"成员到目标集合newset
(integer) 1 # 返回成功移动了1个
# 查看newset新集合的所有成员
[127.0.0.1:6379> smembers myset
1) "c"
2) "b"
3) "d"
# 查看newset新集合的所有成员
[127.0.0.1:6379> smembers newset
1) "a"
[127.0.0.1:6379> smove myset newset a # 2.移动不存在的成员,返回 0
(integer) 0
5、Scard 获取某个集合中所有成员个数 (获取成员个数)
语法:
Sadd key
[127.0.0.1:6379> smembers set # [smembers key] 查询myset中所有成员
1) "c"
2) "b"
3) "a"
4) "d"
[127.0.0.1:6379> scard myset # 获取myset集合成员个数
(integer) 4
6、Sdiff 返回给定集合中的差集 (差集)
语法:
Sdiff key1 [key2..]
# 创建myset、myset2集合,并往集合中添加成员
[127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> sadd myset2 b c k m
(integer) 4
# 查询myset的差集
[127.0.0.1:6379> sdiff myset
1) "a"
2) "b"
3) "c"
4) "d"
# 查询myset集合基于myset2集合中的差集
[127.0.0.1:6379> sdiff myset myset2
1) "a"
2) "d" # myset集合中的元素在myset2中,少了"a"、"d"
# 查询myset2集合基于myset集合中的差集
[127.0.0.1:6379> sdiff myset2 myset
1) "k"
2) "m" # myset2集合中的元素在myset中,少了"k"、"m"
7、Sinter 返回给定集合中的交集 (交集)
语法:
Sinter key1 [key2..]
# 创建myset、myset2集合,并往集合中添加成员
[127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> sadd myset2 b c k m
(integer) 4
[127.0.0.1:6379> sinter myset myset2 # 查询myset、myset2集合中相同的成员
1) "c"
2) "b"
8、Sunion 返回给定集合中的并集 (并集)
语法:
Sunion key1 [key2..]
# 创建myset、myset2集合,并往集合中添加成员
[127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> sadd myset2 b c k m
(integer) 4
[127.0.0.1:6379> sunion myset myset2 # 查询myset、myset2集合中的所有成员
1) "b"
2) "a"
3) "k"
4) "d"
5) "c"
6) "m"
9、Srandmember 返回集合中一个或多个随机数 (随机返回)
语法:
Srandmember key [count]
# 创建myset集合,并往集合中添加成员
[127.0.0.1:6379> sadd myset a b c d
(integer) 4
# 随机返回集合中2个成员
[127.0.0.1:6379> srandmember myset 2
1) "a"
2) "c"
# 查询myset集合中所有成员
[127.0.0.1:6379> smembers myset
1) "c"
2) "b"
3) "a"
4) "d"
10、Sismember 判断集合中是否存在某成员 (判断是否存在)
语法:
Srandmember key [count]
# 查询myset集合中所有成员
[127.0.0.1:6379> smembers myset
1) "c"
2) "b"
3) "a"
4) "d"
[127.0.0.1:6379> sismember myset k # 判断myset集合中是否存在"k"
(integer) 0
[127.0.0.1:6379> sismember myset a # 判断myset集合中是否存在"a"
(integer) 1 # 存在,返回1
返回给定所有集合的交集并存储在 destination 中
11、Sinterstore 获取指定集合的交集并存入到新集合 (获取交集并存入新集合)
语法:
Sinterstore [新集合] key1 ...
# 创建myset1、myset2集合,并添加成员到集合中
[127.0.0.1:6379> sadd myset1 a b c
(integer) 3
[127.0.0.1:6379> sadd myset2 b m k
(integer) 3
# 1. 获取myset1与myset2集合中的相同成员,并存入myset3集合中
[127.0.0.1:6379> sinterstore myset3 myset1 myset2
(integer) 1
# 查询 myset1集合
[127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "a"
# 查询 myset2集合
[127.0.0.1:6379> smembers myset2
1) "b"
2) "k"
3) "m"
# 查询 myset3集合
[127.0.0.1:6379> smembers myset3
1) "b"
(获取差集并存入新集合)
语法:
Sdiffstore [新集合] key1 ...
# 创建myset1、myset2集合,并添加成员到集合中
[127.0.0.1:6379> sadd myset1 a b c
(integer) 3
[127.0.0.1:6379> sadd myset2 b m k
(integer) 3
# 1. 获取myset1 在 myset2集合中的不存在的成员,并存入myset3集合中
[127.0.0.1:6379> sdiffstore myset3 myset1 myset2
(integer) 1
# 查询 myset1集合
[127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "a"
# 查询 myset2集合
[127.0.0.1:6379> smembers myset2
1) "b"
2) "k"
3) "m"
# 查询 myset3集合
[127.0.0.1:6379> smembers myset3
1) "a" # "a"、"c"元素不存在myset2种
2) "c"
13、Sunionstore 获取指定集合的合集并存入到新集合 (获取合集并存入新集合)
语法:
Sunionstore [新集合] key1 ...
# 创建myset1、myset2集合,并添加成员到集合中
[127.0.0.1:6379> sadd myset1 a b c
(integer) 3
[127.0.0.1:6379> sadd myset2 b m k
(integer) 3
# 1. 获取myset1与myset2集合中的所有成员,并存入myset3集合中
[127.0.0.1:6379> sunionstore myset3 myset1 myset2
(integer) 1
# 查询 myset3集合
[127.0.0.1:6379> smembers myset3
1) "a"
2) "b"
3) "c"
4) "k"
5) "m"
四、应用范围
- 文章浏览统计;利用set保存唯一性数据;同一个IP地址访问当前页面不断刷新只记录一次有效浏览数,仅需在每次访问该文章时将访问者的IP存入Redis中
- 好友推荐;可以通过Set类型的数据,做交集、并集、差集等方式,得到好友之间的共同关注