2016-03-13 6 views
5

Ich verwende ioredis mit Express (NodeJS) Ich weiß, dass es einen Weg gibt Tasten durch Muster wie diese zu löschen:ioredis alle Schlüssel löschen, indem Muster

redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL 

Allerdings ist es eine Möglichkeit, zu tun Verwenden Sie stattdessen ioredis?

Antwort

0

ich nicht viel über ioredis. Aber ich denke, Schlüssel * und for-Schleife können damit umgehen.

Btw, schlage ich vor, dass Sie Scan verwenden sollten, und del statt ~

13

Die einfachste Art und Weise Tasten durch Muster löschen verwendet keys Befehl die Schlüssel zu erhalten, die Pattern-Matching und dann eins nach dem anderen zu löschen, die ähnelt dem von Ihnen bereitgestellten Befehlszeilenbeispiel. Hier ist ein Beispiel mit ioredis implementiert:

var Redis = require('ioredis'); 
var redis = new Redis(); 
redis.keys('sample_pattern:*').then(function (keys) { 
    // Use pipeline instead of sending 
    // one command each time to improve the 
    // performance. 
    var pipeline = redis.pipeline(); 
    keys.forEach(function (key) { 
    pipeline.del(key); 
    }); 
    return pipeline.exec(); 
}); 

Allerdings, wenn Sie Ihre Datenbank eine große Menge von Schlüsseln hat (etwa eine Million), keys wird die Datenbank für mehrere Sekunden blockieren. In diesem Fall ist scan nützlicher. ioredis hat scanStream Funktion, die Sie über die Datenbank durchlaufen zu helfen, leicht:

var Redis = require('ioredis'); 
var redis = new Redis(); 
// Create a readable stream (object mode) 
var stream = redis.scanStream({ 
    match: 'sample_pattern:*' 
}); 
stream.on('data', function (keys) { 
    // `keys` is an array of strings representing key names 
    if (keys.length) { 
    var pipeline = redis.pipeline(); 
    keys.forEach(function (key) { 
     pipeline.del(key); 
    }); 
    pipeline.exec(); 
    } 
}); 
stream.on('end', function() { 
    console.log('done'); 
}); 

Vergessen Sie nicht, für weitere Informationen die offizielle Dokumentation von scan Befehl zu überprüfen: http://redis.io/commands/scan.

+0

Ich denke, mit 'unlink' ist effizienter als 'del' wie zum Beispiel' redis.unlink (keys) 'und löscht die' pipeline' und die 'forEach' Schleife. –

0

versuchen Sie die folgenden Befehle in dem Sie mehrere Clients für jeden Präfix erstellen können, die gesetzten Support erhalten und klar:

// myredis.js 
const Redis = require('ioredis'); 
const ConnectRedis = require('connect-redis'); 
const config = {}; // your ioredis config 
const clients = {}; 

/** 
* @private create redis client 
* @param {string} name client name 
* @param {boolean} isSession is this the application session client or not 
* @return {Redis|*} 
*/ 
const createClient = (name, isSession = false) => { 
    let client; 
    client = new Redis({...config, "keyPrefix":`${name}:`)}); 
    client.on('error', msg => console.log("Redis Client[" + name + "]: " + msg)); 
    client.on('connect',() => console.log("Redis Client[" + name + "]: Connected")); 
    if (isSession) { 
    const RedisStore = ConnectRedis(isSession); 
    client = new RedisStore({client}); 
    } 
    return client; 
}; 

/** 
* Create or get redis client 
* @param {string} name client name 
* @return {Redis|*} 
*/ 
const getClient = name => { 
    let client = clients[name]; 
    if (!client || !client.connected) { 
    client = clients[name] = createClient(name); 
    } 
    return client; 
}; 

/** 
* get keys only related to this client prefix 
* @param name 
*/ 
const getClientKeys = name => getClient(name).keys(`${name}:*`).then(keys => keys.map(key => key.substr(name.length + 1))); 

/** 
* clear client 
* @param name 
*/ 
const clearClient = name => getClientKeys(name).then(keys => { 
    const client = getClient(name); 
    client && keys.forEach(key => client.del(key)) 
}); 

module.exports = {getClient, clearClient, getClientKeys}; 

Wie zu verwenden:

const {getClient, clearClient} = require("./myredis"); 
// this will get a client with prefix "marvel:" and if it is not exists it will be created 
const client = getClient("marvel"); 

// set value 
client.set("fav", "ironman"); 

// get the value 
client.get("fav", (error, value) => console.log(value)); 

// clear client 
clearClient("marvel"); 
Verwandte Themen