redis的set类型
redis的set类型
set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随
着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写
锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted
set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的
取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns
中的好友推荐和 blog 的 tag 功能
1: Java代码 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中 Java代码 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 Java代码 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 Java代码 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 中 Java代码 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 Ubuntu代码 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