Dekim
Dekim

Reputation: 217

Deleting a complete folder in Redis

How can I delete a complete folder in redis, using DEL command OR in C# in StackExchange.Redis.

SomeFolder1:SomeSubfolder1:somekey1
SomeFolder1:SomeSubfolder1:somekey2
SomeFolder1:SomeSubfolder2:somekey1

How can I Del SomeFolder1:SomeSubfolder1 so remaining keys are

SomeFolder1:SomeSubfolder2:somekey1

Upvotes: 2

Views: 4190

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1063864

There's no such thing as a "folder" in redis, and no functionality to del based on a pattern. Options:

  • use a database; you can have an arbitrary number of databases (each is numbered, the default is 0), and you can discard a database in a single operation: flushdb - so keep all this associated data in one database and you're sorted
  • use scan to iterate the matching keys, issuing a del for each match

note that scan is a server command, so you need:

const int db = 0;
var server = muxer.GetServer(...);
var db = muxer.GetDatabase(db);
foreach(var key in server.Keys(db, "SomeFolder1:SomeSubfolder1:*",
    pageSize: 500))
{
    db.KeyDelete(key, flags: CommandFlags.FireAndForget);
}

the FireAndForget allows you to ignore the individual replies, which means you aren't bound by latency and you don't have TPL overheads.

Fundamentally, though: redis is not meant to be used like this - if you find yourself scanning keys, you are doing something wrong. A more typical implementation might be to use a hash to store the folder (which each key/value pair inside the hash being the contents) - then deleting the hash is one operation. Alternatively, use a set to store the keys of the items inside each logical folder.

Hash approach:

hash = SomeFolder1:SomeSubfolder1
              key = somekey1, value = ...
              key = somekey2, value = ...
hash = SomeFolder1:SomeSubfolder2
              key = somekey1, value = ...

Set approach:

set: SomeFolder1:SomeSubfolder1
              somekey1
              somekey2
set: SomeFolder1:SomeSubfolder2
              somekey1
string: SomeFolder1:SomeSubfolder1:somekey1
              value
string: SomeFolder1:SomeSubfolder1:somekey2
              value
string: SomeFolder1:SomeSubfolder2:somekey1
              value

Upvotes: 4

Related Questions