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 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
thinkphp的CURD和查询方式介绍
Dec 19 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
PHP内核探索之变量
Dec 22 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php绘图之加载外部图片的方法
2015/01/24 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
jQuery之排序组件的深入解析
2013/06/19 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Python的Django框架中的数据过滤功能
2015/07/17 Python
浅谈Python的文件类型
2016/05/30 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
python yield关键词案例测试
2019/10/15 Python
信号生成及DFT的python实现方式
2020/02/25 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
会计专业自荐信
2013/12/02 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
办理房产过户的委托书
2014/09/14 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
暑假安全保证书
2015/02/28 职场文书