在一些使用者創造內容的應用中(如:sns、微博),可能出現1秒有上萬個使用者同時發布訊息的情況,此時如果只只用mysql資料庫,很可能出現「too many connections」的錯誤,當然,我們可以把mysql的max_connections引數設定為更大的值,但這是乙個治標不治本的方法。這時,可以考慮使用redis。
redis非常適合處理這類高併發的寫操作,使用redis的list型別作為訊息佇列,把使用者發布的訊息暫時儲存在訊息佇列中,接著使用乙個cron程式把訊息佇列中的訊息插入mysql。這樣,就可以有效減少mysql的併發量。
例如,發布一條微博使用以下介面:
post($uid, $content, $timestamp); // 寫入mysql資料庫
?>
這種直接將使用者提交的微博資料寫入mysql的方式,在高併發的情況下,很容易出現問題。weibo物件的post方法就是發布微博的介面,它直接把微博寫入mysql。
為了降低mysql的併發數,先把使用者發布的微博存在redis中,**如下:
connect('127.0.0.1') || die('連線redis伺服器失敗!'); // 連線redis伺服器
$redis->auth('foobared'); // 密碼驗證
$redis->select(0); // 選擇0號資料庫
$redis->setoption(redis::opt_prefix, 'my-prefix:'); // 設定鍵名的字首(相當於mysql的表字首)
$data = array(
'uid' => strip_tags(trim($_post['uid'])), // 使用者的id
'content' => strip_tags(trim($_post['content'])), // 微博的內容
'timestamp' => time()
);$redis->lpush('weibo_list', json_encode($data));
$redis->close(); // 關閉redis資料庫連線
?>
注意:要想在php中建立redis物件,必須先安裝phpredis擴充套件,安裝方法可參考:
先把微博資料資訊使用json_encode轉換為json字串,然後使用redis物件的lpush方法把微博資訊插入到weibo_list佇列(鍊錶型別)。
然後,編寫乙個cron程式(計畫任務)把redis中的微博資訊依次插入到mysql中,**如下:
connect('127.0.0.1') || die('連線redis伺服器失敗!'); // 連線redis伺服器
$redis->auth('foobared'); // 密碼驗證
$redis->select(0); // 選擇0號資料庫
$redis->setoption(redis::opt_prefix, 'my-prefix:'); // 設定鍵名的字首(相當於mysql的表字首)
$weibo = new weibo(); // 建立weibo物件
while (true) else
}$redis->close();
?>
在該cron程式中,先使用redis物件的rpop()方法從weibo_list列表中取得一條微博資訊,然後使用json_decode()函式解碼,最後呼叫weibo物件的post方法把微博資訊插入到mysql。
使用訊息佇列有乙個缺點,就是「延時」。為了把延時降到最低,執行多個cron程式同時把訊息佇列中的資料插入mysql。使用訊息佇列的好處是擴充套件性好,當一台redis伺服器不能應付大量併發時,使用「一致性hash演算法」把併發分發到多個redis伺服器。
redis訊息佇列簡單應用
結合php,實現redis訊息佇列的簡單應用,主要用到redis三個命令 zadd zrange zdelete。關於這三個命令的含義在此就不再贅述了。入庫操作 if extension loaded redis redis new redis redis connect 127.0.0.1 637...
佇列 使用訊息佇列發布微博
在一些使用者發布內容應用中,可能出現1秒上萬個使用者同時發布訊息的情況,此時使用mysql可能會出現 too many connections 錯誤,當然把mysql的max connections引數設定為更大數,不過這是乙個治標不治本的方法。而使用redis的訊息佇列,把使用者發布的訊息暫時儲存...
Redis應用 非同步訊息佇列與延時佇列
說道訊息佇列,你肯定會想到kafka rabbitmq等訊息中介軟體,這些專業的訊息中介軟體提供了很多功能特性,當然他的部署使用維護都是比較麻煩的。如果你對訊息佇列沒那麼高要求,想要輕量級的,使用redis就沒錯啦。redis通過list資料結構來實現訊息佇列.主要使用到如下命令 廢話補不多說上 r...