【redis】04set类型和zset类型

sets类型
 
sets类型及操作
 
Set类型是一个集合,他是string类型的无序集合,也就是说咱们的set是没有顺序的,
Set是通过hash table实现的,添加、删除和查找的复杂度都是O(1)。
对咱们集合我们可以取并集、交集、差集。也就是说咱们这里的set集合, 类似于咱们数学里的集合的概念:
set1与set2的并集,是1,2,3。交集是2,是不是只有2是相同的,
咱们的差集是不是只有set1的1和set2的3不一样啊,这是咱们一个集合的概念,一会儿我给大家详细的讲,
 
通过这些操作我们可以对SNS网站中的好友推荐,以及博客blog里面的标签功能,
还记得咱们新浪微博或者QQ里面,是不是有个好友推荐,我有的好友,你没有,但是
咱们俩之间又是好友,是不是我将我的好友推荐给你啊,这个就是取的咱们俩的差集吧,
这是咱们set数据类型的一个概念,那好,那既然他有这些操作,
那么咱们来看一下他有什么样的数据方法,有什么样的操作方法,
 
sadd
第一个方法向集合中添加一个元素,sadd,咱们可以使用sadd方法,
向名称为key的set中添加一个元素,
sadd myset "hello"
sadd的第一个参数,代表,你要添加的集合的名称,第二个参数代表你要添加到集合的元素,
 
 sadd myset1 one
(integer) 1
 sadd myset1 two
(integer) 1
 sadd myset1 one
(integer) 0
我第一次,添加一个one,返回1表示,添加成功,
第二次添加two,返回1表示添加成功吧,
第三次,我又添加一个相同的元素one,返回的是什么?返回的是0吧,
代表添加不成功吧,这个时候咱们可以查看一下集合里面有什么样的元素,
咱们可以使用一个方法叫smembers
 
smembers
smembers myset1
1) "two"
2) "one"
这里是不是只返回两个元素,一个two,一个one,不是两个two吧,
因为我第二次插入two的时候,是不是没有插入成功吖,
也就是说咱们集合里面不允许有重复的值吧,
查看元素咱们要使用方法smembers,
member代表成员吧,查看咱们集合里面的所有成员,
 
这是咱们的sadd方法跟smembers方法,一个添加一个查看,
有添加咱们是不是就应该有删除啊,
咱们把一个元素从集合里面删除,用什么方法,
用咱们的srem方法,rem是remove的缩写吧,
 
srem
首先咱们向myset2里面添加一个元素“one”
又向咱们的myset2里面添加一个元素“two”
这个时候我如果想把one元素删除掉,咱们要用咱们的srem,
将咱们的myset2中的one删除掉,
这里添加成功返回1,删除成功也返回1,
 
sadd myset2 one
(integer) 1
sadd myset2 two
(integer) 1
sadd myset2 three
(integer) 1
那好添加三个元素, 
smembers myset2
1) "three"
2) "two"
3) "one"
都返回1是不是代表添加成功,最终咱们集合里面的元素是不是one two three三个元素,
那么咱们删除一个比如说咱们要把two删除掉,
srem myset2 two
(integer) 1
这里返回一个1代表删除成功,
srem myset2 two
(integer) 0
我再删除一个two返回0,因为我的two是不是已经被删除掉了啊,
这里再删的时候是不是没有two啦,所以返回0代表删除不成功吧,
这个时候再来查看一下他里面的元素,
smembers myset2
1) "three"
2) "one"
是不是只剩下one跟three啦,咱们是不是成功把咱们的two元素删除掉了吧,
这是咱们的srem方法,删除集合里面的某个元素,叫做srem方法,
 
spop
咦……
这里怎么会有spop方法啊,spop方法代表什么意思,咱们还记得list里面有lpop跟rpop吧
lpop是不是代表怎么从list链表里面从头部,弹出一个元素吧,rpop是不是代表从尾部,弹出一个元素,
 
那这儿的spop呢,同样也是从集合里面弹出一个元素,但是咱们的集合咱们也从前面看到这个概念了。
前面的集合是无序集合吧,也就是说你的spop你是无法指定弹出元素的,也就是他会随机弹出
他并不会像咱们的链表从头或者尾部弹出一个元素,
咱们的spop只能是随机弹出,
sadd myset3 one
(integer) 1
sadd myset3 two
(integer) 1
sadd myset3 three
(integer) 1
sadd myset3 four
(integer) 1
sadd myset3 five
(integer) 1
我添加了五个元素都成功返回1这个时候smembers
smembers myset3
1) "four"
2) "three"
3) "one"
4) "two"
5) "five"
总共五个元素,这个时候我让她随机弹出,
spop myset3
"one"
第一次弹出one,咱们是不是没有指定啊,我是不是只指定咱们的myset3啦,没有指定他的one了吧,
spop myset3
"four"
第二次弹出four,是完全没有规律的吧,这完全是用随机来弹出的,
来再弹,弹出一个three, 第一次one第二次four第三次three是完全没有规律的,
也就是说咱们的spop是随机返回并删除名称为key的set中的一个元素
 
smembers myset3
1) "two"
2) "five"
最后只剩下two跟five啦,咱们是不是吧one four跟three全部弹出去了,全部删除掉了吧,
这是咱们的spop方法,
 
sdiff
好接着往后看sdiff,diff不用说了是不是咱们的different的缩写啊,
different代表什么意思,是不是不同的啊,那么这里sdiff就代表两个集合的差集吧,
说到这里我们还记得php里面有个函数叫做,array_diff,
这个意思是返回两个数组的差集吧,这是咱们的array_diff函数,
同样的这里的sdiff代表的是两个集合的差集,来咱们来看一下这里面的两个例子,
 myset2与myset3取差集,注意这里返回three,为什么是返回three而不是返回one呢,
因为咱们是以咱们的myset2为标准的,返回跟myset3不一样的
是不是three跟myset3里面的都不一样啊,最终返回three吧,
如果我们把myset3放在前面,这里应该返回的是one吧,也就是说谁在前面以谁为标准,
 
sdiffstore
那我返回回来的差集能不能存在一个地方啊,我现在是不是只返回了啊,
没有存储下来吧,咱们可以用一个方法叫做,sdiffstore代表将返回的差集存到另一个key里面,
存到另一个集合里面,
 
将myset2 跟myset3的差集,存储到咱们的myset4里面, 
这里返回1代表成功,这是咱们的取差集并且存储, 
 
sinter
有差集就有交集吧,sinter
返回所有给定key的交集
 
interstore
但是咱们取出来的交集能不能给他存到另一个集合里面呢,同咱们的差集,
一样加一个sinterstore
 
sinterstore myset6 myset2 myset3
(integer)1
 
存储到myset6里面,好的返回1,好的这里再查看,
smembers myset6
1) "two"
 
最终是不是把two存进了啊,
这是咱们的sinterstore
inter代表intersection,代表交集吧,加一个store代表存储,
这是咱们的差集跟交集,非常相似吧,除了差集交集是不是还有并集
 
sunion
返回所有给定集合的并集
 
union代表并集,好,我取出来并集还能干嘛是不是还是存储啊,
 
sunionstore
返回所有给定key的并集,并存储到myset6里面
跟咱们前面的sdiffstore跟咱们前面的siterstore是不是相同啊,
返回3代表成功,并且成功将这三个元素插入到myset6里面。
smemebers myset6
1) "one"
2) "two"
3) "three"
 
smove
代表将咱们某个集合里面的元素移到另一个集合里面,
代表从第一个集合里面的元素,移动到第二个集合,
从第一个key对应的set中,移除某一个元素,并添加到第二个元素中
相当于从第一个集合中剪切掉,然后复制到第二个集合里面,
这是咱们的smove方法,
这里返回一个1代表返回成功,
smemebers myset7
1) "two"
 
smemebers myset2
1) "three"
将myset2里面的元素移动到myset7里面移动那个元素呢,移动咱们的three元素,
这是咱们的smove方法,将第一个集合中的某个元素移动到第二个集合当中,
 
 
scard
scard方法,返回名称为key的集合中元素的个数,
 
 
sismember
测试某个元素是不是名称为key的集合中的元素,
也就是说我判断某个元素,是否是这个集合中的元素吧,
还记得咱们php里面的函数吗in_array(),
判断某个元素是否为数组的元素,这是一个道理,
 
sismember判断某个元素是否为集合中的元素,
返回1代表 one是myset2里面的元素,
返回0代表不是myset2集合当中的元素,
 
srandmember
随机返回名称为key的集合的一个元素,但不删除元素,
这里是随机返回吧,咱们是不是不能以顺序来返回,因为,咱们的集合是无序的吧, 
 
他是随机取的,每次都不是固定的,
完全是随机的,因为他没有顺序,这是咱们的set数据类型,
我在强调一遍咱们的set数据类型是没有顺序的,
也就是说咱们在往里面添加元素的时候,
在往集合当中添加元素的时候,都是随机添加的,
他是完全没有顺序的,这些元素都是没有顺序的,
你要取单个元素,你只能是随机取,因为你没有顺序吧,
这是咱们的set集合,set数据类型,
那好,他没有顺序,咱们做起来是不是有些麻烦啊,我们要取某个元素是不是比较费劲啊,
 
啊怎么办呢,我们能不给他加一个字段,比如说,我插入一个元素,我就给他加一个字段叫1,
查第二个字段给他加一个字段2,我每一个元素我都给他加一个字段,叫做顺序,
 
我取的时候只需要取这个顺序值就行了吧, 比如我要取第6个元素,我只需要取6这个序列号就可以了把
是不是就能把这个元素取出来,所以说,咱们下面就要用到咱们的有序集合,
咱们刚才讲的set是无序集合,下面来看下一咱们的有序集合,
 
 
 
sorted sets类型
sorted sets类型及操作,
是set的一个升级版本,他也是一个集合,但是他是一个升级版本,
他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,
我在删除或者修改,可以指定,每次指定后,
zset代表什么,有序集合,咱们以后说zset就是有序集合,有序集合会自动从新按新的值,
调整顺序,每次指定以后他会为你自动排序,可以理解为有两列的mysql表,
一列存咱们的value,一列存咱们的order,
我第一个值比如说为one,我就让他的顺序为1,
我第二个值为two,我就让他的值为2,
咱们给他加了一个顺序的字段吧,  
操作过程中呢,key可以理解为zset的名字,
接下来来看一下咱们有序集合的一些方法,
 
首先咱们在集合当中添加一个方法是不是用sadd
那么咱们有序集合都是以z大头的,叫做zadd,
zadd
向名称为key的集合当中添加元素member,score,
score用于排序,该元素如果存在,则更新其顺序,
 
不同于sadd方面这里加了一个顺序值,
插入one顺序为1,插入two顺序为2
我第三次在插入点额时候如果我插入的元素跟two是不是相同,
咱们刚才说了集合当中是不是不能有相同的元素啊,如果你插入相同的元素,
但是咱们顺序不一样,他会干嘛,他会把这个顺序更新,
这是咱们的zadd向咱们的集合当中,添加一个元素,
并且指定他的顺序,
这是咱们的zadd方法,
如果我们想从咱们的元素当中取元素,set当中取元素用的谁啊,
用的咱们的sismembers
咱们这里取用咱们的zrange,因为他有顺序了吗,
0跟-1不是顺,他们代表的还是索引,跟咱们list一样了吧,
0代表索引,-1代表也是索引,跟咱们的list是不是一样了吧,
withscores表示输出咱们的顺序号,
第一次插入一个one顺序为1,
第二次插入一个two顺序为2,
第三次又插入two的时候,顺序给他改为3了,
因为我集合里面只允许有唯一的元素,不允许相同吧,
从第一个元素到最后一个元素全部取出来,并且,给他附上顺序号,
是不是显示出咱们的1跟3了,
 
zadd向有序集合中添加元素并制定序列号,
zrange,从有序集合中取相应的元素,并且显示他的顺序号,
 
有zadd就有zrem
是不是有sadd就有srem啊
同样咱们的有序集合也一样,有添加,就有删除,
这里删除看怎么删啊,
 
 
zrem跟咱们的srem是一样的,指定,你要删除的集合里面的元素即可,
他直接会把two删除掉,
是不是只剩下one啦,把two删除掉了,
 
zincrby
不同于咱们set,咱们string和list里面都有类似的方法,以指定值增加或者减少,
那咱们的有序集合里面有什么啊,是不是有顺序啊,
咱们是不是可以对顺序指定增加啊,
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,
如果这个元素已经存在zincrby就会给他增加,增加他的顺序号,
否则,向该集合中添加该元素,其socre的值为increment
如果不存在就会插入新元素,
 
 
 
最终返回一个3代表把,one的顺序号加2,返回为3,代表one的顺序号变为了3,
好这个时候再来查看一下,是不是one的顺序号变为3了,
所以说咱们的zincrby是什么意思,是对咱们的顺序号进行增加,同样他可以进行减,
-2,加上-2就相当于是在减少,
跟咱们的incrby和hincrby是类似的,
这是zincrby他指定的是顺序号的增减,
 
zrank
返回名称为key的有序集合中的member元素的排名,
按sore从小到大排序即下标,他按下标来排序啊,
 
看这个有序集合,one的索引是0吧,two的索引是1,three的索引是2,
five的索引是3 
zrank他默认是安装谁来排序,按score从小到大来排序,
然后排序完了以后显示的值去找他的索引值,
这是咱们的zrank
 
zrevrank
这里还有一个revrank
rev代表反转,他首先是干嘛, 
返回名称为key的有序集合当中的member元素的排名,
前面是一样的把,跟咱们的zrank是一样的啊,
按score从大到小排序,咱们刚才看的是从小到大吧,
rev是反过来的,先降序排序再找索引,
 
zrevrange
 
等于是把赞买的score降序排序,
返回名称为key的有序集合,按socre从大到小顺序,中的index从start到end的所有元素,
 
zrangebyscore
 
 
byscore找到2 3的元素返回,2-3这个score范围内的所有元素吧,
返回集合中score在给定区间中的元素,咱们是不是给定的2-3吧,
 
zcount
返回集合中socre在给定区间的数量,
咱们刚才返回的是元素吧,那这块呢,返回的是数量,
 
zcard
返回咱们集合里面所有元素的个数,
 
 
zremrangebyrank
rem代表删除,
rangebyrank按下标来排序?
删除集合中排名在给定区间的元素,按什么按咱们的rank吧,
 
这里的1 1代表的是咱们的顺序不是索引啊,
 
删除索引1到1,索引1到1是只删除1到1吧,就这个意思吧,
one的索引是0  two的索引是1吧,
1到1是不是值删除two 
返回为1,表示只删除一个,这个时候再zrange一下,看一下是不是只剩下one啦,
把咱们的two元素删除掉了,
 
byrank就是代表按照索引来删除,记住这里是不按顺序来删除,
 
zremrangebyscore
这个方法别和上面的混淆了,byscore一看就知道了,
按咱们顺序删除,
删除集合中score在给定区间内的元素,
 
把one和two删除掉,剩下three
 
 
 
zremrangebysocre与zremrangebyrank的区别,
byrank代表依据咱们索引来删除,
byscore代表依据咱们的顺序来删除,顺序号来删除,
 
这就是咱们所有有序集合的所有方法。
 
咱们redis的五中基本类型都讲过了,
 
 

 

 
posted @ 2014-04-18 08:58  z陵  阅读(1174)  评论(0编辑  收藏  举报