rdis那点事儿
有序集合和无序集合交/并集
$Redis = new Redis();
$Redis->connect(‘127.0.0.1’, 6379);
$Redis->select(5);
for ($i=1; $i<11; $i++) {
$Redis->sAdd(‘set:test’, $i);
}
for ($i=10; $i<21; $i++) {
R
e
d
i
s
−
>
z
A
d
d
(
′
z
s
e
t
:
t
e
s
t
′
,
(
100
+
Redis->zAdd('zset:test', (100+
Redis−>zAdd(′zset:test′,(100+i), $i);
}
for ($i=21; $i<31; $i++) {
R
e
d
i
s
−
>
z
A
d
d
(
′
z
s
e
t
:
t
e
s
t
2
′
,
(
100
+
Redis->zAdd('zset:test2', (100+
Redis−>zAdd(′zset:test2′,(100+i), $i);
}
r
e
s
u
l
t
1
=
result1 =
result1=Redis->zUnionStore(‘zset:union1’, array(‘zset:test’, ‘set:test’));//返回20
r
e
s
u
l
t
2
=
result2 =
result2=Redis->zUnionStore(‘zset:union2’, array(‘set:test’, ‘zset:test’));//返回20
$result3 = $Redis->zInter(‘zset:inster1’, array(‘zset:test’, ‘set:test’));//返回1
$result4 = $Redis->zInter(‘zset:inster2’, array(‘set:test’, ‘zset:test’));//返回1
$result5 = $Redis->sUnionStore(‘set:union1’, ‘zset:test’, ‘set:test’);//不执行
$result6 = $Redis->sUnionStore(‘set:union2’, ‘set:test’, ‘zset:test’);//不执行
$result7 = $Redis->sinterstore(‘set:inster1’, ‘zset:test’, ‘set:test’);//不执行
$result8 = $Redis->sinterstore(‘set:inster2’, ‘set:test’, ‘zset:test’);//不执行
1、有序和无序集合的交并集操作,只能用有序集合的交并集方法进行,用无序集合的交并集方法不行,连返回值都没有,说明是方法不执行。
2、有序和无序集合的交并集后,无序集合的分是1(其实是给无序集合的元素加上分并赋值1,当有序集合用),双方都有的元素,它的分默认是相加。比如:元素10,它的分是110 + 1 = 111。
3、如果给有序集合的并集方法加乘法因子,则有多少个集合合并,就要有多少个乘法因子,否则方法不会执行,也不会报错。
不会执行,出现的结果有2种:1.之前结果集不存在的,则不会创建。2.之前有结果集的,则不会修改没变化,原先的值是什么,执行后还是什么。
例:$Redis->zUnionStore(‘zset:union1’, array(‘zset:test’, ‘set:test’, ‘zset:test2’), array(1, 3)); //方法不执行
$Redis->zUnionStore(‘zset:union1’, array(‘zset:test’, ‘set:test’, ‘zset:test2’), array(1, 3, 1));//方法执行
4、如果需要指定结果集的聚合方式,则也要指定乘法因子,否则会报错。
例:$Redis->zUnionStore(‘zset:union1’, array(‘zset:test’, ‘set:test’), ‘min’); //报错
$Redis->zUnionStore(‘zset:union1’, array(‘zset:test’, ‘set:test’), array(1, 1), ‘min’);//方法执行
——我们确实不需要改变乘法因子的,也要加上去,按默认值1加上去。
——第3、4点对有序集合的交并集方法都适用。
——用有序集合的交并集方法处理无序集合,会先把无序集合转成有序集合再进行处理;反过来,用无序集合的交并集方法处理有序集合,则不会先把有序集合转成无序集合再进行处理。