set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随
着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写
锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted
set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的
取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns
中的好友推荐和 blog 的 tag 功能
1:
redis 127.0.0.1:6378> sadd myset ljq
(integer) 1
redis 127.0.0.1:6378> sadd myset ljq2
(integer) 1
redis 127.0.0.1:6378> sadd myset ljq3 //添加
(integer) 1
redis 127.0.0.1:6378> smembers myset
1) "ljq2"
2) "ljq3"
3) "ljq"
redis 127.0.0.1:6378> srem myset ljq //删除某个
(integer) 1
redis 127.0.0.1:6378> smembers myset // 显示set
1) "ljq2"
2) "ljq3"
redis 127.0.0.1:6378> spop myset // 随机删除一个
"ljq3"
redis 127.0.0.1:6378> smembers myset
1) "ljq2"
redis 127.0.0.1:6378> sadd myset ljq3
(integer) 1
redis 127.0.0.1:6378> sadd myset ljq4
(integer) 1
redis 127.0.0.1:6378> smembers myset
1) "ljq2"
2) "ljq4"
3) "ljq3"
redis 127.0.0.1:6378> sadd myset2 ljq3
(integer) 1
redis 127.0.0.1:6378> sadd myset hello
(integer) 1
redis 127.0.0.1:6378> sadd myset2 hiworkd
(integer) 1
redis 127.0.0.1:6378> smembers myset2
1) "ljq3"
2) "hiworkd"
//返回所有给定 key 与第一个 key 的差集
redis 127.0.0.1:6378> sdiff myset myset2 // 显示myset中和myset2不同的
1) "ljq2"
2) "hello"
3) "ljq4"
redis 127.0.0.1:6378> sdiff myset2 myset // 显示myset2中和myset不同的
1) "hiworkd"
2:sdiffstore 返回所有给定 key 与第一个 key 的差集保存到另一个set中
redis 127.0.0.1:6378> smembers myset2
1) "hello"
2) "ljq3"
3) "ljq4"
redis 127.0.0.1:6378> sdiffstore myset3 myset2 myset
(integer) 1
redis 127.0.0.1:6378> smembers myset3
1) "hello"
3:交集sinter
redis 127.0.0.1:6378> sinter myset2 myset // 交集
1) "ljq4"
2) "ljq3"
redis 127.0.0.1:6378> sinterstore myset4 myset2 myset //交集保存到myset4中
(integer) 2
redis 127.0.0.1:6378> smembers myset4
1) "ljq3"
2) "ljq4"
4:并集sunion
redis 127.0.0.1:6378> sunion myset6 myset myset5 // 并集
1) "one"
2) "ljq3"
3) "ljq4"
4) "two"
redis 127.0.0.1:6378> smembers myset6
(empty list or set)
redis 127.0.0.1:6378> sunionstore myset6 myset myset5 // 并集保存到myset6
(integer) 4
redis 127.0.0.1:6378> smembers myset6
1) "one"
2) "ljq3"
3) "ljq4"
5:smove从第一个 key 对应的 set 中移除 member 并添加到第二个对应 set 中
redis 127.0.0.1:6378> smembers myset6
1) "one"
2) "ljq3"
3) "ljq4"
4) "two"
redis 127.0.0.1:6378> smove myset6 myset7 one // 删除myset6一个放到myset7
(integer) 1
redis 127.0.0.1:6378> smembers myset7
1) "one"
redis 127.0.0.1:6378> smembers myset6
1) "ljq3"
2) "ljq4"
3) "two"
6:scard , sismember
redis 127.0.0.1:6378> smembers myset6 1) "ljq3" 2) "ljq4" 3) "two" redis 127.0.0.1:6378> scard myset6 //显示个数 (integer) 3 redis 127.0.0.1:6378> sismember myset6 ljq3 //判断是否存在 (integer) 1 redis 127.0.0.1:6378> sismember myset6 ljq77 (integer) 0