四 sets类型操作
set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合
求交并差等操作, 操作中 key 理解为集合的名字。
Redis 的 set 是 string 类型的无序集合。 set 元素最大可以包含(2 的 32 次方)个元素。
set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。 hash table 会随
着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写
锁)会阻塞其他读写操作,可能不久后就会改用跳表( skip list)来实现,跳表已经在 sorted
set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的
取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns
中的好友推荐和 blog 的 tag 功能。
1 sadd
向名称为key的的set中添加元素:
127.0.0.1:6379> sadd settest "Alex"
(integer) 1
127.0.0.1:6379> smembers settest
1) "Bob"
2) "Alex"
2 srem
删除名称key的set中的元素。
127.0.0.1:6379> sadd tyutclass 1201
(integer) 1
127.0.0.1:6379> sadd tyutclass 1202
(integer) 1
127.0.0.1:6379> sadd tyutclass 1203
(integer) 1
127.0.0.1:6379> sadd tyutclass 1204
(integer) 1
127.0.0.1:6379> srem tyutclass 1201
(integer) 1
127.0.0.1:6379> smembers tyutclass
1) "1202"
2) "1203"
3) "1204"
3 spop
随机删除一个元素。
127.0.0.1:6379> spop tyutclass
"1203"
127.0.0.1:6379> smembers tyutclass
1) "1202"
2) "1204"
4 sdiff
返回与第一个key和第二个key的差集,也就是第一个key当中有的,第二个当中没有的元素。
127.0.0.1:6379> SMEMBERS tyutclass
1) "1202"
2) "1204"
127.0.0.1:6379> SMEMBERS tyutclass1
1) "1201"
2) "1202"
127.0.0.1:6379> SDIFF tyutclass tyutclass1
1) "1204"
5 sdiffstore
返回差集并保存到另一个key当中。
127.0.0.1:6379> SDIFFSTORE tyutclass2 tyutclass tyutclass1
(integer) 1
127.0.0.1:6379> SMEMBERS tyutclass2
1) "1204"
6 sinter
返回给你所有key的交集。
127.0.0.1:6379> SINTER tyutclass tyutclass1
1) "1202"
7 sinterstore
返回交集,并保存到另一个key。
127.0.0.1:6379> SINTERSTORE tyutclass3 tyutclass tyutclass1
(integer) 1
127.0.0.1:6379> SMEMBERS tyutclass3
1) "1202"
8 sunion
返回给定key的并集。
127.0.0.1:6379> SUNION tyutclass tyutclass1
1) "1201"
2) "1202"
3) "1204"
9 sunionstore
返回并集并保存到另一个key。
127.0.0.1:6379> SUNIONSTORE tyutclass4 tyutclass tyutclass1
(integer) 3
127.0.0.1:6379> SMEMBERS tyutclass4
1) "1201"
2) "1202"
3) "1204"
10 smove
从第一个key中移除元素,保存到第二个key中。
127.0.0.1:6379> SMEMBERS tyutclass
1) "1202"
127.0.0.1:6379> SMEMBERS tyutclass1
1) "1201"
2) "1202"
3) "1204"
11 scard
返回给定key的元素个数。
127.0.0.1:6379> SCARD tyutclass1
(integer) 3
12 sismember
测试key中是否包含某元素。
127.0.0.1:6379> SISMEMBER tyutclass1 1201
(integer) 1
13 srandmember
随机返回key中某个或几个元素,但是不删除。
127.0.0.1:6379> SRANDMEMBER tyutclass1 2
1) "1202"
2) "1201"
五 sorted sets类型操作
sorted set 是 set 的一个升级版本, 它在 set 的基础上增加了一个顺序属性,这一属性在添加
修改元素的时候可以指定,每次指定后, zset 会自动重新按新的值调整顺序。
1 zadd
添加元素。
127.0.0.1:6379> ZADD class1 1 1201
(integer) 1
127.0.0.1:6379> ZADD class1 2 1202
(integer) 1
127.0.0.1:6379> ZADD class1 3 1203
(integer) 1
127.0.0.1:6379> ZRANGE class1 0 -1 withscores
1) "1201"
2) "1"
3) "1202"
4) "2"
5) "1203"
6) "3"
2 zrem
删除元素。
127.0.0.1:6379> zrem class1 1203
(integer) 1
127.0.0.1:6379> ZRANGE class1 0 -1 withscores
1) "1201"
2) "1"
3) "1202"
4) "2"
3 zincrby
如果指定key当中存在该元素,则score加指定的值,如果不存在,则添加该元素,并且score为指定的值。
127.0.0.1:6379> ZRANGE class1 0 -1 withscores
1) "1201"
2) "1"
3) "1202"
4) "2"
127.0.0.1:6379> ZINCRBY class1 2 1201
"3"
127.0.0.1:6379> ZRANGE class1 0 -1 withscores
1) "1202"
2) "2"
3) "1201"
4) "3"
4 zrank
返回key当中的指定元素下标位置。按照score从小到大排序。
127.0.0.1:6379> ZRANGE class1 0 -1 withscores
1) "1202"
2) "2"
3) "1201"
4) "3"
127.0.0.1:6379> ZRANk class1 1201
(integer) 1
5 zrevrank
同4,按照从大到小排序。
127.0.0.1:6379> ZREVRANk class1 1201
(integer) 0
6 zrangebyscore
返回指定score区间内的元素。
127.0.0.1:6379> ZRANGEBYSCORE class1 2 3 withscores
1) "1202"
2) "2"
3) "1201"
4) "3"
7 zcount
返回指定score区间内元素的数量。
127.0.0.1:6379> zcount class1 2 3
(integer) 2
8 zcard
返回集合中元素个数。
127.0.0.1:6379> ZCARD class1
(integer) 2
9 zscore
返回给定元素的score。
127.0.0.1:6379> ZSCORE class1 1202
"2"
10 zremrangebyrank
删除排序后下标为指定区间的元素。
127.0.0.1:6379> ZREMRANGEBYRANK class1 1 1
(integer) 1
127.0.0.1:6379> ZRANGE class1 0 -1
1) "1202"
11 zrangebylex
返回指定集合中的元素。
127.0.0.1:6379> zadd names 0 Alex 0 Bob 0 Cater 0 Diamond 0 Fox
(integer) 5
127.0.0.1:6379> ZRANGEBYLEX names - (z
1) "Alex"
2) "Bob"
3) "Cater"
4) "Diamond"
5) "Fox"
127.0.0.1:6379> ZRANGEBYLEX names - (b
1) "Alex"
2) "Bob"
3) "Cater"
4) "Diamond"
5) "Fox"
127.0.0.1:6379> ZRANGEBYLEX names - (B
1) "Alex"
127.0.0.1:6379> ZRANGEBYLEX names [B [D
1) "Bob"
2) "Cater"
12 zremrangebylex
删除指定集合区间内的元素。
127.0.0.1:6379> ZREMRANGEBYLEX names (D [F
(integer) 1
127.0.0.1:6379> ZRANGE names 0 -1
1) "Alex"
2) "Bob"
3) "Cater"
4) "Fox"