spring-data-redis - 我们如何使用 Spring Boot 为 Redis Hash 配置 TTL?

标签 spring-data-redis

我正在尝试在 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/

相关文章:

java - Spring Data Store Redis——使用多个缓存

RedisMessageListenerContainer : SubscriptionTask aborted with exception: ClassCastException

redis - 动态创建 RedisTemplate 以连接不同的 Redis 服务器

java - Redis Pub/Sub 与 Spring Data Redis : Messages arrive in wrong order

redis - Spring Data Redis 和 Jedis 兼容性问题

spring - 在redis中查看集合数据类型内部的CLI命令是什么

redis - Spring Data 对 Redis BRPOPLPUSH 的支持

hash - spring-data-redis (opsForHash) 和 hgetall 一样吗?

java - 使用 Spring Data Redis 连接到多个 Redis 服务器

java - 如果 Redis 宕机,Springboot 无法启动