redis(3):redisがキューをどのようにするか


前言:キャッシュはデータベースのクエリーの読み取り圧力を減らすだけでなく、dbの書き込みio圧力を減らすことができます.
シナリオ:リアルタイム更新データをキャッシュし、更新レコードをキューに書き込み、db非同期更新、
1.rabbitmqのようなmqのようなキューソフトウェアを使用することができる
2.redis自己構築キュー
(incrementを使用してキュー番号を維持することに注意:get後にデータを処理してセットする方法でキューを維持すると、同時にデータが失われるためです.
例:
ab次のスクリプトをテストし、100回、10000回走ります.
一.get&setスクリプト
ab -n 10000 -c 100 http://127.0.0.1/redis1.php
include_once 'redis.class.php';
$redis = new RedisCluster(false);
$redis->connect(array('host'=>'127.0.0.1','port'=>6379), true);// master

$var = $redis->get('var');
$var++;
$redis->set('var',$var);
$redis->close();

スクリプトを走破してキャッシュデータを読み取る(私のは512 Mの仮想マシンで走っていますが、マシンデータによって違いますが、10000未満に違いありません.他の数字はget&setで上書きされています)
redis 127.0.0.1:6379> get var 
"628"

理由:
読み取り/書き込み間隔の他の同時書き込みによるデータ損失
二.incr
include_once 'redis.class.php';
$redis = new RedisCluster(false);
$redis->connect(array('host'=>'127.0.0.1','port'=>6379), true);// master
$redis->incr('var');
$redis->close();

完全な10,000個のデータが得られ、失われません.
redis 127.0.0.1:6379> get var 
"10000"

)
まとめ:incrでキュー番号を格納し、タグ+番号でkeyとしてキュー内容を格納します.例えば、商品オークション機能
4.バックグラウンドでキャッシュキューに基づいて更新データを読み込み、データベースを更新する
非同期更新のリスク:
(1).前と後ろを同時に書くと、上書きのリスクが生じる可能性があります
(2).キャッシュ・データの消失またはサービスのクラッシュによるデータの消失リスク
(3).非同期更新キュー・ブロックが発生すると、フロントでキューを生成する速度>バックグラウンド・ライト・データベースの速度など、データ損失のリスクが発生します.
良いウェブサイトを推薦します