我使用以下代码连接到群集中的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");
}
答案 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。
示例: