ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Data Redis TTL설정하기
    프로젝트/선착순 쿠폰 발급 시스템 2023. 5. 20. 00:01

    TTL이란?

    컴퓨터 네트워킹 및 데이터베이스 시스템에서 사용되는 용어인 "Time To Live"의 약자입니다. 

    데이터 레코드 또는 네트워크 패킷이 삭제되거나 만료된 것으로 간주되기 전에 존재할 수 있는 시간을 나타냅니다.

     

    예를 들어, Redis 데이터베이스에서 키에 대한 TTL 값을 설정하면 지정된 시간이 경과한 후 해당 키가 데이터베이스에서 자동으로 삭제되도록 할 수 있습니다. 

    이는 메모리 사용량을 관리하고 오래되거나 오래된 데이터가 데이터베이스에서 자동으로 제거되도록 하는 데 유용합니다.

     

    네트워킹에서 TTL은 패킷이 삭제되기 전에 패킷이 통과할 수 있는 최대 홉(라우터) 수를 지정하는 패킷의 IP 헤더에 있는 필드입니다.

     패킷이 통과하는 각 라우터는 TTL 필드를 1씩 감소시키며, TTL 필드가 0에 도달하면 패킷이 삭제됩니다. 

    이는 패킷이 네트워크에서 무한정 순환하는 것을 방지하고 합리적인 시간 내에 의도한 목적지에 도달할 수 있도록 하기 위해 사용됩니다.

     

    Spring Data Redis에 TTL 설정하기

    @RedisHash(value = "mock-refresh-token", timeToLive = 1L)
    class MockRefreshTokenRedisEntity(
      @Id val id: String,
      val userId: String,
    ): Serializable {
    
    }

    간단하게 timeToLive = 1L이면 1초 뒤에 캐시에서 사라짐을 의미합니다.

     

     

    @RedisHash 어노테이션 분석

    public @interface RedisHash {
    
    	/**
    	 * The prefix to distinguish between domain types.
    	 *
    	 * @return
    	 * @see KeySpace
    	 */
    	@AliasFor(annotation = KeySpace.class, attribute = "value")
    	String value() default "";
    
    	/**
    	 * Time before expire in seconds. Superseded by {@link TimeToLive}.
    	 *
    	 * @return positive number when expiration should be applied.
    	 */
    	long timeToLive() default -1L;
    
    }

    이름을 나타내는 value와 timeToLive가 필드로 존재합니다.

    기본적으로 -1값이 세팅되어 있고 양수라면 해당 seconds(초) 뒤에 만료가 적용됩니다.

     

     

    테스트 작성

      @Test
      @Disabled("TTL 적용 테스트로 추후에는 TTL을 1초 이상으로 사용하기 때문에 Disable합니다")
      fun `Redis 캐시 만료 시간 테스트`(){
        //given
        val id = "uuid-generated"
        val userId = "userid-generated"
        val refreshToken = RefreshTokenRedisEntity(
          id = id,
          userId = userId,
        )
    
        //when
        refreshTokenRedisRepository.save(refreshToken)
        Thread.sleep(2000L)
    
        //then (TTL을 1초로 설정했다면 2초후엔 사라져 조회가 되면 안된다)
        val result = refreshTokenRedisRepository.findById(id).isEmpty
        Assertions.assertTrue(result)
      }

    저장을 했지만 sleep으로 2초를 지연시키면 TTL을 1초로 설정했기 때문에 조회가 되지 않는 테스트를 작성하였습니다.

    이후 TTL 설정을 변경하는 경우에 테스트가 실패하기 때문에 disable으로 관리합니다.

     

     

     

    참고자료

    https://www.baeldung.com/spring-data-redis-ttl

    댓글

Designed by Tistory.