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