【问题标题】:C# Redis Cache get multiple entriesC# Redis缓存获取多个条目
【发布时间】:2022-11-13 17:25:31
【问题描述】:
所以我正在使用“StackExchange.Redis”,我想知道是否可以通过键模式或键列表获取多个值,以便一次访问 redis 缓存并获取我需要的所有数据。
在使用“GetObject”方法时,我已经尝试在键中使用“star”,如下所示:
User user = RedisContext.Cache.GetObject("User*");
但这返回null。
而且我还尝试通过确实有效的模式获取所有键,但我无法一次性获得值,如下所示:
var endpoint = RedisContext.GetConnectionMultiplexer().GetEndPoints().First();
var keys = RedisContext.GetConnectionMultiplexer().GetServer(endpoint.ToString()).Keys(pattern: "User*");
List<string> keyList = new List<string>();
foreach (var _key in keys)
{
keyList.Add(_key);
}
List<User> users = RedisContext.Cache.GetObjectsByTag<dynamic>(keyList.ToArray());
但这给了我一个例外。
有什么我想念的吗?
【问题讨论】:
标签:
c#
redis
stackexchange.redis
【解决方案1】:
您可以一举获得多个钥匙吗?
已经回答了here
您可以将 RedisKeys 数组传递给 IDatabase 对象上的 StringGet 或 StringGetAsync 方法 - 从无到有查看以下示例:
var muxer = ConnectionMultiplexer.Connect("localhost");
var db = muxer.GetDatabase();
db.StringSet("foo", "bar");
db.StringSet("baz", "foo");
db.StringSet("bar", "baz");
var result = await db.StringGetAsync(new RedisKey[]{"foo","bar","baz"});
foreach (var item in result)
{
Console.WriteLine((string)item);
}
你能一口气按图案得到所有的钥匙吗
你可以,但不应该,除非你想建立一个二级索引。您可以编写一个 lua 脚本来匹配键模式,然后使用该模式拉回所有键,但这将非常低效和危险,因为您将承诺在一个操作中查看整个键空间,这是其中之一可以真正挂起一个 Redis 服务器。
您可以做的是创建二级索引并搜索与给定模式匹配的键。这可以通过traditional way 完成,或者您可以使用RediSearch 之类的模块来帮助您构建它们。
【解决方案2】:
我能够使用以下代码对我在 VM 上启动的 Redis 服务器进行 ssl
try
{
ConfigurationOptions configurationOptions = new ConfigurationOptions
{
KeepAlive = 0,
AllowAdmin = true,
EndPoints = { { "SERVER IP ADDRESS", 6379 }, { "127.0.0.1", 6379 } },
ConnectTimeout = 5000,
ConnectRetry = 5,
SyncTimeout = 5000,
AbortOnConnectFail = false,
};
configurationOptions.CertificateSelection += delegate
{
var cert = new X509Certificate2("PFX FILE PATH", "");
return cert;
};
ConnectionMultiplexer connection =
ConnectionMultiplexer.Connect(configurationOptions);
IDatabase databaseCache = connection.GetDatabase();
//set value
databaseCache.StringSet("KEYNAME", "KEYVALUE");
//get Value
label_show_value.Text = databaseCache.StringGet("KEYNAME").ToString();
}
catch (Exception e1)
{
}