【问题标题】: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 对象上的 StringGetStringGetAsync 方法 - 从无到有查看以下示例:

    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)
              {
              }
      

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 2021-07-18
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 2018-10-26
        • 2018-01-09
        相关资源
        最近更新 更多