首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack.Redis缺少异步支持

ServiceStack.Redis缺少异步支持
EN

Stack Overflow用户
提问于 2015-12-11 17:14:53
回答 2查看 1.3K关注 0票数 2

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

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

代码语言:javascript
复制
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");
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-04 20:14:07

没有您期望的纯异步,但您可以使用下面的变通方法。它对于大负载来说已经足够好了。你可以从下面的例子中运行测试,测试它如何为你工作,并决定是否在你的项目中使用它。

代码语言:javascript
复制
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();
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-01-31 22:43:21

大约5年后的更新:

从5.10版本开始,ServiceStack在其Redis库中添加了异步支持(read more here):

此版本继续带来全面的改进,主要集中在ServiceStack的大多数现有同步API上,获得了纯粹的异步实现,允许您的应用程序的逻辑使用他们首选的同步或异步API。

示例:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34219832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档