【发布时间】:2021-09-27 22:14:54
【问题描述】:
大家好,
我正在使用 Spring Boot 2.3.12.RELEASE,它在内部使用 Spring Data Redis 2.3.9.RELEASE 作为托管依赖项。
当我尝试使用 Spring Boot CRUD 存储库将对象保存到 Redis 缓存时,它被存储而没有任何错误,我可以看到通过 Redis Manager 存储的对象。
但是,当我尝试使用相同的 id 获取相同的对象时,即使用 CRUD 存储库的 findById() 方法,我无法找到它。
此外,当我在同一个 CRUDRepository 对象上尝试 findAll() 时,我得到 Optional.empty 结果,这很奇怪,因为 findAll() 应该返回存储库中存在的所有记录。
我在下面添加了配置、存储库和模型类代码以及一些屏幕截图供您阅读。
请注意:我知道这个平台上有很多与此问题相关的类似问题,我也尝试了这些问题中提到的解决方案,但这对我不起作用。 p>
这个问题的任何解决方案都会很有帮助。
模型类:
package com.test.cache.entity;
import java.util.concurrent.TimeUnit;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.TimeToLive;
import org.springframework.data.redis.core.index.Indexed;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
@RedisHash("OTPValidationLogCache")
public class OTPValidationLogCache {
@Id
@Indexed
private String id;
@Indexed
private int validationFailureCount;
@TimeToLive(unit = TimeUnit.MILLISECONDS)
private long expiry;
}
存储库:
package com.test.cache.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.test.cache.entity.OTPValidationLogCache;
@Repository
public interface OTPValidationLogCacheRepository extends CrudRepository<OTPValidationLogCache, String> {
}
Redis 配置类:
package com.test.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import java.time.Duration;
@Configuration
@EnableRedisRepositories(basePackages = "com.test")
public class RedisConfig {
public static final long REDIS_CONNECT_TIMEOUT_SECS = 10L;
@Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration() {
final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName("*******");
redisStandaloneConfiguration.setPort(6379);
redisStandaloneConfiguration.setPassword(RedisPassword.of("**********"));
//Credentials hidden for code sharing purpose.
return redisStandaloneConfiguration;
}
@Bean
public JedisConnectionFactory redisConnectionFactory() {
final JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
.connectTimeout(Duration.ofSeconds(REDIS_CONNECT_TIMEOUT_SECS))
.useSsl()
.build();
return new JedisConnectionFactory(redisStandaloneConfiguration(), jedisClientConfiguration);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
}
Redis 管理器截图:
Eclipse IDE - 调试屏幕截图:
【问题讨论】:
标签: java spring spring-boot redis spring-data-redis