01-redis安装:how2j.cn/k/redis/red…html
02-redis学习:<Redis开发与运维>(获取本书PDF见文章末)java
它是用来保存多个字符串的元素,元素不能够重复,而且元素是无序的,不能经过索引下标获取元素。Redis除了支持元素的增删改查以外,还支持集合之间的交集、并集和补集。redis
以下图:集合user:1:follow包含着it、music、his和sports一共4个元素。一个集合最多能够存储2的32次方减1个元素。运维
经常使用的命令和时间复杂度学习
添加的元素不能重复,不然会返回0。能够看出元素仍是无序的。编码
127.0.0.1:6379> sadd myset a b c (integer) 3 127.0.0.1:6379> sadd myset a b (integer) 0 127.0.0.1:6379> smembers myset 1) "c" 2) "a" 3) "b" 复制代码
127.0.0.1:6379> smembers myset
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> srem myset a b (integer) 2 127.0.0.1:6379> smembers myset 1) "c" 复制代码
127.0.0.1:6379> smembers myset
1) "c"
127.0.0.1:6379> scard myset (integer) 1 复制代码
元素存在返回1,不存在返回0spa
127.0.0.1:6379> smembers myset
1) "c"
127.0.0.1:6379> sismember myset c (integer) 1 127.0.0.1:6379> sismember myset a (integer) 0 复制代码
127.0.0.1:6379> sadd myset a b d (integer) 3 127.0.0.1:6379> srandmember myset "d" 127.0.0.1:6379> srandmember myset "a" 127.0.0.1:6379> smembers myset 1) "a" 2) "c" 3) "d" 4) "b" 复制代码
127.0.0.1:6379> spop myset
"d"
127.0.0.1:6379> spop myset
"b"
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
复制代码
srandmember和spop都是随机从集合选出元素,二者不一样的是spop命令执行后,元素会从集合中删除,而srandmember不会。3d
127.0.0.1:6379> smembers myset
1) "a"
2) "c"
复制代码
添加2个集合,分别是user:1:follow和user:2:followcode
127.0.0.1:6379> sadd user:1:follow a b c d (integer) 4 127.0.0.1:6379> sadd user:2:follow a e f d (integer) 4 复制代码
127.0.0.1:6379> sadd user:1:follow a b c d (integer) 4 127.0.0.1:6379> sadd user:2:follow a e f d (integer) 4 127.0.0.1:6379> sinter user:1:follow user:2:follow 1) "a" 2) "d" 复制代码
127.0.0.1:6379> sadd user:1:follow a b c d (integer) 4 127.0.0.1:6379> sadd user:2:follow a e f d (integer) 4 127.0.0.1:6379> sunion user:1:follow user:2:follow 1) "c" 2) "a" 3) "e" 4) "d" 5) "b" 6) "f" 复制代码
127.0.0.1:6379> sadd user:1:follow a b c d (integer) 4 127.0.0.1:6379> sadd user:2:follow a e f d (integer) 4 127.0.0.1:6379> sdiff user:1:follow user:2:follow 1) "c" 2) "b" 复制代码
集合之间的运算在元素比较多的时候会比较耗时,因此将它们保存起来。cdn
交集
127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) "a"
2) "d"
复制代码
并集
127.0.0.1:6379> sunionstore user:1_2:sunion user:1:follow user:2:follow
(integer) 6
127.0.0.1:6379> type user:1_2:sunion
set
127.0.0.1:6379> smembers user:1_2:sunion
1) "c"
2) "a"
3) "e"
4) "d"
5) "b"
6) "f"
复制代码
补集
127.0.0.1:6379> sdiffstore user:1_2:sdiff user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:sdiff
set
127.0.0.1:6379> smembers user:1_2:sdiff
1) "c"
2) "b"
复制代码
集合中的元素都是整数,而且元素的个数都小于512个时,redis会采用intset,减小内存的使用。
超过512个元素,redis会选择hashtable。
示例
127.0.0.1:6379> sadd mekey 1 2 3 4 5
(integer) 5
127.0.0.1:6379> object encoding mekey
"intset"
复制代码
127.0.0.1:6379> sadd mekey 1 2 3 4 5 6 ... 512 513
(integer) 509
127.0.0.1:6379> scard setkey (integer) 513 127.0.0.1:6379> object encoding listkey "hashtable" 复制代码
127.0.0.1:6379> sadd mekey 1 a b d 4 5
(integer) 3
127.0.0.1:6379> object encoding mekey
"hashtable"
复制代码
标签
一个用户对娱乐、新闻感兴趣,另外一个用户对历史、科技感兴趣,有了这些数据就能够拿到喜欢同一个类型的用户了,就能够给对应的用户推荐他们感兴趣的内容。
127.0.0.1:6379> sadd user:1:tags one two three (integer) 3 127.0.0.1:6379> sadd user:2:tags one four five (integer) 3 复制代码
127.0.0.1:6379> sadd one:users user:1 user:3
(integer) 2
127.0.0.1:6379> sadd two:users user:1
(integer) 1
复制代码
用户和标签的关系应该放在一个事务中执行,防止事务不一致,致使命令执行失败。
127.0.0.1:6379> smembers user:1:tags
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> srem user:1:tags one (integer) 1 127.0.0.1:6379> smembers user:1:tags 1) "two" 2) "three" 复制代码
127.0.0.1:6379> smembers one:users
1) "user:1"
2) "user:3"
127.0.0.1:6379> srem one:users user:1
(integer) 1
127.0.0.1:6379> smembers one:users
1) "user:3"
复制代码
127.0.0.1:6379> smembers user:1:tags
1) "two"
2) "three"
3) "five"
127.0.0.1:6379> smembers user:2:tags
1) "one"
2) "five"
3) "four"
127.0.0.1:6379> sinter user:1:tags user:2:tags
1) "five"
复制代码
连接:关注公众号Elevenkeep,回复redis便可得到连接。