[練手] 使用 Redis 模擬登陸使用者瀏覽商品頁面的 token 維護,足跡記錄,清理多餘記錄的實現

Luerdog發表於2018-11-08

將以下程式碼儲存到對應檔案,執行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 協議》,轉載必須註明作者和本文連結

相關文章