azure 从StackExchange.Redis缓存中删除所有/一个项目

y0u0uwnf  于 2023-05-07  发布在  Redis
关注(0)|答案(5)|浏览(194)

我正在使用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缓存中删除所有项目或单个项目。

lyr7nygr

lyr7nygr1#

要删除单个项目,请执行以下操作:

_cache.KeyDelete(key);

删除 all 需要使用FLUSHDBFLUSHALL redis命令;这两个都可以在StackExchange中找到。但是,for reasons discussed here,它们不在IDatabase API上(因为:它们影响服务器,而不是逻辑数据库)。
“那我该怎么使用它们?””在那一页上:

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

(很可能在多路复用器上使用GetEndpoints()之后)

9gm1akwq

9gm1akwq2#

我无法刷新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);
}
siv3szwd

siv3szwd3#

@Rasi和@Marc Gravell的两个答案都包含所需的代码片段。基于上述,这里是假设只有1台服务器的工作片段
你需要使用allowAdmin=true连接到redis,获得这样的选项的一种方法是将AllowAdmin分配给已经解析过的字符串:

var options = ConfigurationOptions.Parse("server:6379");
options.AllowAdmin = true;
var redis = ConnectionMultiplexer.Connect(options);

然后到flush all数据库:

var endpoints = redis.GetEndPoints();
var server = redis.GetServer(endpoints[0]);
server.FlushAllDatabases();

以上将适用于任何redis部署,而不仅仅是Azure。

vc9ivgsu

vc9ivgsu4#

你也可以删除哈希,如果你想从任何缓存列表中清除特定的值。例如,我们有一个emp列表,里面缓存了不同的部门。

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

            Cache.HashDelete(key, cacheSubKey);
        }

因此也可以传递Key名称和缓存子键。

xkrw2x1b

xkrw2x1b5#

在分布式缓存中删除List中的项目,使用分布式缓存库支持的ListRemoveAsync()函数,可通过IDistributedCache接口访问

public async Task RemoveListByIndexAsync(string key, string cacheValue)
 {
   RedisValue redisValue = cacheValue // value of item in the list to be removed;
   await _cache.ListRemoveAsync(key, redisValue);
 }
  • key - cacahe key redisValue
  • item -列表中要删除的项。
    注意-确保要删除的Redis值应该是该高速缓存中现有列表中的项。

相关问题