web-dev-qa-db-ja.com

StackExchange.Redisキャッシュからすべて/ 1つのアイテムを削除/削除します

Azure Redis Cache ServiceでStackExchange.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
    }
}

更新:マークの助けから、これが私の最終クラスです

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キャッシュからすべてのアイテムまたは単一のアイテムを削除する方法がわかりません。

38
user960567

単一のアイテムを削除するには:

__cache.KeyDelete(key);
_

allを削除するには、FLUSHDBまたはFLUSHALL redisコマンドが必要です。どちらもStackExchange.Redisで利用できます。ただし、 ここで説明する理由により 、それらはIDatabase AP​​Iにはありません(理由は、論理データベースではなくサーバーに影響するためです)。

「それでは、どのように使用しますか?」そのページで:

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

(マルチプレクサでGetEndpoints()を使用した後に終了する可能性があります)

50
Marc Gravell

Azure Redis Cacheでデータベースをフラッシュできませんでした。このエラーが発生しました。

この操作は、管理モードが有効になっていない限り使用できません: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);
}
22
RaSi

@Rasiと@Marc Gravellの両方の回答には、必要なコードが含まれています。上記に基づいて、サーバーが1つだけであると仮定した場合の作業スニペットは次のとおりです

allowAdmin=trueを使用してredisに接続する必要があります。そのようなオプションを取得する1つの方法は、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();

上記は、Azureだけでなく、すべてのredis展開で機能します。

4

ハッシュも削除できます。つまり、キャッシュされたリストから特定の値をクリアする場合です。たとえば、empリストがあり、内部には異なる部門がキャッシュされています。

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

            Cache.HashDelete(key, cacheSubKey);
        }

キー名とキャッシュサブキーも渡すことができます。

0
Rushabh Master