Удалить массив ключей в redis с помощью node-redis

У меня есть массивы ключей вроде ["aaa", "bbb", "ccc"], поэтому я хочу удалить все эти ключи из redis с помощью одной команды. Я не хочу повторять использование цикла. Я читал о команде redis DEL и на терминале redis-client она работает, но с использованием nodejs она не работает

Redisclient.del(tokenKeys,function(err,count){
             Logger.info("count is ",count)
             Logger.error("err is ",err)

         })

где tokenKeys = ["aaa", "bbb", "ccc"], этот код будет работать, если я отправлю один ключ, например tokenKeys = "aaa"


person abhaygarg12493    schedule 29.09.2015    source источник
comment
Удалось ли решить вашу проблему?   -  person Philip O'Brien    schedule 01.10.2015
comment
на самом деле существует проблема с передачей массива, иначе этот код работает нормально   -  person abhaygarg12493    schedule 01.10.2015


Ответы (4)


Вы можете просто передать массив следующим образом

var redis = require("redis"),
    client = redis.createClient();

client.on("error", function (err) {
    console.log("Error " + err);
});

client.set("aaa", "aaa");
client.set("bbb", "bbb");
client.set("ccc", "ccc");

var keys = ["aaa", "bbb", "ccc"];


client.keys("*", function (err, keys) {
    keys.forEach(function (key, pos) {
         console.log(key);
    });
});

client.del(keys, function(err, o) {
});

client.keys("*", function (err, keys) {
    keys.forEach(function (key, pos) {
         console.log(key);
    });
});

Если вы запустите приведенный выше код, вы получите следующий результат

$ node index.js
string key
hash key
aaa
ccc
bbb
string key
hash key

отображение ключей, напечатанных после установки, но не распечатанных после удаления

person Philip O'Brien    schedule 29.09.2015

Конечно, в текущей версии node_redis (v2.6.5) можно удалить как с помощью списка ключей, разделенных запятыми, так и с помощью массива ключей. См. Тесты для обоих здесь.

var redis = require("redis");
var client = redis.createClient();

client.set('foo', 'foo');
client.set('apple', 'apple');

// Then either

client.del('foo', 'apple');

// Or

client.del(['foo', 'apple']);
person Geoff Ford    schedule 06.02.2017
comment
Вы говорите, что это возможно, не показывая, как это можно сделать. - person Mike P; 06.02.2017
comment
Ссылка, которой я поделился, показывает в тестах, как это можно сделать. Однако я обновлю свой ответ, чтобы показать это явно. - person Geoff Ford; 06.02.2017
comment
Рекомендуется указать соответствующую часть внешней ссылки (как вы это сделали) на тот случай, если ссылка будет недоступна. - person Mike P; 06.02.2017

Функция del реализована напрямую, как в клиенте Redis DB, т.е. redis.del("aaa","bbb","ccc") удалит несколько элементов

Чтобы заставить его работать с массивом, используйте подход JavaScript:

redis.del.apply(redis, ["aaa","bbb","ccc"])
person Alexander Levin    schedule 24.05.2016

node-redis так не работает, но если у вас действительно много del команд, он будет конвейерно их автоматически, поэтому, вероятно, будет более эффективно, чем вы думаете, делать это в цикле.

Вы также можете попробовать этот модуль с несколькими:

var redis  = require("redis"),
    client = redis.createClient(), multi;

client.multi([
    ["del", "key1"],
    ["del", "key2"]
]).exec(function (err, replies) {
    console.log(replies);
});
person Jason Livesay    schedule 29.09.2015
comment
Инстинктивно это выглядит хорошо. Знаете ли вы, что перебор массива ключей и добавление их к множественному массиву для выполнения более производительно, чем простой вызов .del для самого массива ключей? - person Josh Oldham; 14.03.2017