1. 程式人生 > >當網站效能遭遇瓶頸的時候

當網站效能遭遇瓶頸的時候

END
WHERE id IN(1,2,3)

4.通過redishash表來記錄要更新或新增的資料,在適當的時機,觸發資料庫操作,通過php操作redis的資料,執行成功後就刪除那些redis資料,從而解決瓶頸問題。

附:以下是對試題對錯記錄的優化,對於用於錯題集的優化程式碼類似,因此只展示前者的程式碼了。
5.redis記錄過程:
$check ? $field = 'r' : $field = 'w';//檢查對錯
    $redis = new \Redis();
    $redis->connect('127.0.0.1',6379);
    $redis->hIncrBy(‘qid_check_log’,'qid.'.$qid.'.'.$field,1); //鍵值累加1

6.把redis資料轉存到mysql中:
    $redis = new \Redis();
    $redis->connect('127.0.0.1',6379);
    $data_cache = $redis -> hGetAll(‘qid_check_log’);
    $temp = array();    //待更新的資料
    $i = 0;

    //要增加的資料
    foreach($data_cache as $key=>$num){
        $arr = explode('.',$key);
        $qid = $arr[1];
        $field = $arr[2];
        $temp[$i]['qid'] = $qid;
        $ids[] = $qid;//需要更新的試題id
        $temp[$i][$field] = $num;
        $redis -> hDel($qid_check_log,$key);
        $i++;
    }

    if(empty($ids)) return true;//如果沒有更新,則直接返回

    //獲取原來的資料
    $map['qid'] = array('in',$ids);
    $old_data = M('questionlog') -> where($map) -> select();
    $old_data2 = array();
    foreach($old_data as $one){
        $old_data2[$one['qid']] = $one;
    }
    unset($old_data);

    //合併資料
    foreach($temp as &$one){
        if(isset($one['r'])){
            $one['r'] = $old_data2[$one['qid']]['r'] + $one['r'];
        }else{
            $one['r'] = $old_data2[$one['qid']]['r'];
        }

        if(isset($one['w'])){
            $one['w'] = $old_data2[$one['qid']]['w'] + $one['w'];
        }else{
            $one['w'] = $old_data2[$one['qid']]['w'];
        }
    }

    $re = batch_update('questionlog',$temp,'qid');//執行批量更新

    後記:其實當初我在編寫程式的時候沒有設計好,如果設計得合理的化,也許不需要redis也能完成這個優化,不過,也正好因為這個機會,讓我在專案中真正用到了redis,感受到了它的速度優勢,哈哈!