I've been having some problems with Service Stack recently- I've figured out that it seems to be caused by having multiple threads, each connecting to Redis to perform operations. If I have only one thread running at any one time it works fine, but any more and I get several different errors. I've seen elsewhere that it's best to use PooledRedisClientManager and calling GetClient on it, but it's still giving me trouble. I'd just like to know if Redis is thread-safe and what steps you can take to ensure it won't break on concurrent threads.
I've created a program specifically for testing this, which is below.
class Program
{
static IRedisClient redis = new PooledRedisClientManager(ConfigurationManager.AppSettings["RedisServer"]).GetClient();
static void Main(string[] args)
{
LimitedConcurrencyLevelTaskScheduler scheduler = new LimitedConcurrencyLevelTaskScheduler(10);
List<Task> tasks = new List<Task>();
// Create a TaskFactory and pass it our custom scheduler.
TaskFactory factory = new TaskFactory(scheduler);
for (int i = 0; i < 100; i++)
{
Task task = factory.StartNew(() => AsyncMethod1(i));
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
for (int i = 0; i < 100; i++)
{
Task task2 = factory.StartNew(() => AsyncMethod2(i));
tasks.Add(task2);
}
Task.WaitAll(tasks.ToArray());
Console.ReadKey();
}
public static void AsyncMethod1(int i)
{
redis.SetEntry("RedisTest" + i, "TestValue" + i);
}
public static void AsyncMethod2(int i)
{
List<string> result = redis.ScanAllKeys("RedisTest" + i).ToList();
if (result[0] == "RedisTest" + i) Console.Out.Write("Success! " + result[0] + "\n");
else Console.Out.Write("Failure! " + result[0] + " :(\n");
}
}
You should not share RedisClient instances across multiple threads as they're not ThreadSafe. Instead, you should resolve and release them from the thread-safe Redis Client Managers - also mentioned in the docs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With