使用 C# 对 StackExchange.Redis 哈希中的字段进行通配符搜索
wildcard search on field in StackExchange.Redis hash using C#
我浏览了很多关于 SO 的帖子。 Get-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*");
Please suggest how to do wildcard search from .Net application using StackExchange.Redis
已解决。我在 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;
}
Hope it will help to someone in future.
我浏览了很多关于 SO 的帖子。
我遇到了一些不同的情况。我的项目有 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*");
Please suggest how to do wildcard search from .Net application using
StackExchange.Redis
已解决。我在 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;
}
Hope it will help to someone in future.