首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要使用RedisLocks ( ServiceStack.Redis )吗?

我需要使用RedisLocks ( ServiceStack.Redis )吗?
EN

Stack Overflow用户
提问于 2017-10-03 21:14:02
回答 1查看 222关注 0票数 2
  • 我目前在aws中有一个带有自动标注的API,这样我就可以运行7到12个服务。
  • 对于我的客户经理,我正在做builder.register<IRedisClientsManager>(c => new PooledRedisClientManager(conection));
  • 为了我的客户,我正在做redis.GetCacheClient();
  • 设置我正在做的缓存条目:cache_client.Set<T>(generate_key<T>(key), values, TimeSpan.FromSeconds(ttl.Value));
  • 要获得我正在做的缓存条目:using (var read_only_client = this.redis.GetReadOnlyClient()) { return read_only_client.GetValue(generate_key<T>(key)); }

发出=>,我得到的是无效的缓存值、格式错误的JSON和错误的文本。

=>问题:我获得无效缓存值的原因是在设置或获取缓存值之前需要使用Redis锁?

EN

回答 1

Stack Overflow用户

发布于 2017-10-03 22:49:27

您很少需要使用用于实现自定义分布式锁定的RedisLocks。所有Redis操作都是原子操作,如果需要原子地发送多个操作,则可以使用Redis交易或实现LUA脚本。

如果没有看到完整的异常详细信息或损坏的数据,该问题很可能跨多个线程重用相同的Redis客户端实例。IRedisClientsManager是ThreadSafe,应该注册为单例,但是它返回的客户端实例不是ThreadSafe,不应该在多个线程之间共享,这些线程作为单个线程存储在静态变量中,等等。为了确保正确使用,每个使用它们的线程都应该解析它们,并且

代码语言:javascript
复制
using (var redis = redisManager.GetClient())
{
    //...
}

Redis客户端和缓存注册示例

您应该同时将IRedisClientsManagerICacheClient注册为单例,例如:

代码语言:javascript
复制
container.Register<IRedisClientsManager>(c => 
    new RedisManagerPool(connection));

container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());

考虑到Redis ICacheClientis ThreadSafe,问题在代码的另一个领域,您正在多个线程中使用相同的Redis实例。请确保仔细检查Redis的所有用法,以确保每个Redis客户端被正确地处理,而不是在不同线程之间共享。

如果这个问题继续存在,尽管使用了这个库,请将一个独立的示例项目(例如在GitHub上)放在一起,我们可以运行这个项目来查看这个问题,我们将对它进行审查。

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

https://stackoverflow.com/questions/46553529

复制
相关文章

相似问题

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