JisooPyo / KP3C-backoffice-project

스레드와 트위터를 참고하여 SNS 사이트를 만들어보고 백오피스까지 구현해보는 프로젝트
1 stars 2 forks source link

Redis 도입해보기 #47

Closed jungeun5-choi closed 1 year ago

jungeun5-choi commented 1 year ago

jpa connection -> redis 연결이 쉬움 (redis는 따지고보면 DB가 아니라서)

redis와 session 관리는 찰떡이다!

redis 서버와 AWS 웹서버 배포를 동시에 진행하는 경우

jungeun5-choi commented 1 year ago

Redis 관련 공식 문서

Redis에 대한 참고 자료

jungeun5-choi commented 1 year ago

Redis 기본 세팅

build.gradle

dependencies {
    // redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

application.properties

#redis
spring.data.redis.lettuce.pool.max-active=10
spring.data.redis.lettuce.pool.max-idle=10
spring.data.redis.lettuce.pool.min-idle=2
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password={requirepass}

WebSecurityConfig

.requestMatchers("/redis/**").permitAll() // redis test용 임시 허가

테스트 결과

image

JisooPyo commented 1 year ago

기록 잘하시는거 진짜 배워야겠네요 헉소리나네.. 멋있습니다

jungeun5-choi commented 1 year ago

문제점 1

redis에 entity 자체를 저장하는 것은 비효율적이다.

해결(하려고 시도하는) 과정

  1. 저장하려는 정보를 명확히 할 것

    • 내가 저장하려는 정보는 무엇인가?
  2. 피드를 불러오려면 #51

    • 피드를 불러오는 조건? → 나 + 내가 팔로우한 사람
      • 나(=로그인 한 회원)와 내가 팔로우한 사람의 id가 필요
      • 작성한 게시글의 id 필요
  3. 그럼 redis에 내가 팔로우한 사람들의 id를 저장하자

  4. data type은 뭐가 좋을까? 개발자를 위한 레디스 튜토리얼 01

    • List / Lists 명령어 리스트
      • Lists는 key와 value가 일 대 다 관계
      • Blocking 기능을 이용해 Event Queue로 사용할 수 있음

참고

JisooPyo commented 1 year ago

아앗 entity로 들어가는 구조가 아닌가보군요

jungeun5-choi commented 1 year ago

아앗 entity로 들어가는 구조가 아닌가보군요

mysql이랑 연결할 때 entity 자체를 직렬화(serialize)해서 저장하는 방법이 보편적인 거 같은데 그렇게 하면 entity 자체를 저장하게 되는게 아닌가 하는 생각이 들더라고요 (제가 이해를 잘못한 걸 수도 잇음...)

그래서 일단 이 방식으로 해서 성공하면 새롭게 리팩터링을 할지, 아니면 처음부터 꺾어서 갈지...를 고민하고 있어요 ㅋㅋ

JisooPyo commented 1 year ago

그 redis 고수 튜터님한테 슬랙으로 dm을 보내서 조언을 구해보는 건 어떠신가요!

jungeun5-choi commented 1 year ago

그 redis 고수 튜터님한테 슬랙으로 dm을 보내서 조언을 구해보는 건 어떠신가요!

자료 좀 더 찾아보고 답 없으면 저녁 시간에 한 번 보내봐야겠어요!! 감사해요 ㅎㅎ

jungeun5-choi commented 1 year ago
jungeun5-choi commented 1 year ago

타임라인(피드) 1 :

내가 작성한 글을 redis에 저장하기

풀리퀘스트

jungeun5-choi commented 1 year ago

문제점 2

id만 저장하면 결국 데이터를 받아올 때는 DB를 조회하게 된다

value는 Dto를 사용해서 저장해보자

[Springboot] '최근 읽은 글' Dto로 Redis에 저장하고 조회하기 AtoZ

jungeun5-choi commented 1 year ago

타임라인(피드) 2:

  • value 값에 id 대신 Dto 저장

풀리퀘스트

jungeun5-choi commented 1 year ago

redis-cli 데이터 조회 명령어

  1. redis 캐시 메모리 접근
    > auth {password}
    > auth abcde
  2. 전체 key 확인
    > keys *
  3. key를 활용해 value 확인하는 법
    > LRANGE {key} {start_index} {end_index}
    > LRANGE 1 0 5
  4. redis에서 데이터 전체 삭제
    > flushall
jungeun5-choi commented 1 year ago

문제점 3

타임라인은 어떻게 만들어야하는가?

Feed => 내가 쓴 글, 내가 팔로우한 회원이 쓴 글 표시

  1. DB에 정보를 저장하는 경우
    • 요청이 들어올 때 DB만 보여주면 됨
  2. Redis를 사용해 캐시에 정보를 저장하는 경우
    • 데이터를 갱신하거나 DB와 싱크를 맞춰야할 때 - 스케줄러를 추가해야함
      • 튜터님 曰: 배보다 배꼽이 더 커지는 것 아닌가?
    • 그리고 시간도 없음!!

타임라인(피드)는 DB로 구현하는 것을 최우선으로...

문제점 4

Feed(피드, 타임라인) 엔티티는 어떤 정보를 가지고 있어야 하는가?

Feed => 내가 쓴 글, 내가 팔로우한 회원이 쓴 글 표시

생각하고 있는 순서...

  1. 회원 생성 → Feed 생성 (user_id value = feed_id value)

    • 이러면 Feed 주인 (= user_id)을 따로 저장하지 않아도 된다.
    • 그래도 안전하려면 저장하는게...
  2. 누군가를 팔로우 → 팔로우한 회원의 Post를 List<Post>에 추가

    • List = 표시할 글 전체
      • 무한정 늘릴 수는 없으니 개수 제한을 두거나...
      • 순서 정렬은 Paging을 사용 -> created_at이나 post_id를 기준으로
  3. 나 혹은 다른 회원이 글을 작성

    • Post DB에 저장
    • Redis Cache에도 저장
    • Feed DB에는 언제 저장될까?
      1. 내가 누군가를 팔로우 했을 때
      2. 내가 글을 썼을 때