Post

[Spring] Redis에 TTL(Time-To-Live) 설정

Redis에 TTL(Time-To-Live) 설정

  • Redis에 이전 채팅 내역을 저장하다 보면 점점 쌓이는 데이터가 많고 그대로 두면 CPU가 넘친다
  • 프론트단이랑 30일을 채팅 메시지 보관 기간으로 설정했기 때문에
  • 기간이 지난 내역은 서버에서 삭제 되도록 구현해야 한다

  • 이전에는 수동으로 Redis 저장된 정보를 클러스터 단위로 비워줬다
  • 물론 Key별로 비우는 것도 가능! (현 프로젝트에서는 챌린지 방 id 값들이 key값들로 설정 돼있음

  • redis-eroomchallenge-001 데이터베이스를 비우기
1
FLUSHDB
  • ChatRoomRepository에서 Redis에 직접 채팅 내역을 저장할 때 TTL도 같이 설정하자

ChatRoomRepository 에 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Slf4j
@Repository
@Component
public class ChatRoomRepository {

    private final RedisTemplate<String, Object> redisTemplate;
    private final ListOperations<String, Object> listOperations;

    private static final String CHAT_ROOM_PREFIX = "chat_room:";

    /**
     * ChatRoomRepository의 생성자
     *
     * @param redisTemplate Redis 연동을 위한 RedisTemplate 객체
     */
    public ChatRoomRepository(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
        this.listOperations = redisTemplate.opsForList();
    }

    /**
     * challengeId에 해당하는 채팅방의 채팅 내역을 불러오는 메서드
     *
     * @param challengeId 채팅 내역을 가져올 채팅방의 고유 식별자
     * @return 채팅 내역을 담은 리스트
     */
    public List<Object> getChatHistory(String challengeId) {
        String key = CHAT_ROOM_PREFIX + challengeId;
        return listOperations.range(key, 0, -1);
    }

    /**
     * challengeId에 해당하는 채팅방에 채팅 메시지를 저장하는 메서드
     *
     * @param challengeId 채팅 메시지를 저장할 채팅방의 고유 식별자
     * @param chatMessage 저장할 채팅 메시지 객체
     */
    public void saveChatMessage(String challengeId, ChatMessage chatMessage) {
        String key = CHAT_ROOM_PREFIX + challengeId;
        listOperations.rightPush(key, chatMessage);

        // 키의 TTL을 30일로 설정
        redisTemplate.expire(key, Duration.ofDays(30));
    }
  • TTL(Time-To-Live)은 데이터가 Redis에 저장된 이후에 유지되는 시간을 나타낸다
  • 만료되면 Redis는 해당 데이터를 삭제한다

  • ChatRoomRepository**에서는 Redis에 직접 채팅 내역을 저장하고 있으며
  • Redis에 저장된 데이터의 TTL을 30일로 설정하는 것이고 이를 통해 Redis는 해당 데이터를 30일 동안 유지한 후에 자동으로 삭제한다
This post is licensed under CC BY 4.0 by the author.