Redis 동시성 이슈 개선하기
2022. 5. 14. 13:32
Spring
Redis에서 조회수 증가 동시성 이슈 조회수를 Redis에 캐싱하고 나중에 RDB로 write back해야하는 일이 있었다. Redis에서 해야하는 일은 게시물이 조회되면 → 해당 게시물의 id를 key로하여 조회수를 저장하는 일이다. 이슈 사항 먼저 조회수에 대한 상세 로직은 아래와 같다. Transaction1(T1)이 게시글 1번의 조회수를 조회한다. T1은 조회수를 1 증가한다. 조회수는 최종적으로 1증가 되어 Redis에 저장된다. 하지만 T2가 동시에 요청을 하면? 아래와 그림과 같은 이슈가 발생한다. T1과 T2가 조회수를 조회한 후 T1이 변경하고 T2가 변경했을 때 각자 조회한 조회수가 동일했기 때문에 동기화가 안되는 현상이다. 즉, 최종적으로는 조회수가 12가 되어야 하는 것이다. 이..
Spring Data Redis에서 O(N) 명령어인 Keys를 Scan으로 대체하기
2022. 5. 11. 15:36
기타 IT
아직 Redis에 대해서는 잘모르지만, 싱글 스레드로 동작하기 때문에 O(N)은 피해야 한다는 것을 알게 되었다. redis-cli가 아닌 Spring Data Redis의 RedisTemplate에서 어떻게 대체할 수 있는지 어떻게 대체 했는지 기록해보려고 한다. keys 명령어 → Scan 명령어로 개선하기 keys 사용할 경우 @Transactional public void updateRDB() { HashOperations hashOperations = redisTemplate.opsForHash(); Set keys = redisTemplate.keys("posts:*"); for (String key : keys) { int index = key.indexOf(":"); Long postId ..
Redis는 언제 사용해야 할까?
2022. 5. 11. 13:15
기타 IT
블로그 프로젝트의 조회수 증가를 Redis로 관리하기로 결정했다. Redis가 무엇인지 알아보고, 왜 Redis를 써야하는지와 어떻게 사용할 것인지에 대해 정리해보자. Redis 개요 Redis는 Remote Dictionary Server의 약자이다. Remote: 외부를 의미하고 Dictionary: HashMap과 같은 key - value 자료 구조 Server: 서버를 의미한다. 즉, 외부에 있는 key - value의 자료구조를 사용하는 서버이고 데이터베이스를 의미한다. 인메모리 데이터 저장소 레디스 공식 홈페이지를 보면, 이렇게 설명한다. 데이터베이스, 캐시, 스트리밍 엔진 및 메시지 브로커를 인메모리 데이터 저장소로 사용한다. 그렇다, 핵심은 인메모리이다. Cache 개념 나중의 요청에 대..