PHP基于redis计数器类定义与用法示例
本文实例讲述了PHP基于redis计数器类定义与用法。分享给大家供大家参考,具体如下:
Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
这里使用其incr(自增),get(获取),delete(清除)方法来实现计数器类。
1.Redis计数器类代码及演示实例
RedisCounter.class.php
_config=$config; $this->_redis=$this->connect(); } /** *执行自增计数并获取自增后的数值 *@paramString$key保存计数的键值 *@paramInt$incr自增数量,默认为1 *@returnInt */ publicfunctionincr($key,$incr=1){ returnintval($this->_redis->incr($key,$incr)); } /** *获取当前计数 *@paramString$key保存计数的健值 *@returnInt */ publicfunctionget($key){ returnintval($this->_redis->get($key)); } /** *重置计数 *@paramString$key保存计数的健值 *@returnInt */ publicfunctionreset($key){ return$this->_redis->delete($key); } /** *创建redis连接 *@returnLink */ privatefunctionconnect(){ try{ $redis=newRedis(); $redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']); if(empty($this->_config['auth'])){ $redis->auth($this->_config['auth']); } $redis->select($this->_config['index']); }catch(RedisException$e){ thrownewException($e->getMessage()); returnfalse; } return$redis; } }//classend ?>
demo.php
'localhost', 'port'=>6379, 'index'=>0, 'auth'=>'', 'timeout'=>1, 'reserved'=>NULL, 'retry_interval'=>100, ); //创建RedisCounter对象 $oRedisCounter=newRedisCounter($config); //定义保存计数的健值 $key='mycounter'; //执行自增计数,获取当前计数,重置计数 echo$oRedisCounter->get($key).PHP_EOL;//0 echo$oRedisCounter->incr($key).PHP_EOL;//1 echo$oRedisCounter->incr($key,10).PHP_EOL;//11 echo$oRedisCounter->reset($key).PHP_EOL;//1 echo$oRedisCounter->get($key).PHP_EOL;//0 ?>
输出:
0 1 11 1 0
2.并发调用计数器,检查计数唯一性
测试代码如下:
'localhost', 'port'=>6379, 'index'=>0, 'auth'=>'', 'timeout'=>1, 'reserved'=>NULL, 'retry_interval'=>100, ); //创建RedisCounter对象 $oRedisCounter=newRedisCounter($config); //定义保存计数的健值 $key='mytestcounter'; //执行自增计数并返回自增后的计数,记录入临时文件 file_put_contents('/tmp/mytest_result.log',$oRedisCounter->incr($key).PHP_EOL,FILE_APPEND); ?>
测试并发执行,我们使用ab工具进行测试,设置执行150次,15个并发。
ab-c15-n150http://localhost/test.php
执行结果:
ab-c15-n150http://localhost/test.php ThisisApacheBench,Version2.3<$Revision:1554214$> Copyright1996AdamTwiss,ZeusTechnologyLtd,http://www.zeustech.net/ LicensedtoTheApacheSoftwareFoundation,http://www.apache.org/ Benchmarkinghome.rabbit.km.com(bepatient).....done ServerSoftware:nginx/1.6.3 ServerHostname:localhost ServerPort:80 DocumentPath:/test.php DocumentLength:0bytes ConcurrencyLevel:15 Timetakenfortests:0.173seconds Completerequests:150 Failedrequests:0 Totaltransferred:24150bytes HTMLtransferred:0bytes Requestspersecond:864.86[#/sec](mean) Timeperrequest:17.344[ms](mean) Timeperrequest:1.156[ms](mean,acrossallconcurrentrequests) Transferrate:135.98[Kbytes/sec]received ConnectionTimes(ms) minmean[+/-sd]medianmax Connect:000.201 Processing:3163.21623 Waiting:3163.21623 Total:4163.11723 Percentageoftherequestsservedwithinacertaintime(ms) 50%17 66%18 75%18 80%19 90%20 95%21 98%22 99%22 100%23(longestrequest)
检查计数是否唯一
生成的总计数 wc-l/tmp/mytest_result.log 150/tmp/mytest_result.log 生成的唯一计数 sort-u/tmp/mytest_result.log|wc-l 150
可以看到在并发调用的情况下,生成的计数也保证唯一。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+redis数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。