我看到一些奇怪的案子。有时我的findby…()方法返回null,而不是以前成功插入和获取的某个对象。在那之后,所需的对象会很好地获取。换言之,有时搜索不起作用。
spring boot版本:1.5.2.0版本
spring boot starter数据redis:1.5.22.release
“maxmemory policy”设置设置为“noeviction”
我的目标声明:
@RedisHash("session")
public class Session implements Serializable {
@Id
private String id;
@Indexed
private Long internalChatId;
@Indexed
private boolean active;
@Indexed
private String chatId;
}
jpa存储库:
@Repository
public interface SessionRepository extends CrudRepository<Session, String> {
Session findByInternalChatIdAndActive(Long internalChatId, Boolean isActive);
}
redis配置:
@Bean
public LettuceConnectionFactory redisConnectionFactory(
RedisProperties redisProperties) {
return new LettuceConnectionFactory(
redisProperties.getRedisHost(),
redisProperties.getRedisPort());
}
@Bean
public RedisTemplate<?, ?> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
任何协助都要提前通知他。
2条答案
按热度按时间bis0qfac1#
我们最近也看到了类似的行为。在我们的场景中,可以有多个线程读写同一个存储库。当一个线程对一个对象执行保存操作,而另一个线程对同一个对象执行findbyid操作时,就会出现null返回。findbyid偶尔会失败。似乎save实现先删除,然后添加;如果findbyid在删除过程中进入,则返回null结果。
到目前为止,我们的测试程序很幸运,它可以使用java信号量对存储库的所有访问(读、写、删除)进行选通,从而重现null返回。当存储库访问方法都被同一个信号量选通时,我们没有看到null返回。我们的下一步是尝试将synchronized关键字添加到类中访问存储库的方法中(作为使用信号量的替代方法)。
siv3szwd2#
我不知道这是什么原因。但可以使用option类,如果它返回null,至少可以避免异常。比如: