如何使用 spring boot 2.0 配置 redis ttl
Posted
技术标签:
【中文标题】如何使用 spring boot 2.0 配置 redis ttl【英文标题】:how to configure redis ttl with spring boot 2.0 【发布时间】:2019-10-18 05:55:59 【问题描述】:我在 spring boot 2.0 中使用 redis。
我希望将存储在 redis 中的数据设置为 TTL。
于是我找了个办法,写了下面的示例代码。
Person.java
@Data
@Builder
@RedisHash("Person")
public class Person implements Serializable
@Id
private Long id;
private PersonInfo info;
PersonInfo.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PersonInfo implements Serializable
private String name;
private Long age;
RedisConfig.java
@Configuration
@Slf4j
public class RedisConfig extends CachingConfigurerSupport
@Value("$spring.redis.host")
private String redisHost;
@Value("$spring.redis.port")
private int redisPort;
@Value("$spring.redis.expiretime")
private Long expireTime;
@Bean
public LettuceConnectionFactory lettuceConnectionFactory()
log.info("Info -> Lettuce Connection Factory");
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
lettuceConnectionFactory.setHostName(this.redisHost);
lettuceConnectionFactory.setPort(this.redisPort);
log.info("RedisHost -> " + lettuceConnectionFactory.getHostName());
log.info("RedisPort -> " + lettuceConnectionFactory.getPort());
log.info("ExpireTime -> " + expireTime);
return lettuceConnectionFactory;
@Bean
public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
log.info("Info -> Redis Template");
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
return redisTemplate;
@Bean
public RedisCacheConfiguration cacheConfiguration()
log.info("Info -> Redis Cache Configuration");
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(expireTime))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
cacheConfig.usePrefix();
log.info("Duration -> " + cacheConfig.getTtl().getSeconds());
return cacheConfig;
@Bean
public RedisCacheManager cacheManager()
log.info("Info -> Redis Cache Manager");
RedisCacheManager rcm = RedisCacheManager
.builder(this.lettuceConnectionFactory())
.cacheDefaults(this.cacheConfiguration())
.build();
return rcm;
PersonRedisRepository
public interface PersonRedisRepository extends CrudRepository<Person, Long>
PersonController.java
@RestController
@Slf4j
public class PersonController
@Autowired
private PersonRedisRepository personRedisRepository;
@PostMapping("/person/id")
public Person createPerson(@PathVariable("id") Long id)
log.info("Info -> CreatePerson START ================= ");
Person person = Person.builder()
.id(id)
.info(PersonInfo.builder()
.name("Test -> " + id)
.age(id + 15)
.build()
)
.build();
personRedisRepository.save(person);
Person getPerson = personRedisRepository.findById(id).get();
log.info("Info -> getPerson : " + getPerson.toString());
log.info("Info -> createPerson END ================= ");
return getPerson;
@GetMapping("/person/id")
public Person findPerson(@PathVariable("id") Long id)
log.info("Info -> FindPerson START ================= ");
Person findedPerson = personRedisRepository.findById(id).get();
log.info("Info -> findedPerson : " + findedPerson.toString());
log.info("Info -> FindPerson END ================= ");
// return findedPerson;
return null;
application.yml
spring:
# Docker Redis
redis:
host: 192.168.99.100
port: 6379
expiretime: 100
server:
port: 8083
我写了RedisConfig.java和其他代码,测试如下。
我是用Rest Client请求的
请求
GET http://localhost:8083/person/7 HTTP/1.1
redis:6379> keys *
1) "Person"
2) "Person:3"
redis:6379> hgetall Person:3
1) "_class"
2) "my.cachemanager.redis.person.domain.Person"
3) "id"
4) "3"
5) "info.name"
6) "Test -> 3"
7) "info.age"
8) "18"
redis:6379> TTL Person:3
(integer) -1
我确认数据是通过 redis-cli 存储在 redis 中的。 但是,我也确认没有应用 ttl 时间。
如何将 TTL 应用于存储在 Redis 中的数据?
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:您可以使用@TimeToLive
注解(在documentation的第8.7节中提到。它可以应用于属性或方法,(不应应用于同一类)
【讨论】:
不错的一个。这是一个(kotlin)10 分钟 TTL 示例:Object var id: String, var value: String, @TimeToLive(unit = TimeUnit.MINUTES) var timeout: Long =10
【参考方案2】:
RedisCache Manager 可以在配置缓存管理器 bean 时指定过期时间(TTL),使用以下代码:
@Bean
public RedisCacheManager cacheManager(RedisTemplate<String, Object>
redisTemplate)
RedisCacheManager redisCacheManager = new
RedisCacheManager(redisTemplate);
// Open the most key prefix with the cache name
redisCacheManager.setUsePrefix(true);
//Here you can set a default expiration time unit in seconds.
redisCacheManager.setDefaultExpiration(redisDefaultExpiration);
// Setting the expiration time of the cache
Map<String, Long> expires = new HashMap<>();
expires.put("person", 1000);
redisCacheManager.setExpires(expires);
return redisCacheManager;
【讨论】:
【参考方案3】:将此添加到您的配置中
@EnableRedisRepositories
基于文档。默认情况下,初始化应用程序时禁用密钥过期侦听器。可以在 @EnableRedisRepositories 或 RedisKeyValueAdapter 中调整启动模式,以在应用程序或第一次插入具有 TTL 的实体时启动侦听器。有关可能的值,请参阅 EnableKeyspaceEvents。
【讨论】:
以上是关于如何使用 spring boot 2.0 配置 redis ttl的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台