前段時間由于一個控制方法要實現的邏輯任務太多了,無論怎么優化都還是有瓶頸。網上介紹可以使用任務隊列的機制,把一些不是立即需要相應的邏輯處理放在隊列中,讓某個程序時時去執行。舉個例子:用戶上來我的網站注冊,注冊完后,我需要給用戶的郵箱帳號推送一些郵件,這個推送郵件所發的時間可能遠比注冊保存用戶資料所花的時間多些,也不是立即就需要響應到前端給客戶知道。所以,是可以把推送郵件這一動作作為一個任務添加到隊列中。
說明下我測試調試的環境是在Ubuntu12.04下的,安裝redis和添加crontab命令是通過終端命令的,我測試的項目是基于yii框架,調用redis是通過框架提供的yiiredis插件,可能不太符合你的環境,但其中的思路或許還是可以借鑒的。
1、安裝Redis
進入終端命令窗口(快捷鍵Ctrl+Alt+T)切換至/usr/local/src(命令:cd /usr/local/src)下,下載并安裝redis:
$ wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz$ tar xzf redis-2.6.12.tar.gz$ cd redis-2.6.12$ make進入redis-2.6.12(命令:cd redis-2.6.12)目錄,修改redis.conf:
daemonize yes啟動服務端:
$ src/redis-server redis.conf進入命令行驗證服務是否啟動:
$ src/redis-cliredis> set foo barOKredis> get foo"bar"
return array( 'components' => array( … 'cache'=>array( 'html' target='_blank'>class'=>'ext.redis.CRedisCache', //對應protected/extensions/redis/CredisCache.php 'servers'=>array( array( 'host'=>'127.0.0.1', 'port'=>6379, ), ), ), ), … );
編寫一個讀寫緩存的控制器IndexController進行測試。
class IndexController extends CController{ public function actionSetRedisValue() { $key = $_POST['key']; $value = $_POST['value']; if ( !empty( $key ) && !empty( $value ) ) { try { $redis = Yii::app()->cache; $data = ( array ) $redis->get( 'test' ); $data[$key] = $value; $redis->set( 'test', $data ); die( json_encode( array( 'status' => 1, 'msg' => 'set ok!' ) ) ); } catch ( Exception $e ) { die( json_encode( array( 'status' => 0, 'msg' => 'set faile!' ) ) ); } } else { die( json_encode( array( 'status' => 0, 'msg' => 'must input!' ) ) ); } } public function actionGetRedisValue() { try { $redis = Yii::app()->cache; $data = ( array ) $redis->get( 'test' ); $log_file = Yii::app()->runtimePath . 'edis_log.txt'; if ( file_exists( $log_file ) ) { $handle = fopen( $log_file, "a+" ); $log = "----" . date( 'Y-m-d H:i:s' ) . "-----" . ""; foreach ( $data as $key => $value ) { $log .= '->' . $key . ' = ' . $value . ""; } fwrite( $handle, $log ); fclose( $handle ); } } catch ( Exception $e ) { echo $e->getMessage(); } }}視圖文件index內容。
<?php Yii::app()->clientScript->registerCoreScript( 'jquery' ); ?><p>Redis</p><form id="redis_form" action="<?php echo $this->createUrl( '/cata/index/setRedisValue' ); ?>" method="post"> Key:<input id="key" type="text" value=""/> Value:<input id="val" type="text" value=""/> <input id="set" type="button" value="set"/> <input id="get" type="button" value="get"/> <span></span></form><script> $(document).ready(function() { $('#redis_form #set').on('click', function() { var redisForm = $('#redis_form'); var action = redisForm.attr('action'); var key = redisForm.children('#key'); var value = redisForm.children('#val'); $.post(action, {key: key.val(), value: value.val()}, function(data) { redisForm.find('span').html(data.msg); setTimeout(function() { redisForm.find('span').html(''); }, 3000); }, 'json'); }); $('#redis_form #get').on('click', function() { $.post('<?php echo $this->createUrl( '/cata/index/getRedisValue' ); ?>', {}, function(data) { }, 'json'); }); });</script>鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答