將以下程式碼儲存到對應檔案,執行start.sh 即可檢視redis中的資料變化
其中的數量級和每次執行清除指令碼的step值根據自身情況設定
需要phpredis擴充
start.sh需要執行許可權
我是在linux上試的
- updatetoken.php
<?php
$ip = '127.0.0.1';
$port = 6379;
$redis = new Redis();
$redis->pconnect($ip,$port,1);
//得到毫秒
function getMillisecond() {
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
}
//數量級
$record_num = pow(10,5)*3;
$start = time();
//統計已經執行的數量
$redis->set('num',1);
//開啟清除指令碼
$redis->set('clean_token_record_open',1);
//模擬瀏覽
for($i=1;$i<=$record_num;$i++){
$record = ['user_id'=>mt_rand(1,1500),'product_id'=>mt_rand(1,40)];
$token = date('YmdH').$record['user_id'];
$redis->hset('login_token',$token,$record['user_id']);
$redis->zadd('token_time',getMillisecond(),$token);
$redis->zadd('record:'.$record['user_id'],getMillisecond(),$record['product_id']);
$redis->zremrangebyrank('record:'.$record['user_id'],0,-31);
$redis->incr('num');
}
echo '訪問結束,共耗時:'.(time() - $start) . '秒!'.PHP_EOL;
//關閉清除指令碼
$redis->set('clean_token_record_open',2);
?>
- clean_token_record.php
<?php
$ip = '127.0.0.1';
$port = 6379;
$redis = new Redis();
$redis->pconnect($ip,$port,1);
$threshold = 600;
$step = 0.1;
$del_token_num = 10;
do{
$token_time_num = $redis->zcard('token_time');
$is_out = $token_time_num - $threshold;
if($is_out > 0){
//得到要刪除的token
$tokens = $redis->zrange('token_time',0,min($is_out,$del_token_num)-1);
//記錄每次被刪除的token的值
$redis->zadd('del_token',time(),implode(',',$tokens));
//刪除記錄
foreach($tokens as $value){
$redis->hdel('login_token',$value);
}
$redis->zremrangebyrank('token_time',0,min($is_out,$del_token_num)-1);
}else{
sleep($step);
}
}while($redis->get('clean_token_record_open')==1);
echo '清理結束!'.PHP_EOL;
?>
- start.sh
#/bin/bash
/usr/bin/php updatetoken.php &
/usr/bin/php clean_token_record.php
主要是觀察redis中的資料變化
本作品採用《CC 協議》,轉載必須註明作者和本文連結