使用 C# 对 StackExchange.Redis 哈希中的字段进行通配符搜索

Posted

技术标签:

【中文标题】使用 C# 对 StackExchange.Redis 哈希中的字段进行通配符搜索【英文标题】:Redis hash like query 【发布时间】:2022-01-19 06:13:58 【问题描述】:

我浏览了很多关于 SO 的帖子。 Key-Pattern-SearchGet-All-Hashesh

我有一些不同的情况。我的项目有 redis 哈希。结构如下:

Redis: 
Key - H_SD_C_India 
Field - Ameya_Deshpande_India
Value - JSON

我需要的是搜索所有在字段中包含特定值的文档。像这样的

Where Field.Contains("Ameya*)

我们在.Net 中使用StackExchange.Redis 及其方法来存储和从redis 缓存中获取数据。

HMSETHSCANSCAN 0 TYPE hash 等成员建议的选项很少,但这些都在 CLI 中。

我尝试了以下方法来查找数据:但没有得到我期望的结果。

HashGetAsync("H_SD_C_India", "Ameya*");

请建议如何使用 StackExchange.Redis 从 .Net 应用程序中进行通配符搜索

【问题讨论】:

【参考方案1】:

解决了。我在 stockExchange.Redis 中没有找到任何直接方法,我们所做的是在 ExecuteAsync 方法 SDK 中执行 CLI 中的命令。

代码如下:

public async Task<List<T>> HashFieldSearch<T>(string hashKey, string HashFieldfilterValue, bool isWildCardSearch)
        
            var redisData = new List<T>();
            #region With HSCAN and MATCH
            int nextCursor = 0;
            do
            
                RedisResult matchRedisResultFromCache = await dbCache.ExecuteAsync("HSCAN", new object[]  hashKey, nextCursor.ToString(), "MATCH", isWildCardSearch ? $"HashFieldfilterValue*" : HashFieldfilterValue, "COUNT", "1000" );
                var matchRecord = (RedisResult[])matchRedisResultFromCache;
                nextCursor = int.Parse((string)matchRecord[0]);
                List<string> cacheResultCount = ((string[])matchRecord[1]).ToList();
                // If data is present for that cursor then only deserialize it to type otherwise return resultset
                if (cacheResultCount.Count > 0)
                
                    redisData.Add(JsonConvert.DeserializeObject<T>(CacheGZipHelper.Unzip(((byte[])((RedisValue[])matchRecord[1])[1]))));
                
            
            while (nextCursor != 0);
            #endregion With HSCAN and MATCH
            return redisData;
        

希望将来对某人有所帮助。

【讨论】:

以上是关于使用 C# 对 StackExchange.Redis 哈希中的字段进行通配符搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 'var' 对 C# 编译器的性能有多大影响?

使用 C# 对 JavaScript 的 escape() 进行转义

为啥要在 C# 中对布尔值使用 |= 运算符?

在 C# 中对布尔值使用 &=

C# 是不是使用 await 对 if 语句执行短路评估?

为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?