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 相关文章推荐
亲密接触PHP之PHP语法学习笔记1
Dec 17 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
PHP基础之运算符的使用方法
Apr 28 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
javascript some()函数用法详解
Nov 13 PHP
php使用curl打开https网站的方法
Jun 17 PHP
php基本函数汇总
Jul 09 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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实现的ping端口函数实例
2014/11/12 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
Javascript - HTML的request类
2007/01/09 Javascript
插件:检测javascript的内存泄漏
2007/03/04 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
大学生个人事迹材料
2014/01/21 职场文书
2014年个人委托书范本
2014/10/13 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
2014年应急工作总结
2014/12/11 职场文书
小学教师岗位职责
2015/04/02 职场文书
驳回起诉裁定书
2015/05/19 职场文书
首席执行官观后感
2015/06/03 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB