PHP基于redis计数器类定义与用法示例


Posted in PHP onFebruary 08, 2018

本文实例讲述了PHP基于redis计数器类定义与用法。分享给大家供大家参考,具体如下:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

这里使用其incr(自增)get(获取)delete(清除)方法来实现计数器类。

1.Redis计数器类代码及演示实例

RedisCounter.class.php

<?php
/**
 * PHP基于Redis计数器类
 * Date:  2017-10-28
 * Author: fdipzone
 * Version: 1.0
 *
 * Descripton:
 * php基于Redis实现自增计数,主要使用redis的incr方法,并发执行时保证计数自增唯一。
 *
 * Func:
 * public incr  执行自增计数并获取自增后的数值
 * public get   获取当前计数
 * public reset  重置计数
 * private connect 创建redis连接
 */
class RedisCounter{ // class start
  private $_config;
  private $_redis;
  /**
   * 初始化
   * @param Array $config redis连接设定
   */
  public function __construct($config){
    $this->_config = $config;
    $this->_redis = $this->connect();
  }
  /**
   * 执行自增计数并获取自增后的数值
   * @param String $key 保存计数的键值
   * @param Int  $incr 自增数量,默认为1
   * @return Int
   */
  public function incr($key, $incr=1){
    return intval($this->_redis->incr($key, $incr));
  }
  /**
   * 获取当前计数
   * @param String $key 保存计数的健值
   * @return Int
   */
  public function get($key){
    return intval($this->_redis->get($key));
  }
  /**
   * 重置计数
   * @param String $key 保存计数的健值
   * @return Int
   */
  public function reset($key){
    return $this->_redis->delete($key);
  }
  /**
   * 创建redis连接
   * @return Link
   */
  private function connect(){
    try{
      $redis = new Redis();
      $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){
      throw new Exception($e->getMessage());
      return false;
    }
    return $redis;
  }
} // class end
?>

demo.php

<?php
Require 'RedisCounter.class.php';
// redis连接设定
$config = array(
  'host' => 'localhost',
  'port' => 6379,
  'index' => 0,
  'auth' => '',
  'timeout' => 1,
  'reserved' => NULL,
  'retry_interval' => 100,
);
// 创建RedisCounter对象
$oRedisCounter = new RedisCounter($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.并发调用计数器,检查计数唯一性

测试代码如下:

<?php
Require 'RedisCounter.class.php';
// redis连接设定
$config = array(
  'host' => 'localhost',
  'port' => 6379,
  'index' => 0,
  'auth' => '',
  'timeout' => 1,
  'reserved' => NULL,
  'retry_interval' => 100,
);
// 创建RedisCounter对象
$oRedisCounter = new RedisCounter($config);
// 定义保存计数的健值
$key = 'mytestcounter';
// 执行自增计数并返回自增后的计数,记录入临时文件
file_put_contents('/tmp/mytest_result.log', $oRedisCounter->incr($key).PHP_EOL, FILE_APPEND);
?>

测试并发执行,我们使用ab工具进行测试,设置执行150次,15个并发。

ab -c 15 -n 150 http://localhost/test.php

执行结果:

ab -c 15 -n 150 http://localhost/test.php
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking home.rabbit.km.com (be patient).....done
Server Software:    nginx/1.6.3
Server Hostname:    localhost
Server Port:      80
Document Path:     /test.php
Document Length:    0 bytes
Concurrency Level:   15
Time taken for tests:  0.173 seconds
Complete requests:   150
Failed requests:    0
Total transferred:   24150 bytes
HTML transferred:    0 bytes
Requests per second:  864.86 [#/sec] (mean)
Time per request:    17.344 [ms] (mean)
Time per request:    1.156 [ms] (mean, across all concurrent requests)
Transfer rate:     135.98 [Kbytes/sec] received
Connection Times (ms)
       min mean[+/-sd] median  max
Connect:    0  0  0.2   0    1
Processing:   3  16  3.2   16   23
Waiting:    3  16  3.2   16   23
Total:     4  16  3.1   17   23
Percentage of the requests served within a certain time (ms)
 50%   17
 66%   18
 75%   18
 80%   19
 90%   20
 95%   21
 98%   22
 99%   22
 100%   23 (longest request)

检查计数是否唯一

生成的总计数

wc -l /tmp/mytest_result.log
   150 /tmp/mytest_result.log

生成的唯一计数

sort -u /tmp/mytest_result.log | wc -l
   150

可以看到在并发调用的情况下,生成的计数也保证唯一。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
关于文本留言本的分页代码
Oct 09 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
8个PHP数组面试题
Jun 23 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
详解php中反射的应用
Mar 15 PHP
php进程间通讯实例分析
Jul 11 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
tp5.1 框架join方法用法实例分析
May 26 PHP
php处理抢购类功能的高并发请求
Feb 08 #PHP
php+redis实现商城秒杀功能
Nov 19 #PHP
php+redis消息队列实现抢购功能
Feb 08 #PHP
PHP多线程模拟实现秒杀抢单
Feb 07 #PHP
PHP设计模式之装饰器模式实例详解
Feb 07 #PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 #PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 #PHP
You might like
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
javascript 上下banner替换具体实现
2013/11/14 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
Python中元组,列表,字典的区别
2017/05/21 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
世界经理人咨询有限公司面试
2014/09/23 面试题
本科生学习总结的自我评价
2013/10/02 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
岗位明星事迹材料
2014/05/18 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
鲁迅故里导游词
2015/02/05 职场文书
财务会计求职信范文
2015/03/20 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL