noSql

RedisTemplate Scan

즐겁게살자 2021. 7. 15. 22:01
728x90

오늘 게시글 상세 진입시에 조회수 업데이트 성능을 위해 redis를 적용하는 작업을 했다.

게시글 조회수 성능 이슈를 검색해 보면 글들이 많은데, 대략 이렇다.

 

대량의 트래픽이 몰릴 경우 select, update가 동시에 진행 되는 화면에서 update 트랜잭션 락으로 인한

select 지연 문제, update 실행이 너무 많이 졌을때 데드락 발생.

 

인프런에서도 최근 그런 문제로 장애가 있었다며, 실장님의 지시로 조회수 처리에 redis를 도입하게 되었다.

참고 : https://webisfree.com/2017-11-13/redis%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-view-count-%EB%B0%A9%EB%AC%B8%EC%9E%90-%EC%88%98-%EA%B4%80%EB%A6%AC%ED%95%98%EB%8A%94-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-%EB%B0%A9%EB%B2%95%EC%9D%80

 

Redis를 사용한 View count, 방문자 수 관리하는 효과적인 방법은?

Python에 redis cache를 적용하면서 view count... 방문자가 올때 카운트 값을 1을 늘리기위해 데이터베이스를 업데이트하는 일이 너무 비효율적으로 보였다. 뭔가 방법이 없을까?만약 방문자의 일일 페

webisfree.com

 

조회수 증가를 바로 rdb에 하지 않고 redis에 선 저장후 일정 간격 마다 rdb에 update하는 방식.

 

구현단계는 아래와 같다.

  • 각 게시글별로 방문자수 값을 가지고 있는 redis key를 만들어 increament 를 시킴
  • redis key 는 expiretime을 준다. (나의 경우 10분)
  • 3분 마다 redis 에서 정보를 조회해와서 rdb update

그런데 고민이 생기는 부분이 생겼다.

'article:uv:{게시글번호}' 이런식으로 rediskey를 구성하였는데, redis 에서 key를 패턴 검색하는 keys article:uv* 이렇게 하려니

keys 를 쓰면 풀스캔을 하게 되고 레디스가 싱글 쓰레드라 검색 하는 동안 다른 redis 처리가 멈춘다는 정보를 이미 알고 있던 터라

scan 방식을 찾아보았다. scan 은 rdb로 치면 limit  같은 기능인듯 한다. (참고 : https://tech.kakao.com/2016/03/11/redis-scan/)

 

spring redisTemplate 에서 조회 메소드 실행시 count를 지정해도 전부 검색해서 응답해준다고 한다. 

(https://jaepils.github.io/redis/2018/11/20/redis-scan.html)

내일 테스트를 한번 해봐야 겠다.