I’m new to Redis and in my first year as a software engineer so thank you for your help in advance.
I’m trying to get all of the keys out of my DB in a specific partition as fast as possible. I know of two ways to do this.
Here is a picture of the code to help explain what I’m trying to do and understand:
Option 1 returns keys almost instantly but I can’t figure out how to combine the consumersPattern
and nonConsumersPattern
using something like "{2}.Keys.*"
, similar to what I’m doing for option 2. If I try "{2}.Keys.*"
, I get an error saying the value is null. As you can see, the consumersPattern
+ nonConsumersPattern
count is 844 so there are obviously keys not being queried (when compared to the count from option 1). I want all the keys, not just the consumers and non consumers.
If I understand how this works, the {2}
is the partition I’m querying. I’m trying to get all the keys on the partition which I believe is what option 2 is doing. Option 2, however, takes a really long time to run (between 30-50 seconds depending on which partition I’m querying).
How do I get all the keys on the partition and not sacrifice speed?
Here is the code used in the picture:
private static List<RedisKey> GetKeysFromRedis(ConnectionMultiplexer connection, EndPoint endPoint,
string keyPattern)
{
IDatabase redisCache = connection.GetDatabase();
var consumersPattern = "{2}.Keys.Consumers";
var nonConsumersPattern = "{2}.Keys.NonConsumers";
var redisKeysConsumers = JsonConvert.DeserializeObject<string()>(redisCache.StringGet(consumersPattern));
var redisKeysNonConsumers = JsonConvert.DeserializeObject<string()>(redisCache.StringGet(nonConsumersPattern));
var consumerKeys = redisKeysConsumers.Select(key => (RedisKey)key).ToList();
var nonConsumerKeys = redisKeysNonConsumers.Select(key => (RedisKey)key).ToList();
var totalKeys = consumerKeys.Concat(nonConsumerKeys).ToList().Count;
var keys = connection.GetServer(endPoint).Keys(pattern: keyPattern).ToList();
return keys;
}
Thanks again.