1.介绍
set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交(intersection),差集(difference)。通过这些操作可以很容易的实现 sns中的好友推荐和 blog 的 tag 功能.
2.命令
2.1 sadd向key中添加数据
127.0.0.1:6379> sadd myset hello(integer) 1
2.2 smembers显示key中所有的value
127.0.0.1:6379> smembers myset1) "hello"
2.3 srem 删除key中指定value的值
127.0.0.1:6379> srem myset hello(integer) 1127.0.0.1:6379> smembers myset(empty list or set)
2.4 spop,随机返回并删除名称为key的set中的一个元素
127.0.0.1:6379> sadd myset tonva(integer) 1127.0.0.1:6379> sadd myset huage(integer) 1127.0.0.1:6379> sadd myset hello(integer) 1127.0.0.1:6379> smembers myset1) "huage"2) "tonva"3) "hello"127.0.0.1:6379> spop myset"hello"127.0.0.1:6379> smembers myset1) "huage"2) "tonva"127.0.0.1:6379> spop myset"tonva"127.0.0.1:6379> smembers myset1) "huage"
2.5 sdiff 返回所有给定key与第一个key的差集(前面-后面后保留前面剩下的)
127.0.0.1:6379> smembers myset1) "three"2) "two"3) "one"127.0.0.1:6379> smembers myset21) "two"2) "one"127.0.0.1:6379> smembers myset31) "three"127.0.0.1:6379> sdiff myset myset31) "two"2) "one"127.0.0.1:6379> sdiff myset3 myset(empty list or set)127.0.0.1:6379> smembers myset41) "four"2) "one"127.0.0.1:6379> sdiff myset myset2 myset41) "three"
2.6 sdiffstore ,返回所有key与第一个key的差值,并将结果存为另一个key
127.0.0.1:6379> sdiffstore newset myset myset2(integer) 1127.0.0.1:6379> smembers newset1) "three"
2.7 sinter 返回所有给定key的交集
127.0.0.1:6379> smembers myset1) "three"2) "two"3) "one"127.0.0.1:6379> smembers myset21) "two"2) "one"127.0.0.1:6379> sinter myset myset21) "two"2) "one"
2.8 sinterstore ,放回所有给定key的交集并保存到新的key中
127.0.0.1:6379> sinterstore newset myset myset2(integer) 2127.0.0.1:6379> smembers newset1) "two"2) "one"
2.9 sunion,返回所有给定key的并集
127.0.0.1:6379> sunion myset myset41) "two"2) "three"3) "four"4) "one"
2.10 sunionstore,返回所有给定key的并集,同时存到新key中
127.0.0.1:6379> sunionstore newset myset myset4(integer) 4127.0.0.1:6379> smembers newset1) "two"2) "three"3) "four"4) "one"
2.11 smove,从第一个key中移动value到另外一个key中
127.0.0.1:6379> smembers myset1) "three"2) "two"3) "one"127.0.0.1:6379> smembers myset31) "three"127.0.0.1:6379> smove myset myset3 one(integer) 1127.0.0.1:6379> smembers myset31) "three"2) "one"127.0.0.1:6379> smembers myset1) "three"2) "two"
2.12 scard 返回key中对应的value的个数
127.0.0.1:6379> scard myset(integer) 3
2.13 sismember ,返回key中是否存在指定value的值
127.0.0.1:6379> sismember myset four(integer) 0127.0.0.1:6379> sismember myset two(integer) 1127.0.0.1:6379> smembers myset1) "three"2) "two"3) "one"
2.14 srandmember,随机返回名称为key的其中一个元素,但是不删除元素
127.0.0.1:6379> smembers myset1) "three"2) "two"3) "one"127.0.0.1:6379> srandmember myset"two"127.0.0.1:6379> srandmember myset"one"