phpredis:BITOP与implode结合失效问题求助
解决phpredis BITOP方法传数组参数无效的问题
这个问题我之前也碰到过,核心原因是你误解了phpredis中bitOp方法的参数传递方式~
问题根源:phpredis的
bitOp方法,在操作类型(比如'AND')和目标键(比如'color')之后,需要的是多个独立的源键参数,而不是把多个键名拼成一个字符串。你之前用implode把数组转成字符串,相当于只传递了一个奇怪的键名(比如"dresses,suits"或者"'dresses','suits'"),Redis里根本没有这个键,所以bitcount返回0是必然的。正确解决方案:
如果你用的是PHP 5.6及以上版本,直接用**可变参数语法(...)**展开数组即可,这是最简洁的方式:$array = array("dresses","suits"); $redis->bitOp('AND','color', ...$array); echo $redis->bitcount('color'); // 会返回正确的30这个写法完全等价于你手动写
$redis->bitOp('AND','color','dresses','suits');,数组里的每个元素都会被当作单独的参数传入方法。如果你还在使用PHP 5.5及以下版本(不推荐),可以用
call_user_func_array来实现参数展开:$array = array("dresses","suits"); $params = array_merge(['AND', 'color'], $array); call_user_func_array([$redis, 'bitOp'], $params); echo $redis->bitcount('color');补充验证:你可以试试执行
$redis->exists('dresses,suits'),会发现返回0,说明这个键根本不存在,这就是之前调用无效的直接原因。而用参数展开后,Redis会正确读取dresses和suits两个键的位数据进行运算。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

