Подтвердить что ты не робот

Удалить/Удалить все/один элемент из кеша 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.

4b9b3361

Ответ 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.