redis学习篇(五)—–set类型和sorted set类型及相关操作

服务器

浏览数:22

2020-6-21

AD:资源代下载服务

Set类型
Set数据类型是一种无序集合,在Redis内部通过HashTable实现,查找和删除元素的时间复杂度为O(1)。Set数据类型的优点是快速查找元素是否存在,用于记录一些不能重复的数据。例如,在网站注册账号名不能重复,使用Set记录注册用户,如果注册的用户名已经存在于Set中,则拒绝此次用户注册。

Set类型支持的命令如下:

--sadd key member [member1..] --
添加一个String元素到key对应的set集合中,成功返回1,如果元素在集合中已存在,返回0。key对应的set不存在则返回错误。

--srem key member --
从key对应的set中移除指定元素,成功返回1。当指定元素不存在时返回0。如果key对应的不是set类型则返回错误。

--spop key [count] --
从key对应的set中随机弹出count个元素,count默认为1,为0不弹出,count为负数时返回错误。set为空时返回nil,否则返回
pop出的元素。

--srandmember key [count] --
同pop,随机从set中取count个元素,默认为1,但是不删除

如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果count大于等
于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

--smove fromkey tokey member --
从fromkey对应的set中将member移到tokey对应的set中,成功返回1。member不存在时返回0,key对应的不是set返回错误。

--scard key --
返回key对应的set中元素的个数。key不存在返回0。key对应的不是set返回错误。

--sismember key member --
判断member是否在key对应的member中,存在返回1,不存在或者set不存在,返回0。key对应的不是set返回错误。

--sinter key [key1...] --
返回所有给定key对应set的交集,没有返回空。若只有一个key,则返回key对应set中所有的值。若key对应不是set,返回错误。

--sinterstore tokey key [key1..] --
同sinter,但是会将结果保存在tokey对应的值中。此操作会重新赋值tokey对应的数据,如果key,key1等没有交集,则删除
tokey对应数据。
--sunion key [key1...] --
同sinter,只是取的是并集。

--sunionstore key [key1...]  --
同sinterstore,只是取的是并集。

--sdiff key [key1...] --
同sinter,只是求key对[key1..]等对应set的差集。

--sdiffstore key [key1...] --
同sinterstore,只是求key对[key1..]等对应的差集。

--smembers key --
返回key对应set中所有的member,结果是无序的。

Set类型通常用于记录做过某些事情。例如在某些投票系统中,每个用户每天只能投票一次,那么可以使用Set来记录某个用户的投票情况,只需要以日期作为Set的key,将此用户的ID作为member即可。当以今天的日期作为key查找Set中某用户的ID是否存在,就知道该用户今天是否已经投过票。

Sorted Set类型

Sorted Set类型与Set类型相似,都是String类型元素的集合,不同的是Sorted Set属于有序集合,通过一个double类型的正数score进行排序。Sorted Set通过SkipList(跳跃表)和HashTable组合完成。SkipList负责排序功能,而HashTable负责保存数据。
因为Sorted Set是排序的Set,所以Set能做的事情Sorted Set也可以完成。而Sorted Set还可以完成一些Set不能完成的事情。例如,使用Sorted Set构建一个具有优先级的队列,这也是List类型不能实现的。

sorted set类型支持的操作类型如下:

--zadd key score member [[score member] [score member]..] --
将一个或多个member元素及其score值加入到有序集key当中。如果某个member已经是有序集的成员,那么更新这个member的
score值,并通过重新插入这个member元素,来保证该member在正确的位置上。score值可以是整数值或者双精度浮点数。如果
key不存在,则创建一个空的有序集并执行zadd操作。当key存在但对应值不是有序集的时候返回一个错误。

--zscore key member --
返回有序集key中member的score值。当member不存在时返回nil。

--zcard key --
当key存在且是有序集的时候,返回有序集的基数。当key不存在时返回0。当key存在但不为有序集的时候返回一个错误。

--zcount key min max --
返回key对应有序集score在min与max之间(包括min与max)的成员数量。
--zincrby key increment member --
为有序集key的成员member的score值增加increment,可以是负数。当key不存在或者member不是有序集key的member时,该
操作相当于zadd。

--zrange key start end [withscores] --
返回有序集key给定区间内的成员,成员按score由小到大排序排列。score相等的按照字典序来排列。当start大于end时返回一个
空列表。如果使用withscores选项,则score将会与结果一起返回。

--zrevrange key start end [withscores] --
与zrange命令相似,只是按照score降序排列。

--zrangebyscore key min max [withscores] [LIMIT offset count] --
返回有序集key中,所有score介于min与max之间(默认包括min与max,当采用开区间时使用"(score" )的成员,按照score从小
到大的顺序排序。具有相同score的成员按照字典序来排列(该属性是有序集提供的,不需要额外计算)。如果加上withscores则
score与结果同时返回。可选的limit参数指定返回结果的数量及区间(类似sql中的limit offset,count),当offset很大时,
定位offset操作可能需要遍历整个有序集。此过程最坏时间复杂度为O(n)。

--zrevrangebyscore key min max [withscores] [LIMIT offset count] --
与zrangebyscore类似,只是按照score从大到小排列

# min和max可以是-inf和+inf,这样一来,就可以在不知道最大最小score的情况下使用zrangebyscore

--zrank key member --
返回有序集中member的排名,有序集成员按照score从小到大的顺序排列。score以0为底。如果member不是有序集key的成员,
返回nil。

--zrevrank key member --
与zrank类似,只是排名顺序为按照score从大到小的顺序排列。

--zrem key member [member..] --
移除有序集key的成员member。成功返回移除member的数量。当member不存在时返回0。

--zremrangebyrank key start end --
移除有序集key中,指定排名rank区间内的所有成员。区间为start与end(包含start和end),都是以0为底,-1表示最后一个,
返回删除成员的数量。

--zremrangebyscore key min max --
移除有序集中key中所有score介于min和max之间的成员,默认包含min于max,开区间则用"(min (max"。返回删除成员的数量。

--zinterstore tokey numkeys key1 [key2..] [WEIGHTS weight1 [weight2]..] [AGGREGATE sum|min|max]--
计算给定的一个或多个有序集的交集,其中给定key的数量必须是numkeys的数量,并将结果保存在tokey中。默认情况下,score是
各个有序集的score之和。
[WEIGHTS]
使用WEIGHTS选项,你可以为每个给定有序集分别指定一个乘法因子(multiplication factor)。每个给定有序集的所有成员的
score值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。如果没有指定,则默认为1。
[AGGREGATE]
使用AGGREGATE选项,你可以指定并集的结果集的聚合方式。默认使用的参数SUM ,可以将所有集合中某个成员的score值之和作为
结果集中该成员的score值;使用参数MIN,可以将所有集合中某个成员的最小score值作为结果集中该成员的score值;而参数MAX
则是将所有集合中某个成员的最大score值作为结果集中该成员的score值。 

--zunionstore tokey numkeys key1 [key2..] [WEIGHTS weight1 [weight2]..] [AGGREGATE sum|min|max]--
与zinterstore类似,只是求的是并集。

 

Sorted Set类型在Web应用中非常有用。例如排行榜中按顶贴次数排序,方法是将排序的值设置成Sorted Set的score值,将具体数据设置成相应的value,用户每次按”顶贴”按钮时,只需执行zadd命令修改score的值。

作者:hirainn