我使用以下代码连接到集群中的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");
}发布于 2016-03-04 20:14:07
没有您期望的纯异步,但您可以使用下面的变通方法。它对于大负载来说已经足够好了。你可以从下面的例子中运行测试,测试它如何为你工作,并决定是否在你的项目中使用它。
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();
}
}
}发布于 2021-01-31 22:43:21
大约5年后的更新:
从5.10版本开始,ServiceStack在其Redis库中添加了异步支持(read more here):
此版本继续带来全面的改进,主要集中在ServiceStack的大多数现有同步API上,获得了纯粹的异步实现,允许您的应用程序的逻辑使用他们首选的同步或异步API。
示例:

https://stackoverflow.com/questions/34219832
复制相似问题