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锁?
发布于 2017-10-03 22:49:27
您很少需要使用用于实现自定义分布式锁定的RedisLocks。所有Redis操作都是原子操作,如果需要原子地发送多个操作,则可以使用Redis交易或实现LUA脚本。
如果没有看到完整的异常详细信息或损坏的数据,该问题很可能跨多个线程重用相同的Redis客户端实例。IRedisClientsManager是ThreadSafe,应该注册为单例,但是它返回的客户端实例不是ThreadSafe,不应该在多个线程之间共享,这些线程作为单个线程存储在静态变量中,等等。为了确保正确使用,每个使用它们的线程都应该解析它们,并且
using (var redis = redisManager.GetClient())
{
//...
}Redis客户端和缓存注册示例
您应该同时将IRedisClientsManager和ICacheClient注册为单例,例如:
container.Register<IRedisClientsManager>(c =>
new RedisManagerPool(connection));
container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());考虑到Redis ICacheClientis ThreadSafe,问题在代码的另一个领域,您正在多个线程中使用相同的Redis实例。请确保仔细检查Redis的所有用法,以确保每个Redis客户端被正确地处理,而不是在不同线程之间共享。
如果这个问题继续存在,尽管使用了这个库,请将一个独立的示例项目(例如在GitHub上)放在一起,我们可以运行这个项目来查看这个问题,我们将对它进行审查。
https://stackoverflow.com/questions/46553529
复制相似问题