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 相关文章推荐
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
php查看网页源代码的方法
Mar 13 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
Laravel实现autoload方法详解
May 07 PHP
php workerman定时任务的实现代码
Dec 23 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
php判断数组是否为空的实例方法
May 10 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使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php计算整个目录大小的方法
2015/06/01 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
Eval and new funciton not the same thing
2012/12/27 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
跟老齐学Python之再深点,更懂list
2014/09/20 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
django2 快速安装指南分享
2018/01/05 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
会计电算化大学生职业规划书
2014/02/05 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
安全宣传标语
2014/06/10 职场文书
关于保护环境的建议书
2014/08/26 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
企业计划生育责任书
2015/05/09 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL