【问题标题】:StackExchange.Redis - How to get the type of the key?StackExchange.Redis - 如何获取密钥的类型?
【发布时间】:2019-11-13 16:21:45
【问题描述】:

我正在尝试通过 StackExchange.Redis 浏览 Redis 中的 dbX 列表,并查找特定的 type 键。有stringlistsetzsethash 类型的键。假设我想在db1 中找到list 类型的键,我尝试了以下方法:

RedisCacheClient _client;
...
IRedisDatabase database = _client.GetDb(1);
List<InfoDetail> categorizedInfo = await database.GetInfoCategorizedAsync();
IEnumerable<InfoDetail> infos = categorizedInfo.Where(i => i.Category == "Keyspace");

这有助于我获取有关密钥 keys=9,expires=0,avg_ttl=0 但不包括类型的基本信息。

我可以找到所有的钥匙:

IEnumerable<string> keys = await database.SearchKeysAsync("*");

但这只给了我名称,而不是键的类型。 那么,如何找到密钥的type呢?

这可能吗?

谢谢。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    我想我已经找到了解决方案。 IRedisDatabase 类型具有 IDatabase 类型的 Database 属性,IDatabase 类型具有我可以使用的 KeyType() 方法(我认为应该是 GetKeyType(),这会很重要更容易找到)。这样,我就可以列出具有类型的键:

    RedisCacheClient _client;
    ...
    IRedisDatabase redisDatabase = _client.GetDb(1);
    IEnumerable<string> keys = await redisDatabase.SearchKeysAsync("*");
    IDatabase database = redisDatabase.Database;
    Dictionary<string, RedisType> keysWithTypes = keys.ToDictionary(k => k, k => database.KeyType(k));
    

    结果如下所示:

    {[myHash, Hash]}
    {[myZSet, SortedSet]}
    {[myString, String]}
    {[mySet, Set]}
    {[mylist, List]}
    

    【讨论】:

    • 经过一段时间尝试搜索键后,我认为值得补充的是,通过 SCAN 列出来自 Redis 的所有键会更好,并且在 StackExchange.Redis 中,有 server.Keys 方法可以做到这一点以比我的示例中的 SearchKeysAsync("*") 更有效的方式。在以下帖子中进行了解释:stackoverflow.com/a/26440148/1694087
    【解决方案2】:

    Redis 有TYPE 命令,它可以为您提供密钥的类型。我想任何客户都会支持这一点。

    返回存储在 key 的值的类型的字符串表示形式。可以返回的不同类型有:string、list、set、zset、hash和stream。

    https://redis.io/commands/type

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2017-05-09
      • 2013-10-14
      • 2018-11-29
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多