Spring Data Redis(Repositories-Time To Live)

本文详细介绍了如何在Redis中利用TimeToLive特性为数据设置过期时间。包括如何通过注解方式设置过期时间、监听过期事件及其实现原理。探讨了不同场景下过期时间的设置方法及其对应用的影响。

Time To Live

存储在Redis 中的Objects 可能只在一定时间能有效。这种机制对那些希望短期存活的Objects 特别有用,当它们的生命周期结束时不用手动移除。过期时间以秒为单位,可以通过@RedisHash(timeToLive=…​) 或KeyspaceSettings (see Keyspaces)来设置。

还有更多灵活的过期时间设置方法,如在使用一个数值属性或方法上添加@TimeToLive 注解。但是在同一个类中不能同时给一个方法和一个属性都设置@TimeToLive 注解。

Example 16. Expirations

public class TimeToLiveOnProperty {

  @Id
  private String id;

  @TimeToLive
  private Long expiration;
}

public class TimeToLiveOnMethod {

  @Id
  private String id;

  @TimeToLive
  public long getTimeToLive() {
    return new Random().nextLong();
  }
}
如果给一个属性明确的添加了@TimeToLive 注解,它将从Redis 读取真实的TTL 或PTTL 值。-1 则表示该object 没有关联过期时间。

仓储的实现确保了对Redis 键空间通知的订阅,使用的是RedisMessageListenerContainer 。

当过期时间设置为一个正数时,相应的EXPIRE 命令会被执行。此外还会持久化一个原始的、有名无实的备份(非原始)在Redis中,并设置5分钟过期时间。这么做是为了使仓储的支持以下功能:当一个key 过期甚至当原始的值已经不存在时,还可以通过Springs ApplicationEventPublisher 来发布拥有过期时间的RedisKeyExpiredEvent 。过期事件将会被接收,被所有使用Spring Data Redis 仓储连接的应用接收。

默认情况下,在初始化应用时key 的过期监听器是不可用的。启动模式可以调整,通过@EnableRedisRepositories 或 RedisKeyValueAdapter 来启动应用的监听器,或者在第一次insert 一个实体时带着TTL。查看EnableKeyspaceEvents 来获取它的有效值。

RedisKeyExpiredEvent 将拥有一个真实过期领域对象的拷贝,key也一样。

过期事件监听器的启动延迟或不可用,将会影响RedisKeyExpiredEvent 的发布。一个不可用的事件监听器不能发布过期事件。由于延迟的监听器初始化,一个延迟的启动会丢失事件。

在Redis中,如果没有设置notify-keyspace-events,keyspace 通知消息监听器会更改它。如果已经存在了则不会被覆盖,为了不让它空着,可以让用户来创建。请注意CONFIG在AWS ElastiCache 上有缺陷,使用监听器会导致error。

Redis 的Pub/Sub 消息不是持久化的。如果当应用宕掉的时候一个key 过期了,过期事件将不会被处理,这将会导致二级索引中仍然包含着过期对象的引用。
D:\jdk\jdk-17\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:65274,suspend=y,server=n -agentpath:D:\IDEA2024.3.6\lib\async-profiler\amd64\libasyncProfiler.dll=version,jfr,event=wall,interval=10ms,cstack=no,file=C:\Users\32435\IdeaSnapshots\JiGouDaoYanApplication_2025_10_04_024325.jfr,dbghelppath=D:\IDEA2024.3.6\lib\async-profiler\amd64\dbghelp.dll,log=C:\Users\32435\AppData\Local\Temp\JiGouDaoYanApplication_2025_10_04_024325.jfr.log.txt,logLevel=DEBUG -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" -javaagent:D:\IDEA2024.3.6\plugins\java\lib\rt\debugger-agent.jar -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -classpath C:\Users\32435\Desktop\app\jigoudiaoyan\target\classes;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-data-redis-reactive\3.5.6\spring-boot-starter-data-redis-reactive-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter\3.5.6\spring-boot-starter-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-logging\3.5.6\spring-boot-starter-logging-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\ch\qos\logback\logback-classic\1.5.18\logback-classic-1.5.18.jar;D:\apply\apache-maven-3.9.9\Repository\ch\qos\logback\logback-core\1.5.18\logback-core-1.5.18.jar;D:\apply\apache-maven-3.9.9\Repository\org\apache\logging\log4j\log4j-to-slf4j\2.24.3\log4j-to-slf4j-2.24.3.jar;D:\apply\apache-maven-3.9.9\Repository\org\apache\logging\log4j\log4j-api\2.24.3\log4j-api-2.24.3.jar;D:\apply\apache-maven-3.9.9\Repository\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;D:\apply\apache-maven-3.9.9\Repository\jakarta\annotation\jakarta.annotation-api\2.1.1\jakarta.annotation-api-2.1.1.jar;D:\apply\apache-maven-3.9.9\Repository\org\yaml\snakeyaml\2.4\snakeyaml-2.4.jar;D:\apply\apache-maven-3.9.9\Repository\io\lettuce\lettuce-core\6.6.0.RELEASE\lettuce-core-6.6.0.RELEASE.jar;D:\apply\apache-maven-3.9.9\Repository\redis\clients\authentication\redis-authx-core\0.1.1-beta2\redis-authx-core-0.1.1-beta2.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-common\4.1.127.Final\netty-common-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-handler\4.1.127.Final\netty-handler-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-resolver\4.1.127.Final\netty-resolver-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-buffer\4.1.127.Final\netty-buffer-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-transport-native-unix-common\4.1.127.Final\netty-transport-native-unix-common-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-codec\4.1.127.Final\netty-codec-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\netty\netty-transport\4.1.127.Final\netty-transport-4.1.127.Final.jar;D:\apply\apache-maven-3.9.9\Repository\io\projectreactor\reactor-core\3.7.11\reactor-core-3.7.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\reactivestreams\reactive-streams\1.0.4\reactive-streams-1.0.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\data\spring-data-redis\3.5.4\spring-data-redis-3.5.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\data\spring-data-keyvalue\3.5.4\spring-data-keyvalue-3.5.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\data\spring-data-commons\3.5.4\spring-data-commons-3.5.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-tx\6.2.11\spring-tx-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-oxm\6.2.11\spring-oxm-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-context-support\6.2.11\spring-context-support-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-web\3.5.6\spring-boot-starter-web-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-json\3.5.6\spring-boot-starter-json-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.19.2\jackson-datatype-jdk8-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.19.2\jackson-datatype-jsr310-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.19.2\jackson-module-parameter-names-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-tomcat\3.5.6\spring-boot-starter-tomcat-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\apache\tomcat\embed\tomcat-embed-core\10.1.46\tomcat-embed-core-10.1.46.jar;D:\apply\apache-maven-3.9.9\Repository\org\apache\tomcat\embed\tomcat-embed-websocket\10.1.46\tomcat-embed-websocket-10.1.46.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-web\6.2.11\spring-web-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-beans\6.2.11\spring-beans-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\io\micrometer\micrometer-observation\1.15.4\micrometer-observation-1.15.4.jar;D:\apply\apache-maven-3.9.9\Repository\io\micrometer\micrometer-commons\1.15.4\micrometer-commons-1.15.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-webmvc\6.2.11\spring-webmvc-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-context\6.2.11\spring-context-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-expression\6.2.11\spring-expression-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-devtools\3.5.6\spring-boot-devtools-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot\3.5.6\spring-boot-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-autoconfigure\3.5.6\spring-boot-autoconfigure-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\com\mysql\mysql-connector-j\9.4.0\mysql-connector-j-9.4.0.jar;D:\apply\apache-maven-3.9.9\Repository\org\projectlombok\lombok\1.18.40\lombok-1.18.40.jar;D:\apply\apache-maven-3.9.9\Repository\jakarta\xml\bind\jakarta.xml.bind-api\4.0.2\jakarta.xml.bind-api-4.0.2.jar;D:\apply\apache-maven-3.9.9\Repository\jakarta\activation\jakarta.activation-api\2.1.4\jakarta.activation-api-2.1.4.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-core\6.2.11\spring-core-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-jcl\6.2.11\spring-jcl-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\com\alibaba\druid-spring-boot-3-starter\1.2.23\druid-spring-boot-3-starter-1.2.23.jar;D:\apply\apache-maven-3.9.9\Repository\com\alibaba\druid\1.2.23\druid-1.2.23.jar;D:\apply\apache-maven-3.9.9\Repository\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus-spring-boot3-starter\3.5.7\mybatis-plus-spring-boot3-starter-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus\3.5.7\mybatis-plus-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus-annotation\3.5.7\mybatis-plus-annotation-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\org\mybatis\mybatis\3.5.16\mybatis-3.5.16.jar;D:\apply\apache-maven-3.9.9\Repository\com\github\jsqlparser\jsqlparser\4.9\jsqlparser-4.9.jar;D:\apply\apache-maven-3.9.9\Repository\org\mybatis\mybatis-spring\3.0.3\mybatis-spring-3.0.3.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus-spring-boot-autoconfigure\3.5.7\mybatis-plus-spring-boot-autoconfigure-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-jdbc\3.5.6\spring-boot-starter-jdbc-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\com\zaxxer\HikariCP\6.3.3\HikariCP-6.3.3.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-jdbc\6.2.11\spring-jdbc-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus-extension\3.5.7\mybatis-plus-extension-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\com\baomidou\mybatis-plus-core\3.5.7\mybatis-plus-core-3.5.7.jar;D:\apply\apache-maven-3.9.9\Repository\cn\hutool\hutool-all\5.8.34\hutool-all-5.8.34.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-security\3.5.6\spring-boot-starter-security-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\spring-aop\6.2.11\spring-aop-6.2.11.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\security\spring-security-config\6.5.5\spring-security-config-6.5.5.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\security\spring-security-core\6.5.5\spring-security-core-6.5.5.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\security\spring-security-crypto\6.5.5\spring-security-crypto-6.5.5.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\security\spring-security-web\6.5.5\spring-security-web-6.5.5.jar;D:\apply\apache-maven-3.9.9\Repository\io\jsonwebtoken\jjwt-api\0.11.5\jjwt-api-0.11.5.jar;D:\apply\apache-maven-3.9.9\Repository\io\jsonwebtoken\jjwt-impl\0.11.5\jjwt-impl-0.11.5.jar;D:\apply\apache-maven-3.9.9\Repository\io\jsonwebtoken\jjwt-jackson\0.11.5\jjwt-jackson-0.11.5.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\core\jackson-databind\2.19.2\jackson-databind-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\core\jackson-annotations\2.19.2\jackson-annotations-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\jackson\core\jackson-core\2.19.2\jackson-core-2.19.2.jar;D:\apply\apache-maven-3.9.9\Repository\org\springframework\boot\spring-boot-starter-validation\3.5.6\spring-boot-starter-validation-3.5.6.jar;D:\apply\apache-maven-3.9.9\Repository\org\apache\tomcat\embed\tomcat-embed-el\10.1.46\tomcat-embed-el-10.1.46.jar;D:\apply\apache-maven-3.9.9\Repository\org\hibernate\validator\hibernate-validator\8.0.3.Final\hibernate-validator-8.0.3.Final.jar;D:\apply\apache-maven-3.9.9\Repository\jakarta\validation\jakarta.validation-api\3.0.2\jakarta.validation-api-3.0.2.jar;D:\apply\apache-maven-3.9.9\Repository\org\jboss\logging\jboss-logging\3.6.1.Final\jboss-logging-3.6.1.Final.jar;D:\apply\apache-maven-3.9.9\Repository\com\fasterxml\classmate\1.7.0\classmate-1.7.0.jar;D:\apply\apache-maven-3.9.9\Repository\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;D:\IDEA2024.3.6\lib\idea_rt.jar com.drh.jigoudiaoyan.JiGouDaoYanApplication 已连接到地址为 ''127.0.0.1:65274',传输: '套接字'' 的目标虚拟机 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.5.6) 2025-10-04T02:43:26.757+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] c.d.jigoudiaoyan.JiGouDaoYanApplication : Starting JiGouDaoYanApplication using Java 17.0.12 with PID 8244 (C:\Users\32435\Desktop\app\jigoudiaoyan\target\classes started by 32435 in C:\Users\32435\Desktop\app\jigoudiaoyan) 2025-10-04T02:43:26.764+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] c.d.jigoudiaoyan.JiGouDaoYanApplication : No active profile set, falling back to 1 default profile: "default" 2025-10-04T02:43:26.812+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2025-10-04T02:43:26.812+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' 2025-10-04T02:43:27.868+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2025-10-04T02:43:27.872+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2025-10-04T02:43:27.911+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 18 ms. Found 0 Redis repository interfaces. 2025-10-04T02:43:29.116+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 80 (http) 2025-10-04T02:43:29.146+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-10-04T02:43:29.146+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.46] 2025-10-04T02:43:29.224+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2025-10-04T02:43:29.228+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2414 ms 2025-10-04T02:43:30.071+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource 2025-10-04T02:43:30.250+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited 2025-10-04T02:43:31.039+08:00 ERROR 8244 --- [JiGouDaoYan] [ restartedMain] c.b.m.core.MybatisConfiguration : mapper[com.drh.jigoudiaoyan.mapper.UserMapper.selectByUsername] is ignored, because it exists, maybe from xml file _ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.5.7 2025-10-04T02:43:32.104+08:00 WARN 8244 --- [JiGouDaoYan] [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: eaeed08f-8c7e-4924-8bc8-ac401b383778 This generated password is for development use only. Your security configuration must be updated before running your application in production. 2025-10-04T02:43:32.131+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager 2025-10-04T02:43:33.940+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2025-10-04T02:43:34.056+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 80 (http) with context path '/' 2025-10-04T02:43:34.083+08:00 INFO 8244 --- [JiGouDaoYan] [ restartedMain] c.d.jigoudiaoyan.JiGouDaoYanApplication : Started JiGouDaoYanApplication in 7.903 seconds (process running for 8.998)
最新发布
10-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值