@ MohammedAl-Mahdawi私のプロジェクトの1つで同様のユースケースがあり、ioredisが提供するscanStream
実装を使用しています。 これは基本的にscan
コマンドを使用する簡単な方法です: https :
すでに述べた@stockholmuxのようにSCAN
とUNLINK
を使用する場合、Redisをブロックせずに任意の数のキーを削除できるはずです。
@dirkbonhommeご
私はあなたのアドバイスに従い、ioredisを使用して次の関数を作成しました。大きなプロジェクトの場合、それを行うための最も効率的な方法は次のとおりです。
//key example "prefix*"
function getKeysByPattern(key) {
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
resolve(keys)
});
})
}
//key example "prefix*"
function deleteKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
redis.unlink(keys)
});
}
@ MohammedAl-Mahdawiは私には似合います。 考えられる唯一の問題は、一致するすべてのキーを一度にメモリにロードすることです。 それが問題である場合は、それらが入ってくるとすぐにそれらをバッチで削除することができます:
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
redis.unlink(resultKeys);
}
});
@dirkbonhommeおよび@ MohammedAl-Mahdawiこのメソッドには、本番環境で噛み付く可能性のある原子性の問題があります。
@stockholmuxご
これまで到達した最終結果を探し、それが最も効率的な方法であると信じている人にとっては、次のとおりです。
//key example "prefix*"
function getKeysByPattern(key) {
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
resolve(keys)
});
})
}
//key example "prefix*"
function deleteKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
var keys = [];
stream.on('data', function (resultKeys) {
// `resultKeys` is an array of strings representing key names
for (var i = 0; i < resultKeys.length; i++) {
keys.push(resultKeys[i]);
}
});
stream.on('end', function () {
redis.unlink(keys)
});
}
//key example "prefix*"
function batchDeletionKeysByPattern(key) {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
redis.unlink(resultKeys);
}
});
}
上記のコードはioredis用
あなたがそうするより良い方法を知っている誰かであるならば、共有することを躊躇しないでください。
@ MohammedAl-Mahdawi、
私はこのエラーを同じ上でどんなアイデアでも受けています
コードベース:
let redisDel = () => {
var key="employees*"
return new Promise((resolve, reject) => {
var stream = redis.scanStream({
// only returns keys following the pattern of "key"
match: key,
// returns approximately 100 elements per call
count: 100
});
stream.on('data', function (resultKeys) {
if (resultKeys.length) {
console.log(resultKeys)
redis.unlink(resultKeys);
}
});
stream.on('end', function (resultKeys) {
resolve()
})
})
}
誰かがここで完璧な解決策を与えますか?
@ siddhkadam1881 unlinkコマンドは、 ますhttps://redis.io/commands/unlink
おそらく古いバージョンを実行しています。 代わりにdel
試してください。
スキャンがどのように行われるのか理解したいですか? @ MohammedAl-Mahdawiによるソリューションでは、削除がバッチで発生した場合、その間に追加された、削除したくない新しいキーがスキャンされて削除される可能性があると思います。 luaスクリプトはどうですか?
このソリューションが非常に単純な1インスタンスのElastiCacheサーバーでは機能しないが、ローカルでは機能する理由は誰にもわかりません。 通常どおりキーをクリアできますが、ストリーム実装を使用しようとすると、ElastiCacheでキーが返されることはありません。
最も参考になるコメント
これまで到達した最終結果を探し、それが最も効率的な方法であると信じている人にとっては、次のとおりです。
上記のコードはioredis用
あなたがそうするより良い方法を知っている誰かであるならば、共有することを躊躇しないでください。