加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

一分钟分析php基于redis计数器类

发布时间:2022-07-16 15:02:08 所属栏目:PHP教程 来源:互联网
导读:本篇文章给大家介绍一分钟解读php基于redis计数器类?有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 1.Redis计数器类代码及演示实例 RedisCounter.class.php ?php/** * PHP基于Redis计数器类 * Date: 2017-10-28 * Author: fdipzone *
  本篇文章给大家介绍一分钟解读php基于redis计数器类?有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
 
 
  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
 
 
      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,
 
  $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,
   
 
  // 创建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
 
  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
 
 
  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)

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读