如何使用 Spring Data Redis 配置 Redis TTL?
一、簡介
在本快速教程中,我們將了解如何在 Spring Data Redis 中配置密鑰過期。
2.設置
讓我們創建一個基於 Spring Boot 的 API 來管理由 Redis 支持的Session
資源以實現持久性。我們需要四個主要步驟來做到這一點。有關更詳細的設置,請查看我們的 Spring Data Redis 指南。
2.1.依賴關係
首先,讓我們將以下依賴項添加到我們的pom.xml
中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.0.4</version>
</dependency>
spring-boot-starter-data-redis
將傳遞添加spring-data-redis
和lettuce-core
。
2.2. Redis 配置
其次,讓我們添加RedisTemplate
配置:
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Session> getRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Session> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
2.3.模型
第三,讓我們創建我們的Session
模型:
@RedisHash
public class Session {
@Id
private String id;
private Long expirationInSeconds;
}
2.4. Redis 存儲庫
現在,最後,讓我們創建SessionRepository,
它提供與 Redis 的交互來管理我們的Session
實體:
public interface SessionRepository extends CrudRepository<Session, String> {}
3. 方法
我們將了解設置 TTL 的三種方法。
3.1.使用RedisHash
讓我們從最簡單的開始。 @RedisHash
允許我們為其timeToLive
屬性提供一個值:
@RedisHash(timeToLive = 60L)
public class Session {
@Id
private String id;
private Long expirationInSeconds;
}
它以秒為單位獲取值。在上面的示例中,我們將過期時間設置為 60 秒。當我們想為所有Session
對象提供一個常量值 TTL 時,這種方法很有用。指定默認 TTL 也很有用。
3.2.使用@TimeToLive
在以前的方法中,我們可以為所有Session
對象設置相同的常量 TTL。我們的下一個方法允許更多的活力。使用@TimeToLive
,我們可以註釋任何數字屬性或返回數值以設置 TTL 的方法:
@RedisHash(timeToLive = 60L)
public class Session {
@Id
private String id;
@TimeToLive
private Long expirationInSeconds;
}
這允許我們為每個Session
對象動態設置 TTL。就像以前的方法一樣,TTL 以秒為單位。 TimeToLive
的值取代了 @RedisHash RedisHash(timeToLive)
。
3.3.使用KeyspaceSettings
繼續下一個方法, KeyspaceSettings
設置 TTL。鍵空間定義用於為 Redis 哈希創建實際鍵的前綴。現在讓我們為Session
類定義我們的KeyspaceSettings
:
@Configuration
@EnableRedisRepositories(keyspaceConfiguration = RedisConfiguration.MyKeyspaceConfiguration.class)
public class RedisConfiguration {
// Other configurations omitted
public static class MyKeyspaceConfiguration extends KeyspaceConfiguration {
@Override
protected Iterable<KeyspaceSettings> initialConfiguration() {
KeyspaceSettings keyspaceSettings = new KeyspaceSettings(Session.class, "session");
keyspaceSettings.setTimeToLive(60L);
return Collections.singleton(keyspaceSettings);
}
}
}
就像以前的方法一樣,我們以秒為單位指定了 TTL。這種方法與@RedisHash
非常相似。此外,如果我們不想使用@EnableRepositories
,我們可以通過編程方式設置它:
@Configuration
public class RedisConfiguration {
// Other configurations omitted
@Bean
public RedisMappingContext keyValueMappingContext() {
return new RedisMappingContext(new MappingConfiguration(new IndexConfiguration(), new MyKeyspaceConfiguration()));
}
public static class MyKeyspaceConfiguration extends KeyspaceConfiguration {
@Override
protected Iterable<KeyspaceSettings> initialConfiguration() {
KeyspaceSettings keyspaceSettings = new KeyspaceSettings(Session.class, "session");
keyspaceSettings.setTimeToLive(60L);
return Collections.singleton(keyspaceSettings);
}
}
}
4.比較
最後,讓我們比較一下我們看到的三種方法,並確定何時使用哪一種。
@RedisHash
和KeyspaceSettings,
都允許我們為所有實體實例 ( Session
) 一次性設置 TTL。另一方面, @TimeToLive
允許我們為每個實體實例動態設置 TTL。
KeyspaceSettings
提供了一種在多個實體的配置中的一個位置設置默認 TTL 的方法。另一方面,對於@TimeToLive 和@RedisHash
這將需要在每個實體類文件中發生。
@TimeToLive
的優先級最高,其次是@RedisHash
,最後是KeyspaceSettings
。
5. Redis Key過期事件
通過所有這些在 Redis 中設置密鑰過期的方法,人們可能還對此類事件發生的時間感興趣。為此,我們有RedisKeyExpiredEvent
。讓我們設置一個EventListener
來捕獲RedisKeyExpiredEvent
:
@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
@Slf4j
public class RedisConfiguration {
// Other configurations omitted
@Component
public static class SessionExpiredEventListener {
@EventListener
public void handleRedisKeyExpiredEvent(RedisKeyExpiredEvent<Session> event) {
Session expiredSession = (Session) event.getValue();
assert expiredSession != null;
log.info("Session with key={} has expired", expiredSession.getId());
}
}
}
我們現在將能夠知道Session
何時過期,並能夠在需要時採取一些行動:
2023-02-10T15:13:38.626+05:30 INFO 16874 --- [enerContainer-1] cbsconfig.RedisConfiguration:
Session with key=edbd98e9-7b50-45d8-9cf4-9c621899e213 has expired
六,結論
在本文中,我們研究了通過 Spring Data Redis 設置 Redis TTL 的各種方法。最後,我們查看了RedisKeyExpiredEvent
以及如何處理過期事件。
與往常一樣,代碼在 GitHub 上可用。