azure - porta - Eliminar/Eliminar todo/un elemento de StackExchange.Redis caché
redis cache example (3)
Ambas respuestas de @Rasi y @Marc Gravell contienen piezas de código necesarias. En base a lo anterior, aquí está el fragmento de trabajo suponiendo que solo hay 1 servidor :
Necesita conectarse a redis con allowAdmin=true
, una forma de obtener tales opciones es asignar AllowAdmin a la cadena ya analizada:
var options = ConfigurationOptions.Parse("server:6379");
options.AllowAdmin = true;
var redis = ConnectionMultiplexer.Connect(options);
Luego para purgar todas las bases de datos:
var endpoints = redis.GetEndPoints();
var server = redis.GetServer(endpoints[0]);
server.FlushAllDatabases();
Arriba funcionará en cualquier despliegue de redis, no solo en Azure.
Estoy utilizando el cliente StackExchange.Redis con Azure Redis Cache Service. Aquí está mi clase,
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
}
}
Actualización: De la ayuda de Marc, esta es mi clase final
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();
}
}
}
Ahora no sé cómo eliminar todos los elementos o elementos individuales de la memoria caché de redis.
No pude lavar la base de datos en Azure Redis Cache, recibí este error:
Esta operación no está disponible a menos que el modo de administración esté habilitado: FLUSHDB
En su lugar, repita todas las teclas para eliminar:
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);
}
Para eliminar un solo artículo:
_cache.KeyDelete(key);
Eliminar todo implica el FLUSHDB
o FLUSHALL
redis; ambos están disponibles en StackExchange.Redis; pero, por los motivos que se analizan aquí , no están en la API de IDatabase
(porque: afectan a los servidores, no a las bases de datos lógicas).
Según el "Entonces, ¿cómo los uso?" en esa página:
server.FlushDatabase(); // to wipe a single database, 0 by default
server.FlushAllDatabases(); // to wipe all databases
(muy posiblemente después de usar GetEndpoints()
en el multiplexor)