即使键确实存在,也无法使用模式在 Redis 中查找键

问题描述 投票:0回答:1

我正在使用 Azure Redis,但我无法让这个简单的搜索工作

我做错了什么?

当我搜索我知道在缓存中的特定密钥时却找不到?

enter image description here

private async Task DeleteAllKeysForProfileAsync(string profileId)
{
    var endpoint = _connectionMultiplexer.GetEndPoints().First();
    var pattern = $"*{profileId}*";
    var keys = this._connectionMultiplexer.GetServer(endpoint).Keys(pattern: pattern);
    foreach (var key in keys)
    {
        await _redisDatabase.KeyDeleteAsync(key);
    }
}

保罗

azure redis stackexchange.redis
1个回答
0
投票

不要使用

KEYS
,而是使用
SCAN
。在上面的代码中没有明确使用
SCAN
,我建议为了更好的实践和性能,
SCAN
是非阻塞的,可以更有效地处理更大的数据集。

我为 SCAN 引用了此

DOC
以及如何使用 它们

KEYS 命令,因为它仅支持以下 glob 样式模式和 Lua 脚本,您可以使用它来查找所有 keys。您仅限于一次查询所有键或由其确切指定的一个或多个键姓名。这种使用模式可能意味着您需要一个哈希加上另一个数据结构(例如集合)来记录有趣的键,或者两个或多个单独的哈希



public class RedisServiceClassName
{
    private readonly IConnectionMultiplexer _connectionMultiplexer;
    private readonly IDatabase _redisDatabaseName;

    public RedisServiceClassName(IConnectionMultiplexer connectionMultiplexer)
    {
        _connectionMultiplexer = connectionMultiplexer;
        _redisDatabaseName = _connectionMultiplexer.GetDatabase();
    }

    public async Task SetKeyAsync(string key, string value)
    {
        Console.WriteLine($"Setting key: {key} with value: {value}");
        bool setResult = await _redisDatabaseName.StringSetAsync(key, value);
        Console.WriteLine($"Set result: {setResult}");
    }

    public async Task DeleteAllKeysForProfileAsync(string profileId)
    {
        var endpoint = _connectionMultiplexer.GetEndPoints().First();
        var server = _connectionMultiplexer.GetServer(endpoint);
        var pattern = $"*{profileId}*";


        var keys = server.Keys(database: _redisDatabaseName.Database, pattern: pattern);

        Console.WriteLine($"Found {keys.Count()} keys matching pattern '{pattern}'.");

        foreach (var key in keys)
        {
            Console.WriteLine($"Deleting key: {key}");
            await _redisDatabaseName.KeyDeleteAsync(key);
        }
    }
}

public static class Program
{
    public static async Task Main(string[] args)
    {
        var redisConnectionString = "AzureRadisNme.redis.cache.windows.net:6380,password=Password,ssl=True,abortConnect=False"; 
        var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(redisConnectionString);
        var redisService = new RedisServiceClassName(connectionMultiplexer);
        await redisService.SetKeyAsync("user:192a2b84-867b-495f-bd8a-2083e2c76036:profile", "User Profile Data for 007");
        await redisService.SetKeyAsync("user:007:settings", "User Settings Data for 007");

        string profileId = "192a2b84-867b-495f-bd8a-2083e2c7603";
        await redisService.DeleteAllKeysForProfileAsync(profileId);

        Console.WriteLine("Operation completed. Press any key to exit.");
        Console.ReadKey();
    }
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.