Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。

redis list set 区别 redis list和set_缓存

 一、介绍

Set 集合用于存储无序且不重复的元素。

列表可以存储重复元素,而集合只会存储非重复元素。如添加已存在的元素将被忽略

Set 重要的特性:即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

二、数据结构

底层使用两种数据结构存储:

  • inset     可理解为数组
  • hashtable  普通的哈希表(key为set的值,value为null)

使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 对象保存的所有元素都是整数值(int)
  • 对象保存的元素数量不超过512个

set-max-inset-entries 512

三、操作命令

redis list set 区别 redis list和set_redis_02

命令

功能

语法

描述

smembers

查询

Smembers key

返回集合中所有元素

sadd

添加

Sadd key 成员1 ..

向集合添加一个或多个成员

srem

删除指定元素

Srem key 成员1 ..

删除集合中一个或多个成员

spop

随机删除

Spop key [count]

删除并返回集合中的一个或多个随机元素

smove

移动指定元素

Smove [源集合] [目标集合] 成员

从源集合移动某个元素到目标集合中

scard

获取长度

Sadd key

获取集合的成员数

sdiff

差集 (不同)

Sdiff key1 [key2..]

返回指定的所有集合的差集

sinter

交集 (相同)

Sinter key1 [key2..]

返回给定所有集合的交集

sunion

并集 (合并)

Sunion key1 [key2..]

返回所有给定集合的并集

srandmember

随机返回

Srandmember key [count]

返回集合中一个或多个随机数

sismember

判断是否存在

Sismemeber key [成员]

判断集合中是否存在某成员

sinterstore

交集存入新集合

Sinterstore [新集合] key1 ...

返回指定集合的交集,并存储到新集合

sdiffstore

差集存入新集合

Sdiffstore [新集合] key1 ...

返回指定集合的差集,并存储到新集合

sunionstore

合集存入新集合

Sunionstore [新集合] key1 ...

返回指定集合的合集,并存储到新集合

(添加)

语法: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类型的数据,做交集、并集、差集等方式,得到好友之间的共同关注