博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php-redis游标使用问题
阅读量:5140 次
发布时间:2019-06-13

本文共 1190 字,大约阅读时间需要 3 分钟。

背景:需要批量删除key,但keys命令会存在安全隐患,所以只能想到用scan命令,但是php-redis的scan貌似有bug,遍历一遍后,游标没有重新赋值。但是按照官方文档描述,游标初始为null,第一遍扫描后,游标应该会大于0【在key足够多的情况下】,实际测试的结果是游标还是null,代码如下:

1 $it = null; 2 $key=[]; 3 do { 4       $redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY); 5       $arr_keys = $redis->scan($it, "{
$this->_prefix}*",100); 6 if ($arr_keys !== FALSE) { 7 foreach($arr_keys as $str_key) { 8 $keys[] = $str_key; 9 }10 }11 } while ($it > 0);12 $keys = array_unique($keys);13 $redis->del($keys);

 

本以为上面的代码可以完美地解决问题,但是~~~~~~,这是个死循环,每一次扫描结束后,游标值仍为null,很?‍♀️

经查看源码发现,$it接收的是一个地址,但是php函数在调用时无法进行引用传参,会报错,所以就想到了函数回调`call_user_func_array`方法,如下:

1 $it = null; 2 $keys = []; 3         4 do { 5    $redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY); 6    $arr_keys = call_user_func_array(array($redis, 'scan'), array(&$it, "{
$this->_prefix}*",100)); 7 if ($arr_keys !== FALSE) { 8 foreach($arr_keys as $str_key) { 9 $keys[] = $str_key;10 }11 }12 } while ($it > 0);13 $keys = array_unique($keys);14 $redis->del($keys);

问题完美解决。

 

PS:php-redis的包是不是有bug呢,欢迎大家一起讨论!!!!!

 

转载于:https://www.cnblogs.com/wupeiky/p/11514689.html

你可能感兴趣的文章
观察者模式
查看>>
Hadoop分布式文件系统中架构和设计要点汇总
查看>>
cout和printf
查看>>
UVa 10088 - Trees on My Island (pick定理)
查看>>
#C++PrimerPlus# Chapter11_Exersice4_mytimeV4
查看>>
iOS8 针对开发者所拥有的新特性汇总如下
查看>>
Jmeter + Grafana搭建实时监控可视化
查看>>
uCGUI字符串显示过程分析和uCGUI字库的组建
查看>>
h5唤起app
查看>>
SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件
查看>>
[转]vs2010编译金山代码
查看>>
数学图形之Boy surface
查看>>
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>
3.浏览器检测
查看>>
01: socket模块
查看>>
Border-radius
查看>>
mysql触发器
查看>>
Redis学习笔记(1)Redis安装和启动
查看>>
淌淌淌
查看>>
BZOJ1002:[FJOI2007]轮状病毒
查看>>