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 相关文章推荐
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
PHP调用Linux的命令行执行文件压缩命令
Jan 27 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
crontab无法执行php的解决方法
Jan 25 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
PHP重定向与伪静态区别
Feb 19 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
PHP反射原理与用法深入分析
Sep 28 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绘制饼状图的实现代码
2013/06/07 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
Javascript typeof 用法
2008/12/28 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
React组件的三种写法总结
2017/01/12 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
大学生毕业求职的自我评价
2013/09/29 职场文书
销售高级职员求职信
2013/10/29 职场文书
物业经理自我鉴定
2014/03/03 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
李强为自己工作观后感
2015/06/11 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python