csredis
csredis copied to clipboard
Object reference not set to an instance of an object.
大数据并发是出现空引用问题 'Object reference not set to an instance of an object.' @2881099 请问如何解决.
at CSRedis.RedisClientPoolPolicy.OnGet(Object1 obj) at CSRedis.Internal.ObjectPool.ObjectPool1.Get(Nullable1 timeout) at CSRedis.CSRedisClient.GetAndExecute[T](RedisClientPool pool, Func2 handler, Int32 jump, Int32 errtimes) at CSRedis.CSRedisClient.ExecuteScalar[T](String
key, Func`3 hander) at CSRedis.CSRedisClient.HMGet[T](String key, String[] fields) at XXX.Middlewares.RedisExtensions.RedisExtensions.GetAndRefresh(String key, Boolean getData) in D:\BuildAgent2_work\196\s\XXX\Middlewares\RedisExtensions\RedisExtensions.cs:line
167 at XXX.Middlewares.RedisExtensions.RedisExtensions.Get(String key) in D:\BuildAgent2_work\196\s\XXX\Middlewares\RedisExtensions\RedisExtensions.cs:line 56 at
连接不上 redis-server 的时候有可能出现该错误
谢谢您的回复, 实际的情况是再次刷新页面就会没有这个错误了,请问连不上server 可能是并发导致的吗? 另外 redis-server 配置的是集群模式,创建csredisclient 是使用的普通模式
连接不上 redis-server 的时候有可能出现该错误
谢谢您的回复, 实际的情况是再次刷新页面就会没有这个错误了,请问连不上server 可能是并发导致的吗? 另外 redis-server 配置的是集群模式,创建csredisclient 是使用的普通模式
有可能并发导致,可能 redis-server 服务器有瞬间连接次数的限制
连接不上 redis-server 的时候有可能出现该错误
谢谢您的回复, 实际的情况是再次刷新页面就会没有这个错误了,请问连不上server 可能是并发导致的吗? 另外 redis-server 配置的是集群模式,创建csredisclient 是使用的普通模式
有什么方法能避免这种情况吗,实际的话 是刷新之后可以连接到redis server的
有可能并发导致,可能 redis-server 服务器有瞬间连接次数的限制
您说的很对,我在poolsize设置的是300 可能是连接池不够用了,但是能一味的加大poolsize吗 谢谢
设置 preheat=1
然后需要自己手工预热连接数量
内部默认是采用并发预热,一般环境下速度快。但是在某些有网络连接次数限制的环境,可能被让服务器短暂的拒绝连接。
不用并发预热,启动速度慢。
设置 preheat=1
谢谢你的建议,再多问一句,preheat是预热,但是高并发下还是会占用redis的连接,请问preheat 如何解决。可能我理解的有误。对这个没有经验
然后需要自己手工预热连接数量
内部默认是采用并发预热,一般环境下速度快。但是在某些有网络连接次数限制的环境,可能被让服务器短暂的拒绝连接。
不用并发预热,启动速度慢。 手动预热的意思是 需要手动连接redis吗 比如说查询一个key值? 还是有什么命令可以添加?
预热跟占用没关系,就是程序启动前提前创建50-100个 socket,可以避免程序启动后再创建 socket 慢的问题。
预热跟占用没关系,就是程序启动前提前创建50-100个 socket,可以避免程序启动后再创建 socket 慢的问题。
请问一下如何做手动预热?如果只是加preheat 是否也可以解决呢
预热跟占用没关系,就是程序启动前提前创建50-100个 socket,可以避免程序启动后再创建 socket 慢的问题。
请问一下如何做手动预热?如果只是加preheat 是否也可以解决呢
比如说preheat=50 那是否和您说的 创建50个socket?
自己预热连接,需要先了解 RedisHelper.Instance.Nodes 这个属性。
他是一个字典,循环它得到 RedisClientPool。
这种方式对网络环境不好的时候会特别慢。但是它不会像上面说对并发连接次数敏感。
foreach (var pool in RedisHelper.Instance.Nodes.Values)
{
var initConns = new ConcurrentBag<Object<RedisClient>>();
for (var a = 0; a < 50; a++)
{
try
{
var conn = pool.Get();
initConns.Add(conn);
}
catch (Exception ex)
{
pool.SetUnavailable(ex);
break; //预热失败,后面将不进行
}
}
while (initConns.TryTake(out var conn)) pool.Return(conn);
}
自己预热连接,需要先了解 RedisHelper.Instance.Nodes 这个属性。
他是一个字典,循环它得到 RedisClientPool。
这种方式对网络环境不好的时候会特别慢。但是它不会像上面说对并发连接次数敏感。
foreach (var pool in RedisHelper.Instance.Nodes.Values) { var initConns = new ConcurrentBag<Object<RedisClient>>(); for (var a = 0; a < 50; a++) { try { var conn = pool.Get(); initConns.Add(conn); } catch (Exception ex) { pool.SetUnavailable(ex); break; //预热失败,后面将不进行 } } while (initConns.TryTake(out var conn)) pool.Return(conn); }
非常感谢,我是不是可以将preheat设置成50 来应对并发情况呢,现在空引用的问题的确像您说的 pool.get.
自己预热连接,需要先了解 RedisHelper.Instance.Nodes 这个属性。 他是一个字典,循环它得到 RedisClientPool。 这种方式对网络环境不好的时候会特别慢。但是它不会像上面说对并发连接次数敏感。
foreach (var pool in RedisHelper.Instance.Nodes.Values) { var initConns = new ConcurrentBag<Object<RedisClient>>(); for (var a = 0; a < 50; a++) { try { var conn = pool.Get(); initConns.Add(conn); } catch (Exception ex) { pool.SetUnavailable(ex); break; //预热失败,后面将不进行 } } while (initConns.TryTake(out var conn)) pool.Return(conn); }@2881099 还想请教一下,看您发的这个代码是每个node都会有50个预热 那么想知道 preheat再去设置值会重写吗? 还有redisserver端配的是集群模式,需要将testcluster 设置成true吗。 谢谢!