我正在尝试在 RedisHash 上配置 TTL。我想为所有 key 设置相同的到期时间。
第一:我尝试在实体类上添加注释 @RedisHash(value="MyHash",timeToLive=60) 。
第二:使用 @TimetoLive 和 @RedisHash(value="MyHash",timeToLive=60) 添加一个新字段作为过期时间
@RedisHash(value = "MyHash", timeToLive = 60L)
public class MyHash {
.../attributes with few indexes
@TimeToLive
private Long expiration;
}
第三:添加了 @EnableRedisRepositories 和 KeyspaceConfiguration
@EnableRedisRepositories(basePackageClasses = MyHash.class, keyspaceConfiguration = MyKeyspaceConfiguration.class)
public class RedisConfig {
//LettuceConnectionFactory
//RedisTemplate
}
public class MyKeyspaceConfiguration extends KeyspaceConfiguration {
@Override
public boolean hasSettingsFor(Class<?> type) {
return true;
}
@Override
public KeyspaceSettings getKeyspaceSettings(Class<?> type) {
KeyspaceSettings keyspaceSettings = new KeyspaceSettings(MyHash.class, "MyHashlog");
keyspaceSettings.setTimeToLive(60L);
return keyspaceSettings;
}
}
我的存储库:
public interface MyHashRepository extends CrudRepository<MyHash, Long> {
List<MyHash> findByApplicationId(String applicationId) ;
}
以上所有方法均未设置任何过期时间。当我 checkin Redis 时,它显示 -1。
TTL MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -1
最佳答案
找到解决办法: 我们需要添加enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP属性,如下所示,
方案一:使用@RedisHash设置TTL
//Add annotation on config or Spring boot main class
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
@SpringBootApplication
public class RedisLogServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(RedisLogServiceApplication.class, args);
}
}
@RedisHash(value = "MyHash", timeToLive = 60L)
public class MyHash {
.../attributes with few indexes
@Id
private Long id;
@Indexed
private String applicationId;
}
解决方案2:使用KeySapceConfiguration设置TTL
//Add annotation on config or Spring boot main class
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceConfiguration = MyKeyspaceConfiguration.class)
@SpringBootApplication
public class RedisLogServiceApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(RedisLogServiceApplication.class, args);
}
}
//MyKeyspaceConfiguration.class to set TTL
public class MyKeyspaceConfiguration extends KeyspaceConfiguration {
@Override
public boolean hasSettingsFor(Class<?> type) {
return true;
}
@Override
public KeyspaceSettings getKeyspaceSettings(Class<?> type) {
KeyspaceSettings keyspaceSettings = new KeyspaceSettings(MyHash.class, "MyHashlog");
keyspaceSettings.setTimeToLive(60L);
return keyspaceSettings;
}
}
@RedisHash(value = "MyHash")
public class MyHash {
.../attributes with few indexes
@Id
private Long id;
@Indexed
private String applicationId;
}
存储库没有更改:
public interface MyHashRepository extends CrudRepository<MyHash, Long> {
List<MyHash> findByApplicationId(String applicationId) ;
}
Spring还将根据实体类中注释为@Indexed的属性创建多个键。但是,TTL 仅适用于主键,即@Id。例如, 当我在redis-cli中运行keys命令时
>keys MyHash*
1) MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
2) MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4
>TTL MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
(integer) 59
>TTL MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -1
//After Expiry:
>keys MyHash*
(no keys)
>TTL MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -2
关于spring-data-redis - 我们如何使用 Spring Boot 为 Redis Hash 配置 TTL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62331270/