Удалить/Удалить все/один элемент из кеша StackExchange.Redis
Я использую клиент StackExchange.Redis с сервисом кэша Azure Redis. Вот мой класс,
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
}
}
Обновление: с помощью Marc, вот мой последний класс
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();
}
}
}
Теперь я не знаю, как удалить все элементы или отдельный элемент из кеша redis.
Ответы
Ответ 1
Чтобы удалить один элемент:
_cache.KeyDelete(key);
Чтобы удалить все, выполните команду FLUSHDB
или FLUSHALL
redis; оба доступны в StackExchange.Redis; но по причинам, обсуждаемым здесь, они не входят в API IDatabase
(потому что: они влияют на серверы, а не на логические базы данных).
В соответствии с "Итак, как я их использую?" на этой странице:
server.FlushDatabase(); // to wipe a single database, 0 by default
server.FlushAllDatabases(); // to wipe all databases
(возможно, после использования GetEndpoints()
на мультиплексоре)
Ответ 2
Я не смог сбросить базу данных в кэше Azure Redis, получил эту ошибку:
Эта операция недоступна, если не включен режим администратора: FLUSHDB
Вместо этого повторите все удаленные ключи:
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);
}
Ответ 3
Оба ответа от @Rasi и @Marc Gravell содержат фрагменты кода.
На основе выше, здесь рабочий фрагмент, предполагающий, что есть только 1 сервер:
Вам нужно подключиться к redis с помощью allowAdmin=true
, одним из способов получения таких параметров является назначение AllowAdmin уже обработанной строке:
var options = ConfigurationOptions.Parse("server:6379");
options.AllowAdmin = true;
var redis = ConnectionMultiplexer.Connect(options);
Затем очистить все базы данных:
var endpoints = redis.GetEndPoints();
var server = redis.GetServer(endpoints[0]);
server.FlushAllDatabases();
Выше будет работать над любым развертыванием redis, а не только с Azure.