ノードはredisライブラリを使用してデータベースをリンクし、データベースが切断されたときにクエリーをスキップする方法
1613 ワード
一言で言えば、redisインスタンスメソッドはboolean値を返し、現在のサービスが利用可能かどうかを示します.この値の更新がタイムリーでない場合、コールバックでerrが返されます.
背景
今日は運転手さんがこの問題を提起しました.次のコードのように
プログラム実行中にRedis serverが切断すると、グローバルにエラーがキャプチャされます.rdb.get()のコールバックはまったく実行されません.希望する場合、serverが切断された場合、rdb.get()が取れない場合は、ずっと詰まっているのではなく、デフォルト値を取ることができますが、どうすればいいですか?npmでは判断の仕方が見つからないようです.
Redisソースを読むと、次のセクションがあります.
このプロトタイプ関数は,redisインスタンスメソッドを実行するときの最後の戻りである.redis内部には、サービスが利用可能かどうかを示すステータス量が維持されていることがわかります.使用できない場合、メソッドはfalseに直接戻ります.
元のredisライブラリ内部のデフォルト設定が自動的に再接続されると、thisがチェックされ、リセットされます.ready状態.
しかし,高周波起動とサーバ停止テストを経て,この状態はもちろん即時に変化しない.クエリー時にthisの場合.ready=trueサービスがオフになっていると、コールバック関数でキャプチャできるエラーが投げ出されます.
ベストプラクティス
背景
今日は運転手さんがこの問題を提起しました.次のコードのように
// redis v2.8.0
const redis = require('redis');
const rdb = redis.createClient();
rdb.on('error', err => console.error(' ', err));
......
rdb.get(key, (err, ret) => {
if (err) console.log(' ', err)
});
プログラム実行中にRedis serverが切断すると、グローバルにエラーがキャプチャされます.rdb.get()のコールバックはまったく実行されません.希望する場合、serverが切断された場合、rdb.get()が取れない場合は、ずっと詰まっているのではなく、デフォルト値を取ることができますが、どうすればいいですか?npmでは判断の仕方が見つからないようです.
Redisソースを読むと、次のセクションがあります.
RedisClient.prototype.internal_send_command = function (command_obj) {
......
if (this.ready === false || this.stream.writable === false) {
......
return false;
}
}
このプロトタイプ関数は,redisインスタンスメソッドを実行するときの最後の戻りである.redis内部には、サービスが利用可能かどうかを示すステータス量が維持されていることがわかります.使用できない場合、メソッドはfalseに直接戻ります.
元のredisライブラリ内部のデフォルト設定が自動的に再接続されると、thisがチェックされ、リセットされます.ready状態.
しかし,高周波起動とサーバ停止テストを経て,この状態はもちろん即時に変化しない.クエリー時にthisの場合.ready=trueサービスがオフになっていると、コールバック関数でキャプチャできるエラーが投げ出されます.
ベストプラクティス
function get(key) {
return new Promise((resolve, reject) => {
const isAvailable = rdb.get(key, (err, ret) => {
if (err) {
if (err.code === 'UNCERTAIN_STATE') return resolve(false);
return reject(err);
}
resolve(ret);
});
if (!isAvailable) return resolve(false);
});
}
~async function () {
let val = await get(key);
if (val === false) {
// ,
}
}();