我有下面这段代码,用来从Redis中删除记录
public hdel(hash: string, field?: string) {
return new Promise((resolve, reject) => {
if (!field) {
this.store.del(hash, (err, response) => {
if (err) {
reject(err);
return;
}
resolve(response);
});
return;
}
this.store.hdel(hash, field, (err, response) => {
if (err) {
reject(err);
return;
}
resolve(response);
});
});
}如果没有指定字段,我将删除所有字段。
store只是一个RedisClient。
我正在使用Redis package
我希望删除所有以我给出的前缀开头的记录,例如,我有以下代码:
async deleteSessionFiles(sessionId: string) {
const path = SessionPathResolver.resolveSessionAllFiles(sessionId);
await this.cacheService.hdel(path);
}这段代码通过在路径末尾使用* (例如sessions/gHs46f/files/* ),按会话ID生成redis ALL记录路径
static resolveSessionAllFiles = (sessionId: string) => {
return `sessions/${sessionId}/files/*`;
}然后我使用我在问题开头提供的函数。
但是,与知道给出给定前缀的所有记录的KEYS prefix/*命令不同,该命令不会删除所有记录,甚至不会删除一条记录。使用这个包或一般情况下,执行此类操作的正确方式是什么?
发布于 2021-10-18 13:43:56
您可以使用Redis SCAN命令通过光标获取键,并使用DEL删除所有获取的键,并在键上迭代,而不会产生KEYS *的不良影响
阅读有关SCAN command here的更多信息
和在redis package中使用SCAN的Here an example
另外,see this question and its answers有很多批量删除的好方法
https://stackoverflow.com/questions/69617082
复制相似问题