RedisAtomicLong.getAndIncrement空指针异常诱因排查求助
Redis连接池无效连接导致响应null
当Redis连接池中的连接因服务短暂闪断、超时等变为无效,而客户端未及时检测,用该连接执行增量命令时,底层客户端(如Lettuce)可能返回null响应。Spring Boot 2.3.x默认使用Lettuce,若连接池配置不合理(如maxIdle过小、超时时间过短),高并发场景下容易触发这类问题,RedisAtomicLong处理null结果时抛出NPE。RedisAtomicLong实例初始化不完整
如果RedisUtil中的RedisAtomicLong是懒加载或动态创建的,并发场景下可能出现实例未完全初始化就被调用的情况。比如双重检查锁实现的单例存在漏洞,线程拿到未完成初始化的实例,此时实例内部的redisTemplate或key值为空,调用getAndIncrement时触发NPE。目标Redis键被意外删除
若业务中存在定时清理脚本、误操作等删除了RedisAtomicLong对应的key,调用getAndIncrement时Redis返回null。查看Spring Data Redis 2.3.7的源码,RedisAtomicLong.incrementAndGet会调用redisTemplate.opsForValue().increment(key,1),当key不存在且返回null时,后续逻辑未处理该情况,直接触发NPE。Redis客户端兼容性bug
尽管使用的是Spring Boot Redis Starter 2.3.7,但底层依赖的Lettuce/Jedis版本若存在特定bug,在网络波动场景下命令执行可能返回null而非抛出异常,上层RedisAtomicLong未处理该情况导致NPE。并发竞态条件修改实例状态
多个线程同时操作同一个RedisAtomicLong实例时,若存在自定义逻辑修改实例内部的关键属性(如key、redisTemplate),可能导致这些属性被置为null,调用getAndIncrement时触发NPE。
内容的提问来源于stack exchange,提问作者rola shi

