it-swarm.com.de

Entfernen / Löschen aller / eines Elements aus dem StackExchange.Redis-Cache

Ich verwende den StackExchange.Redis-Client mit dem Azure Redis-Cache-Dienst. Hier ist meine Klasse,

public class RedisCacheService : ICacheService
{
    private readonly ISettings _settings;
    private readonly IDatabase _cache;

    public RedisCacheService(ISettings settings)
    {
        _settings = settings;
        var connectionMultiplexer = ConnectionMultiplexer.Connect(settings.RedisConnection);
        _cache = connectionMultiplexer.GetDatabase();
    }

    public bool Exists(string key)
    {
        return _cache.KeyExists(key);
    }

    public void Save(string key, string value)
    {
        var ts = TimeSpan.FromMinutes(_settings.CacheTimeout);
        _cache.StringSet(key, value, ts);
    }

    public string Get(string key)
    {
        return _cache.StringGet(key);
    }

    public void Remove(string key)
    {
        // How to remove one
    }

    public void Clear()
    {
        // How to remove all
    }
}

Update: Mit der Hilfe von Marc, Hier ist meine Abschlussklasse

public class RedisCacheService : ICacheService
{
    private readonly ISettings _settings;
    private readonly IDatabase _cache;
    private static ConnectionMultiplexer _connectionMultiplexer;

    static RedisCacheService()
    {
        var connection = ConfigurationManager.AppSettings["RedisConnection"];
        _connectionMultiplexer = ConnectionMultiplexer.Connect(connection);
    }

    public RedisCacheService(ISettings settings)
    {
        _settings = settings;
        _cache = _connectionMultiplexer.GetDatabase();
    }

    public bool Exists(string key)
    {
        return _cache.KeyExists(key);
    }

    public void Save(string key, string value)
    {
        var ts = TimeSpan.FromMinutes(_settings.CacheTimeout);
        _cache.StringSet(key, value, ts);
    }

    public string Get(string key)
    {
        return _cache.StringGet(key);
    }

    public void Remove(string key)
    {
        _cache.KeyDelete(key);
    }

    public void Clear()
    {
        var endpoints = _connectionMultiplexer.GetEndPoints(true);
        foreach (var endpoint in endpoints)
        {
            var server = _connectionMultiplexer.GetServer(endpoint);
            server.FlushAllDatabases();    
        }
    }
}

Jetzt weiß ich nicht, wie ich alle Elemente oder einzelne Elemente aus dem Redis-Cache entfernen kann.

38
user960567

So entfernen Sie einen einzelnen Artikel:

_cache.KeyDelete(key);

Um alle zu entfernen, müssen Sie den Befehl FLUSHDB oder FLUSHALL redis ausführen. beide sind in StackExchange.Redis verfügbar; aber aus den hier diskutierten Gründen , sie befinden sich nicht in der IDatabase -API (weil: sie Server betreffen, nicht logische Datenbanken).

Wie verwende ich sie? auf dieser Seite:

server.FlushDatabase(); // to wipe a single database, 0 by default
server.FlushAllDatabases(); // to wipe all databases

(Möglicherweise nach Verwendung von GetEndpoints() im Multiplexer)

50
Marc Gravell

Ich konnte die Datenbank in Azure Redis Cache nicht leeren.

Diese Operation ist nur verfügbar, wenn der Administratormodus aktiviert ist: FLUSHDB

Durchlaufen Sie stattdessen alle zu löschenden Schlüssel:

var endpoints = connectionMultiplexer.GetEndPoints();
var server = connectionMultiplexer.GetServer(endpoints.First());
//FlushDatabase didn't work for me: got error admin mode not enabled error
//server.FlushDatabase();
var keys = server.Keys();
foreach (var key in keys)
{
  Console.WriteLine("Removing Key {0} from cache", key.ToString());
  _cache.KeyDelete(key);
}
22
RaSi

Beide Antworten von @Rasi und @Marc Gravell enthalten Teile des benötigten Codes. Basierend auf dem obigen Code funktioniert das folgende Snippet , vorausgesetzt, es gibt nur 1 Server :

Sie müssen mit allowAdmin=true Eine Verbindung zu redis herstellen. Eine Möglichkeit, solche Optionen zu erhalten, besteht darin, AllowAdmin einer bereits analysierten Zeichenfolge zuzuweisen:

var options = ConfigurationOptions.Parse("server:6379");
options.AllowAdmin = true;
var redis = ConnectionMultiplexer.Connect(options);

Dann zu alle leeren Datenbanken:

var endpoints = redis.GetEndPoints();
var server = redis.GetServer(endpoints[0]);
server.FlushAllDatabases();

Oben wird auf jeder Redis-Bereitstellung gearbeitet, nicht nur auf Azure.

4

Sie können Hash auch löschen, wenn Sie einen bestimmten Wert aus einer zwischengespeicherten Liste löschen möchten. Zum Beispiel haben wir eine Emp-Liste und darin eine andere Abteilung als zwischengespeichert.

public static void DeleteHash(string key, string cacheSubKey)
        {
            if (string.IsNullOrEmpty(key))
                throw new ArgumentNullException("key");

            Cache.HashDelete(key, cacheSubKey);
        }

sie können also auch den Schlüsselnamen und den Cache-Unterschlüssel übergeben.

0
Rushabh Master