|
zinterstore 命令参数比较多:
- destination:将交集的计算结果,保存到这个键中。
- numkeys:需要做交集计算键的个数。
- key [key ...]:需要做交集计算的键。
- WEIGHTS weight:每个键的权重,在做交集计算时,每个键中的分数值都会乘以这个权重,默认每个键的权重为 1。
AGGREGATE SUM|MIN|MAX:计算成员交集后,分值可以按照 sum(和)、min(最小值)、max(最大值)做汇总,默认值为 sum。
下面我们将权重设置为 0.5,这样当计算交集后,有序集合中的元素分数将都会减半,并且使用 max 参数汇总。
并集
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
zunionstore 命令的相关参数和 zinterstore 命令相同。
时间复杂度
内部编码
有序集合类型的内部编码有两种,它们分别是:
- ziplist(压缩列表):当有序集合的元素个数小于 128 个(默认设置),同时每个元素的值都小于 64 字节(默认设置),Redis 会采用 ziplist 作为有序集合的内部实现。
- skiplist(跳跃表):当上述条件不满足时,Redis 会采用 skiplist 作为内部编码。
备注:上述中的默认值,也可以通过以下参数设置:zset-max-ziplist-entries 和 zset-max-ziplist-value。
下面我们用以下示例来验证上述结论。
当元素个数比较少,并且每个元素也比较小时,内部编码为 ziplist:
当元素个数超过 128 时,内部编码为 skiplist。下面我们将采用 python 动态创建128个元素,下面为源码:
- import redis
- r = redis.Redis(host='127.0.0.1', port=6379)
- if r.object('encoding', 'zsetkey') != None:
- print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))
- for i in range(1, 600):
- r.zadd('zsetkey',i,1)
- if r.object('encoding', 'zsetkey') != None:
- print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))
- Key为【zsetkey】的字节编码为【ziplist】
- Key为【zsetkey】的字节编码为【skiplist】
当有序集合中有任何一个元素大于 64 个字节时,内部编码为 skiplist。
- import redis
- r = redis.Redis(host='127.0.0.1', port=6379)
- if r.object('encoding', 'zsetkey') != None:
- print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))
- value = ''
- for i in range(1, 600):
- value += str(i)
- r.zadd('zsetkey',value,1)
- if r.object('encoding', 'zsetkey') != None:
- print('Key为【zsetkey】的字节编码为【%s】' % r.object('encoding', 'zsetkey').decode('utf-8'))
- Key为【zsetkey】的字节编码为【skiplist】
到这里,本文就结束了,写了这么多,其实主要大部分是关于命令的简单介绍,其中也介绍了一些关键要点,如有不正确的地方,欢迎留言。 (编辑:淮安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|