我正在使用 Azure Redis,但我无法让这个简单的搜索工作
我做错了什么?
当我搜索我知道在缓存中的特定密钥时却找不到?
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);
}
}
保罗
不要使用
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();
}
}