中国设计在线网站,莱芜都市网房产,校园兼职网站建设,金华网站建设方案咨询Redis支持多种类型的数据结构#xff0c;最简单的字符串(strings)#xff0c;适合存储对象的哈希(hash)#xff0c;简单的字符串列表(list)#xff0c;无序集合(set)#xff0c;有序集合(sorted set)#xff0c;以及用于做基数统计的HyperLogLog#xff0c;其中使用频率… Redis支持多种类型的数据结构最简单的字符串(strings)适合存储对象的哈希(hash)简单的字符串列表(list)无序集合(set)有序集合(sorted set)以及用于做基数统计的HyperLogLog其中使用频率相对较高的便是集合。无论是无序集合set还是有序集合zset集合内的元素都具有唯一性如果插入相同的元素都将被忽略。有时候通过业务逻辑直接存储的集合并不能满足所有的业务需求。比如博客园可以按分类存储一个set元素为文章idsadd article:type:typeid articleidsadd article:type:1 2
sadd article:type:1 3
sadd article:type:1 4
按文章的点赞与踩计算出文章分数的有序集合元素为文章idzadd article:score score articleidzadd article:score 10 2
zadd article:score 20 3
zadd article:score 2 4
zadd article:score 1 5
zadd article:score 5 6
但是如果我们需要在分类下的文章按照分数重新进行排序怎么办既然是集合我们能想到操作就是取交集并集差集。1.zinterstore-交集取这俩集合的交集就可以完成上面的需求。zinterstore 可以计算多个有序集合的交集(无序集合的score为0)并生成新的有序集合。ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]numkey:操作的集合数weights:是一个可选参数乘法因子aggregate:聚合默认是求和SUM如果destination新key存在就被覆盖。zinterstore article:score:1 2 article:type:1 article:score aggregate max
计算上面两个集合的交集以取最大值的方式聚合。然后就可以通过zrevrange命令按分数从大到小:zrevrange article:score:1 0 -1
2.zunionstore-并集上面在交集中没有用到乘法因子我们将在并集中介绍乘法因子用于所有的元素的score值在传递给聚合函数之前都要先乘以这个因子说白了先weights后aggregate。我们就用官方示例说明redis ZADD zset1 1 one
(integer) 1
redis ZADD zset1 2 two
(integer) 1
redis ZADD zset2 1 one
(integer) 1
redis ZADD zset2 2 two
(integer) 1
redis ZADD zset2 3 three
(integer) 1
redis ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis ZRANGE out 0 -1 WITHSCORES
1) one
2) 5
3) three
4) 9
5) two
6) 10
redis
按交集操作key为out的元素只会有one two,但是如果取并集元素就会有one two three ,默认聚合函数为SUM所以最终元素one1x221x33SUM(23)5two2x242x36SUM(46)10two0x223x39SUM(09)93.总结无论是取交集还是并集以元素为基准做并集与交集操作score值先与weights乘法因子计算如果有指定乘法因子的执行聚合函数aggregate()默认SUM还有MIN MAXps:集合操作是要花费时间的实际操作时生成的集合key应该设置过期时间短时间查询应该不做交集或并集操作过期后才重新做计算。