본문 바로가기
트러블슈팅

Redis사용시, 발생하는 데이터 정합성 문제

by sangyunpark99 2024. 10. 1.

 

Redis를 사용하면서 겪은 데이터 정합성 문제 해결 과정을
작성한 글입니다.

 

 

문제 상황

게시물을 새로 등록을 하고, 조회를 한뒤 기존 게시물을 업데이트하고,

다시 조회를 해보니 업데이트된 게시물이 조회되는 것이 아닌, 업데이트 이전 게시물이 조회가 되는 상황

 

문제 원인

게시물이 업데이트되었을 때, Redis에 저장된 데이터는 동기화되지 않으므로, 데이터 정합성 문제가 발생할 수 있다. 데이터베이스의 게시물 내용이 변경되었지만, Redis는 여전히 이전 데이터를 반환할 수 있어 최신 상태가 유지되지 않는다.

 

문제 해결 방법

게시물을 업데이트할 때, 해당 게시물과 관련된 Redis에 저장된 캐시 데이터를 삭제하여, 다음 조회 시 최신 데이터가 반영되도록 한다.

 

@CacheEvict(value = "getPostsByCategory", key = "'getPostsByCategory' + #request.category + #request.postId")
@Transactional
public PostDto update(final String userId, final PostUpdateRequest request) {

    userRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND));

    Post post = postRepository.findById(request.getPostId()).orElseThrow(() -> new NotFoundPostException(POST_NOT_FOUND));

    final String title = request.getTitle() == null ? post.getTitle() : request.getTitle();
    final String content = request.getContent() == null ? post.getContents() : request.getContent();

    post.update(title, content, post.getType());

    return post.toDto();
}

 

@CacheEvict을 사용해서, 해당 메서드가 호출되면 지정해준 key값을 가진 데이터를 redis에서 지워준다.

 

 

실행 결과

1. 게시물 등록후, 조회

 

2. 게시물 수정

 

3. 수정한 게시물 조회

 

Redis 조회