web-dev-qa-db-fra.com

Supprimer / Supprimer tout / un élément du cache StackExchange.Redis

J'utilise le client StackExchange.Redis avec Azure Redis Cache Service. Voici ma classe,

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
    }
}

Mise à jour: avec l'aide de Marc, voici mon dernier cours

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();    
        }
    }
}

Maintenant, je ne sais pas comment supprimer tous les éléments ou un seul élément du cache redis.

38
user960567

Pour supprimer un seul élément:

_cache.KeyDelete(key);

Pour supprimer tout implique la commande FLUSHDB ou FLUSHALL redis; les deux sont disponibles dans StackExchange.Redis; mais, pour les raisons évoquées ici , ils ne sont pas sur l'API IDatabase (car: ils affectent les serveurs, pas les bases de données logiques).

Selon le "Alors, comment puis-je les utiliser?" sur cette page:

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

(très probablement après avoir utilisé GetEndpoints() sur le multiplexeur)

50
Marc Gravell

Je n'ai pas pu vider la base de données dans Azure Redis Cache, j'ai obtenu cette erreur:

Cette opération n'est disponible que si le mode administrateur est activé: FLUSHDB

Au lieu de cela, parcourez toutes les clés pour supprimer:

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

Les deux réponses de @Rasi et @Marc Gravell contiennent les morceaux de code nécessaires. Sur la base de ce qui précède, voici extrait de travail en supposant qu'il n'y a qu'un seul serveur :

Vous devez vous connecter à redis avec allowAdmin=true, une façon d'obtenir ces options est d'affecter AllowAdmin à une chaîne déjà analysée:

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

Ensuite, pour vider toutes les bases de données:

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

Ci-dessus fonctionnera sur n'importe quel déploiement redis, pas seulement Azure.

4
Tomasz Sętkowski

Vous pouvez également supprimer le hachage, c'est-à-dire si vous souhaitez effacer une valeur spécifique de toute liste mise en cache. Par exemple, nous avons une liste emp et à l'intérieur avec un département différent comme mis en cache.

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

            Cache.HashDelete(key, cacheSubKey);
        }

afin que vous puissiez également transmettre le nom de la clé et la sous-clé du cache.

0
Rushabh Master