使用 spring 在 Redis 存储库中查找
FindBy in Redis Repository with spring
我想使用 Redis spring 保存和获取数据。
我只有配置文件 SOME
有 redis。我保存数据好。但是当我尝试通过方法 findByIdAndName
获取数据时,我总是有空的 Optional.
我的POJO:
@RedisHash("Some")
@Data
@AllArgsConstructor
public class SomeInfo implements Serializable {
@Id
private String id;
@Indexed
private String name;
@TimeToLive(unit = TimeUnit.DAYS)
private Long expiration;
}
我的存储库:
public interface SomeInfoRepository extends CrudRepository<SomeInfo, String> {
Optional<SomeInfo> findByIdAndName(String id, String name);
}
我有redis配置:
@Profile(Profiles.SOME)
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(RedisProperties.class)
@EnableRedisRepositories(basePackageClasses = { SomeInfoRepository.class })
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(ObjectMapper objectMapper, RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
return template;
}
@Bean(name = "someTopic")
public ChannelTopic someTopic(@Value("${app.topics.some}") String someChannel) {
return new ChannelTopic(someChannel);
}
@Bean
public RedisMessageListenerContainer roundRedisContainer(RedisConnectionFactory connectionFactory,
SomeMessageListener someMessageListener,
@Qualifier("someTopic") ChannelTopic someTopic) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(someMessageListener, someTopic);
return container;
}
}
和application.yml
spring:
redis:
host: localhost
port: 6379
ssl: false
password: some
data.redis.repositories.enabled: false
我知道数据保存正常:
keys *
1) "Some:36:idx"
2) "Some"
3) "Some:name:af0b83a2b15f018bdd404aef33bfb11f"
4) "Some:name:f5f8c3a9119bb822b0c2fde3265d37fa"
5) "Some:41:idx"
6) "Some:41:phantom"
7) "Some:36:phantom"
8) "Some:41"
9) "Some:36"
和
hgetall Some:41
1) "_class"
2) "ru.some.SomeInfo"
3) "id"
4) "41"
5) "name"
6) "af0b83a2b15f018bdd404aef33bfb11f"
7) "expiration"
8) "30"
那么,为什么我的方法 findByIdAndName
不起作用?
如果我使用方法 findById(id)
,它工作正常并且 return 数据。
您在 id
字段中缺少 @Indexed
注释。
另请参阅此问题以供参考:
我想使用 Redis spring 保存和获取数据。
我只有配置文件 SOME
有 redis。我保存数据好。但是当我尝试通过方法 findByIdAndName
获取数据时,我总是有空的 Optional.
我的POJO:
@RedisHash("Some")
@Data
@AllArgsConstructor
public class SomeInfo implements Serializable {
@Id
private String id;
@Indexed
private String name;
@TimeToLive(unit = TimeUnit.DAYS)
private Long expiration;
}
我的存储库:
public interface SomeInfoRepository extends CrudRepository<SomeInfo, String> {
Optional<SomeInfo> findByIdAndName(String id, String name);
}
我有redis配置:
@Profile(Profiles.SOME)
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(RedisProperties.class)
@EnableRedisRepositories(basePackageClasses = { SomeInfoRepository.class })
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(ObjectMapper objectMapper, RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
return template;
}
@Bean(name = "someTopic")
public ChannelTopic someTopic(@Value("${app.topics.some}") String someChannel) {
return new ChannelTopic(someChannel);
}
@Bean
public RedisMessageListenerContainer roundRedisContainer(RedisConnectionFactory connectionFactory,
SomeMessageListener someMessageListener,
@Qualifier("someTopic") ChannelTopic someTopic) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(someMessageListener, someTopic);
return container;
}
}
和application.yml
spring:
redis:
host: localhost
port: 6379
ssl: false
password: some
data.redis.repositories.enabled: false
我知道数据保存正常:
keys *
1) "Some:36:idx"
2) "Some"
3) "Some:name:af0b83a2b15f018bdd404aef33bfb11f"
4) "Some:name:f5f8c3a9119bb822b0c2fde3265d37fa"
5) "Some:41:idx"
6) "Some:41:phantom"
7) "Some:36:phantom"
8) "Some:41"
9) "Some:36"
和
hgetall Some:41
1) "_class"
2) "ru.some.SomeInfo"
3) "id"
4) "41"
5) "name"
6) "af0b83a2b15f018bdd404aef33bfb11f"
7) "expiration"
8) "30"
那么,为什么我的方法 findByIdAndName
不起作用?
如果我使用方法 findById(id)
,它工作正常并且 return 数据。
您在 id
字段中缺少 @Indexed
注释。
另请参阅此问题以供参考: