當網站效能遭遇瓶頸的時候
阿新 • • 發佈:2019-01-04
END
WHERE id IN(1,2,3)
4.通過redis的hash表來記錄要更新或新增的資料,在適當的時機,觸發資料庫操作,通過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,感受到了它的速度優勢,哈哈!
WHERE id IN(1,2,3)
4.通過redis的hash表來記錄要更新或新增的資料,在適當的時機,觸發資料庫操作,通過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,感受到了它的速度優勢,哈哈!