ServiceStack.Redis缺少异步支持

时间:2015-12-11 09:14:53

标签: c# async-await servicestack servicestack.redis

我使用以下代码连接到群集中的redis。我会在一个流量很大的webapi项目中使用它,并且我担心缺少异步支持。

有没有人有这方面的经验?我也没有为此找到一份官方支持电子邮件地址。

var sentinel = new RedisSentinel(sentinels, "mymaster");

var redisManager = sentinel.Start();
while (true)
{       
    Console.WriteLine("Key add: ");
    string key = Console.ReadLine();
    using (var redis = redisManager.GetClient())
    {
        string val = Guid.NewGuid().ToString();
        redis.AddItemToList(key, val);
        Console.WriteLine(val);
    }
    Console.WriteLine("done");
}

2 个答案:

答案 0 :(得分:2)

没有您期望的纯异步,但您可以使用下面的解决方法。它足以承受大负荷。您可以从下面的示例运行测试并测试它是如何工作的,并决定是否在项目中使用它。

public class ad_hook
{
    [Fact]
    public async Task test_redis_load()
    {
        var repository = GetRedis();
        int expected;
        IEnumerable<Task<string>> tasks;
        using (var redisRepository = repository)
        {
            redisRepository.Set("foo", "boo");
            expected = 10000;
            tasks = Enumerable.Range(1, expected).Select(_ => Task.Run(() => redisRepository.Get<string>("foo")));


            var items = await Task.WhenAll(tasks);
            items.Should().OnlyContain(s => s == "boo")
                .And.HaveCount(expected);
        }
    }
    private static RedisRepository GetRedis()
    {
        var repository = new RedisRepository();
        return repository;
    }
}

public class RedisRepository : IDisposable
{
    private Lazy<IRedisClient> clientFactory;
    private PooledRedisClientManager clientManager;

    private T Run<T>(Func<IRedisClient, T> action)
    {
        using (var client = GetRedisClient())
        {
            return action(client);
        }
    }
    private IRedisClient GetRedisClient()
    {
        return clientManager.GetClient();
    }

    public RedisRepository()
    {
        clientFactory = new Lazy<IRedisClient>(GetRedisClient);
        clientManager = new PooledRedisClientManager();
    }

    public void Set<T>(string key, T entity)
    {
        Run(_ => _.Set(key, entity));
    }

    public T Get<T>(string key)
    {
        return Run(_ => _.Get<T>(key));
    }

    public void Dispose()
    {
        clientManager.Dispose();
        if (clientFactory.IsValueCreated)
        {
            clientFactory.Value.Dispose();
        }
    }
}

答案 1 :(得分:1)

更新,大约 5 年后:

ServiceStack 已为其 Redis 库添加了异步支持,从 v 5.10 开始 (read more here):

<块引用>

此版本继续全面改进 主要异步关注大多数 ServiceStack 现有的同步 API 纯异步实现允许您的应用程序的逻辑使用它们的 首选同步或异步 API。

示例:

enter image description here