Redis應用 使用訊息佇列發布微博

2021-07-22 19:35:42 字數 1936 閱讀 7490

在一些使用者創造內容的應用中(如: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...