使用 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 缓存中获取数据。
HMSET
或 HSCAN
或 SCAN 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 哈希中的字段进行通配符搜索的主要内容,如果未能解决你的问题,请参考以下文章