Cette fois, je vais vous apporter une explication détaillée des étapes pour utiliser la classe compteur redis. Quelles sont les précautions lors de l'utilisation de la classe compteur redis. Voici des cas pratiques, jetons un coup d'oeil.
Redis est une base de données de valeurs-clés de type journal open source écrite en langage ANSI C, prend en charge le réseau, peut être basée sur la mémoire et persistante, et fournit des API dans plusieurs langues.
Ici, nous utilisons ses méthodes incr(increment), get(get), delete(clear) pour implémenter la classe compteur.
1.Code de classe de compteur Redis et exemple de démonstration
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 ?>
Sortie :
0 1 11 1 0
2. Appelez simultanément le compteur et vérifiez l'unicité du décompte
Le code de test est le suivant :
<?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); ?>
Pour tester l'exécution simultanée, nous utilisons le ab outil Test, définition de l'exécution 150 fois, 15 concurrence.
ab -c 15 -n 150 http://localhost/test.php
Résultat de l'exécution :
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)
Vérifier si le décompte est unique
生成的总计数 wc -l /tmp/mytest_result.log 150 /tmp/mytest_result.log 生成的唯一计数 sort -u /tmp/mytest_result.log | wc -l 150
Je crois Si vous lisez cet article, vous maîtrisez la méthode des cas. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !
Lecture recommandée :
PHP implémente un tableau multidimensionnel algorithme de tri Quels sont les moyens
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!