πŸ–₯️ λ°μ΄ν„°λ² μ΄μŠ€/Redis

[Redis] ch.16 μ „μž μƒκ±°λž˜ 앱을 ν™œμš©ν•΄ μ‹€μŠ΅ν•˜κΈ°(일뢀)

OR15A 2024. 1. 28. 00:28

https://github.com/HongHyeongJu/StudySpace/blob/main/database/Redis/Redis_%ED%95%99%EC%8A%B5%EB%85%B8%ED%8A%B8_04.md

유데미 Redis : 개발자λ₯Ό μœ„ν•œ Redis μ™„λ²½ κ°€μ΄λ“œ

ch.16 - μ „μž μƒκ±°λž˜ 앱을 ν™œμš©ν•΄ μ‹€μŠ΅ν•˜κΈ°



  • 일뢀뢄 κ±΄λ„ˆλœ€


114. λ™μ‹œμ„± 문제 μ΄ν•΄ν•˜κΈ°

  • μž…μ°° μ‹œ 같은 μš”μ²­μ΄ 왔을 λ•Œ 각자의 μ‹€ν–‰μ„ μ—μ„œ μ²˜λ¦¬ν•˜λ―€λ‘œ μ—¬λŸ¬λͺ…이 낙찰받을 수 있음
  • Redisμ—μ„œλŠ” 데이터λ₯Ό 가져와 계산 μž‘μ—…μ΄λ‚˜ 검증 μž‘μ—…μ„ μˆ˜ν–‰ν•œ λ‹€μŒ λ‹€μ‹œ Redis에 μ €μž₯ν•΄μ•Ό ν•˜λŠ” 상황이라면 μ–Έμ œλ‚˜ 이와 λΉ„μŠ·ν•œ λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 있음
  • 데이터λ₯Ό κ°€μ Έμ˜€λŠ” μ‹œμ κ³Ό Redis에 λ‹€μ‹œ μ €μž₯ 및 μ—…λ°μ΄νŠΈν•˜λŠ” μ‹œμ  사이에 λ‹€λ₯Έ μš”μ²­ λ˜λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ 좩돌이 일어날 수 μžˆμ–΄μš”
  • μ–Έμ œλ“ μ§€ 데이터λ₯Ό μ½μ–΄μ˜€κ³  + 무언가λ₯Ό μ²˜λ¦¬ν•œ λ‹€μŒ + λ‹€μ‹œ μ €μž₯ 및 μ—…λ°μ΄νŠΈν•  λ•Œ => λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  κ°€λŠ₯μ„± 있음!!!
  • λ™μ‹œμ„± 문제λ₯Ό μ§„μ§œ 문제둜 λ³Ό 건지 μ•„λ‹Œμ§€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ·œμΉ™μ— 따라 달라짐
    • ex)
    • Todo Listμ—μ„œ 'μ‹œμž‘', 'μ™„λ£Œ' μš”μ²­μ΄ κ²ΉμΉ˜λŠ” 경우 -> 큰문제 μ•„λ‹˜. λ§ˆμ§€λ§‰ μ •λ³΄λ‘œ μ—…λ°μ΄νŠΈ ν•˜κ±°λ‚˜ κΆŒν•œμ„ μ΄μš©ν•  수있음
    • λ‚™μ°° λ“± λˆκ΄€λ ¨ μ€‘μš”ν•œ λ¬Έμ œμ—μ„œλŠ” 쑰심해야함
  • λ™μ‹œμ„± 문제 해결방법 4가지
    • 2κ°€μ§€λŠ” 이번 μ±•ν„°μ—μ„œ, λ‚˜λ¨Έμ§€λŠ” ν›„λ°˜μ— μ„€λͺ…
    • [1] μžλ™ μ—…λ°μ΄νŠΈ commeand μ‚¬μš©ν•˜κΈ° (HINCRBY or HSETNX)
    • [2] WATCH λͺ…λ Ήμ–΄λ‘œ νŠΈλžœμ μ…˜ μ‚¬μš©ν•˜κΈ°
    • [3] 락 μ΄μš©ν•˜κΈ°
    • [4] LUA μ—…λ°μ΄νŠΈ 슀크립트λ₯Ό μ»€μŠ€ν…€ ν•˜κΈ°

μ›μžμ  업데이터 μ μš©ν•˜κΈ°

  • λ™μ‹œμ„± 문제의 원인
    • 데이터λ₯Ό 읽고 μ“°λŠ” 사이에 μ‹œκ°„ μ°¨κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έ
    • λ°”λ‘œ 이 μ‹œκ°„ λ™μ•ˆ λ‹€λ₯Έ μš”μ²­μ΄ μ„œλ²„λ‘œ λ“€μ–΄μ™€μ„œ ν˜„μž¬ 읽고 μžˆλŠ” 데이터λ₯Ό μ—…λ°μ΄νŠΈν•  수 있기 λ•Œλ¬Έμ—
  • νŠΉμ • λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜λ©΄ 데이터λ₯Ό μ½μ–΄μ˜€μ§€ μ•Šκ³  ν˜„μž¬ 값을 μ‚¬μš©ν•΄ μ œμžλ¦¬μ—μ„œ μ—…λ°μ΄νŠΈ ν•  수 있음
  • ν•΄κ²°ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λŠ” inStock의 μ΄ˆκΉƒκ°’μ„ ν™•μΈν•˜λŠ” 단계λ₯Ό μƒλž΅ν•˜λŠ”κ²ƒ = μ½λŠ” 단계λ₯Ό μ „λΆ€ μƒλž΅ν•˜κ³  λ°”λ‘œ μ“°λŠ” λ‹¨κ³„λ‘œ λ„˜μ–΄κ°€κΈ°
    • μ΄λ ‡κ²Œ ν•˜λ €λ©΄ β€˜HINCRBY’ λͺ…λ Ήμ–΄λ₯Ό μ“°κΈ° (ν•΄μ‹œμ— λŒ€ν•΄ μ„€λͺ…ν•  λ•Œ λ‹€λ€˜μŒ)
    • μ“°λŠ” λ™μž‘λ§Œ μˆ˜ν–‰ν•˜λ©°, μ½λŠ” λ™μž‘μ€ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŒ
  • ex) μ΄λ²ˆμ—λŠ” μ°¨λŸ‰ 색상을 κΈ°λ‘ν•˜κΈ° + ν•œ 가지 μš”κ΅¬μ‚¬ν•­(아직 색상이 μ§€μ •λ˜μ§€ μ•Šμ€ μ°¨λŸ‰μ— λŒ€ν•΄μ„œλ§Œ 색상을 지정해야함)
    • 'HSETNX'λ₯Ό μ‚¬μš©ν•˜κΈ° (HSETNX λͺ…λ Ήμ–΄λŠ” ν”„λ‘œνΌν‹°κ°€ μ„€μ •λ˜μ§€ μ•ŠλŠ” κ²½μš°μ— ν•œν•΄ 값을 섀정함)
  • HINCRBY, HSETNX λͺ…λ Ήμ–΄μ˜ 핡심
    • 이λ₯Ό μ‚¬μš©ν•΄ 읽고 μ“°λŠ” λ™μž‘ μ‚¬μ΄μ˜ μ‹œκ°„ μ°¨λ₯Ό μ™„λ²½νžˆ μ œκ±°ν•  수 있음
    • λ˜λŠ” 일정 기쀀을 λ§Œμ‘±ν•˜λŠ” κ²½μš°μ—λ§Œ μ—…λ°μ΄νŠΈλ₯Ό μˆ˜ν–‰ν•˜κ²Œν•  수 있음
  • ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—λŠ” 이 λͺ…λ Ήμ–΄λ§ŒμœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŒ
    • μž…μ°° 데이터 μƒμ„±μ‹œ HSET뿐만 μ•„λ‹ˆλΌ RPUSH도 μ‚¬μš©ν•¨
    • λ˜ν•œ 리슀트 μ²˜λ¦¬μ‹œ HSETNX 같은 λͺ…λ Ήμ–΄λŠ” 큰 도움이 λ˜μ§€ μ•ŠμŒ
    • κ·Έλž˜μ„œ νŠΈλžœμž­μ…˜μ΄ ν•„μš”ν•¨

νŠΈλžœμž­μ…˜

  • μ—¬λŸ¬ 개의 λͺ…령을 그룹으둜 λ¬Άμ–΄ 순차적으둜 싀행될 수 μžˆλ„λ‘ 보μž₯ν•΄μ€Œ
  • Redisμ—μ„œλŠ” νŠΈλžœμž­μ…˜ λ‘€λ°±κ³Ό μ·¨μ†ŒλŠ” ν•  수 μ—†μŒ(κ·Έλž˜μ„œ λ‹€λ₯Έ λ°μ΄ν„°λ² μ΄μŠ€μ— λΉ„ν•΄ νŠΈλžœμž­μ…˜μ˜ ν™œμš©λ„κ°€ 떨어짐)
  • MULTI
    • Redisμ—κ²Œ 곧 μ—¬λŸ¬ 개의 λͺ…λ Ήμ–΄λ₯Ό 보낼 κ±°κ³ , λ°”λ‘œ μ‹€ν–‰ν•˜μ§€λŠ” μ•Šμ„ κ±°λΌλŠ” 뜻
    • 쑰금 κΈ°λ‹€λ Έλ‹€κ°€ λ‚˜μ€‘μ— μ°¨λ‘€λŒ€λ‘œ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•¨
    • MULTIλ₯Ό μ‚¬μš©ν•΄μ„œ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œ λ‹€μŒμ—λŠ”, μ‹€μ œλ‘œ μ‹€ν–‰ν•  λͺ…령어듀을 전솑함
    • β€˜QUEUEDβ€™λΌλŠ” 메세지 : λͺ…λ Ήμ–΄κ°€ λŒ€κΈ°μ—΄μ— μΆ”κ°€λ˜μ–΄ 싀행을 기닀리고 μžˆμŒμ„ μ˜λ―Έν•¨
  • EXEC
    • μ‹€ν–‰ν•  λͺ…령어듀을 μ‹€μ œλ‘œ μ‹€ν–‰ν•˜κ²Œ 함

νŠΈλžœμž­μ…˜μœΌλ‘œ ν‚€ κ°μ‹œν•˜κΈ°

  • WATCH
    • Redisκ°€ νŠΉμ • 킀에 μ €μž₯된 값을 μ§€μΌœλ³΄λ„λ‘ μ§€μ‹œν•¨
    • λ‹€μŒ νŠΈλžœμž­μ…˜μ΄ μ‹€ν–‰λ˜κΈ° 전에 μ§€μΌœλ³΄λ˜ 값이 λ³€κ²½λ˜λ©΄, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ€ μžλ™μœΌλ‘œ μ‹€νŒ¨ν•¨
    • μ§€μΌœλ³΄λ˜ ν‚€κ°€ λ³€κ²½λ˜μ—ˆλ‹€λ©΄ EXECλ₯Ό ν˜ΈμΆœν•˜λŠ” μˆœκ°„ null이 λ°˜ν™˜λ¨
  • Redisμ—μ„œ 값을 μ½μ–΄μ˜¨ λ‹€μŒ, μž μ‹œ μ‹œκ°„μ„ λ“€μ—¬ 처리 μž‘μ—…μ„ μ§„ν–‰ν•˜κ³ , λ‹€μ‹œ μ“°κΈ° μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” κ²½μš°μ—λŠ” 일련의 과정을 λͺ¨λ‘ νŠΈλžœμž­μ…˜μœΌλ‘œ 감싸주고, WATCH λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜κΈ°
  • WATCH ν‚€μ›Œλ“œμ—μ„œ 자주 λ³Ό 수 μžˆλŠ” μ „ν˜•μ μΈ μ‚¬μš© νŒ¨ν„΄ μ•Œμ•„λ‘κΈ°

νŠΈλžœμž­μ…˜μš© μ—°κ²° 뢄리

  • 자주 μ‚¬μš©λ˜λŠ” νŒ¨ν„΄
    • WATCH => 데이터 κ°€μ Έμ˜€κΈ° => νŠΈλžœμž­μ…˜ μ‹€ν–‰
      • WATCH μ‹€ν–‰
      • GET, HGETALL λ“±μ˜ λͺ…λ Ήμ–΄λ‘œ Redisμ—μ„œ 데이터 κ°€μ Έμ˜€κΈ°
      • 데이터 μ²˜λ¦¬ν•˜κΈ°
      • MULTI, SET, EXEC둜 νŠΈλžœμž­μ…˜μ„ κ΅¬μ„±ν•˜κΈ°
  • 주의점
    • νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λ©΄ WATCHλ‚˜ MULTIν‚€μ›Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ Redis과의 연결을 μ™„μ „νžˆ μ μœ ν•˜κ²Œλ¨
    • ν•΄λ‹Ή 연결은 이 νŠΈλžœμž­μ…˜λ§Œ μ‚¬μš©ν•  수 있게 되고, λ‹€λ₯Έλ°μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŒ

νŠΈλžœμž­μ…˜μœΌλ‘œ 쀑볡 μž…μ°° 문제 ν•΄κ²°ν•˜κΈ°

  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°

κ°€κ²©μˆœ μ •λ ¬ & ν•¨μˆ˜ κ΅¬ν˜„

  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°
  • ν•„κΈ°