c# - Service Stack Redis 连接的线程安全

标签 c# asp.net redis thread-safety servicestack

我最近在使用 Service Stack 时遇到了一些问题 - 我发现这似乎是由多个线程引起的,每个线程都连接到 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 客户端管理器中解析并释放它们 - also mentioned in the docs .

关于c# - Service Stack Redis 连接的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450537/

相关文章:

c# - linq2db.MySql - 无法找到源类型的查询模式的实现。未找到的地方

javascript - .net 按钮事件未通过 ajax 工具包 ModalPopupExtender targetcontrolid 属性触发

python - Redis:查找 SINTER 结果的 SCARD,而不存储中间集

Redis 的 Spring Data : when dealing with values, 是否仅适用于 StringRedisTemplate?

c# - 在树层次结构中具有深度限制的通用深度克隆

c# - ASp.NET MVC - 是否可以简化我的体系结构?

c# - 如何修复发现的不兼容的 SQL Server 版本?

amazon-web-services - AWS Cloudwatch 指标显示与 redis-cli 不同的当前连接数

c# - "Invalid JSON primitive: System.Object."的 Jquery Ajax POST 到 C# WebMethod 错误

asp.net - Sharepoint 中的 UI