簡體   English   中英

Service Stack Redis連接的線程安全性

[英]Thread safety of Service Stack Redis connections

我最近遇到了服務堆棧的一些問題 - 我發現它似乎是由多個線程引起的,每個線程都連接到Redis來執行操作。 如果我在任何時候只有一個線程運行它可以正常工作,但是我會得到幾個不同的錯誤。 我在其他地方看到,最好使用PooledRedisClientManager並在其上調用GetClient,但它仍然給我帶來麻煩。 我只想知道Redis是否是線程安全的,你可以采取什么步驟來確保它不會在並發線程上中斷。

我已經創建了一個專門用於測試它的程序,如下所示。

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");
    }
}

您不應跨多個線程共享RedisClient實例,因為它們不是ThreadSafe。 相反,您應該從線程安全的Redis客戶端管理器中解析並釋放它們 - 這也是在文檔中提到的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM