【问题标题】:Get all key and values from all redis databases?从所有redis数据库中获取所有键和值?
【发布时间】:2017-04-03 22:46:21
【问题描述】:

我正在使用 StackExchange.Redis 使用多个数据库在 redis 缓存中存储和检索项目。

但是,我无法弄清楚如何跨所有数据库检索键/值。 以下代码从默认数据库 0 中检索密钥,我找不到如何更改它以从每个数据库中检索密钥

    public IEnumerable<KeyValuePair<string, object>> GetAll()
    {
        var result = new List<KeyValuePair<string, object>>();
        var endpoints = _dataCache.Multiplexer.GetEndPoints();
        var server = _dataCache.Multiplexer.GetServer(endpoints.First());

        var keys = server.Keys();
        foreach (var key in keys)
        {
            Console.WriteLine(key.ToString());
        }
        return result;
    }

有什么建议吗?

【问题讨论】:

    标签: c# caching redis stackexchange.redis


    【解决方案1】:

    似乎我找到了答案 - 需要将数据库名称传递给实际的 .Keys,如下所示

    var keys = server.Keys(_dataCache.Database);
    

    【讨论】:

    • 在生产中可能不是一个好主意,请改用 SCAN 命令。
    • 使用哪个命令(KEYS 或 SCAN)将由服务器根据服务器能力决定。
    • 我如何从键变量中获取值?
    【解决方案2】:

    你需要写: var keys = server.Keys(int dbName); 我在示例中添加了如何按键获取值

    public static ConnectionMultiplexer Connection
    {
       get
       {
          return ConnectionMultiplexer.Connect("serverName: port");
       }
    }
    
            public Dictionary<string, string> GetDataFromDataBase(srting sPattern = "*")
            {
             int dbName = 2; //or 0, 1, 2
             Dictionary<string, string> dicKeyValue = new Dictionary<string, string>();
             var keys = Connection.GetServer("serverName: port").Keys(dbName, pattern: sPattern);
             string[] keysArr = keys.Select(key =>(string)key).ToArray();
    
             foreach(var key in keysArr)
             {
               dicKeyValue.Add(key, GetFromDB(dbName , key));
             }
    
             return dicKeyValue;
            }
    
        public string GetFromDB(int dbName, string key)
        {
          var db = Connection.GetDatabase(dbName);
          return db.StringGet(key);
        }
    

    【讨论】:

      【解决方案3】:
      using StackExchange.Redis;
      using System;
      using System.Collections.Generic;
      using System.IO;
      using System.Linq;
      
      namespace ConsoleApp1
      {
          class Program
          {
              static void Main(string[] args)
              {
                  try
                  {
                      string folderPath = @"C:\RedisCache\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + @"\";
                      Directory.CreateDirectory(folderPath);
                      IDictionary<string, string> dicts = GetDataFromDataBase();
      
                  using (TextWriter tw = new StreamWriter(folderPath + "BatchFile.bat"))
                  {
                      foreach (var dic in dicts)
                      {
                          tw.WriteLine("REDIS COMMAND");
                      }
                  }
      
                  }
                  catch(Exception ex)
                  {
                      throw ex;
                  }
              }
      
              public static ConnectionMultiplexer Connection
              {
                  get
                  {
                      return ConnectionMultiplexer.Connect("serverName: port");
                  }
              }
      
              public static Dictionary<string, string> GetDataFromDataBase(string sPattern = "*")
              {
                  int dbName = 2; //or 0, 1, 2
                  Dictionary<string, string> dicKeyValue = new Dictionary<string, string>();
                  var keys = Connection.GetServer("serverName: port").Keys(dbName, pattern: sPattern);
                  string[] keysArr = keys.Select(key => (string)key).ToArray();
      
                  foreach (var key in keysArr)
                  {
                      dicKeyValue.Add(key, GetFromDB(dbName, key));
                  }
      
                  return dicKeyValue;
              }
      
              public static string GetFromDB(int dbName, string key)
              {
                  var db = Connection.GetDatabase(dbName);
                  return db.StringGet(key);
              }
          }
      }
      

      【讨论】:

      • 请在此答案中添加内容
      • 请解释您的代码如何解决问题提出的问题。
      猜你喜欢
      • 2015-08-24
      • 2014-04-10
      • 2016-09-23
      • 2016-08-20
      • 2017-08-13
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多