๐ฅ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค/Redis
[Redis] ch.18 ๋์์ฑ ๋ฌธ์ ์ดํดํ๊ณ ํด๊ฒฐํ๊ธฐ
by OR15A
2024. 1. 28.
https://github.com/HongHyeongJu/StudySpace/blob/main/database/Redis/Redis_%ED%95%99%EC%8A%B5%EB%85%B8%ED%8A%B8_05.md
์ ๋ฐ๋ฏธ Redis : ๊ฐ๋ฐ์๋ฅผ ์ํ Redis ์๋ฒฝ ๊ฐ์ด๋
ch.18 - ๋์์ฑ ๋ฌธ์ ์ดํดํ๊ณ ํด๊ฒฐํ๊ธฐ
๋์์ฑ ๋ฌธ์ ๋ค์๋ณด๊ธฐ
- ์
์ฐฐ ์ํฉ์์ $10๋ก ๋ณ๊ฒฝํ๊ณ ๋๋ฉด key๋ณ๊ฒฝ์ผ๋ก ์ธํด์ $15 ์
์ฐฐ ์์ฒญ์ ํธ๋์ญ์
์ด ์ทจ์๋จ
- ์ด๋ฐ ์ํฉ์ ๋ํ ์๋ฃจ์
- ์ ํจํ ํธ๋์ญ์
์ด ์คํจํ์ ๊ฒฝ์ฐ ์ฌ์๋ ๋งค์ปค๋์ฆ์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๊ธฐ
- ๋ธ๋ก ์ ์ฒด๊ฐ WATCH ์ค๋ฅ๋ก ์ธํด ์คํจํด๋ ๋ค์ ์คํ์ ์๋ํ ์ ์์
- ๋ฌธ์ ์
- ์ด ์ ๊ทผ๋ฒ์ ์ฝ๊ฒ ํ์ฅํ ์ ์์. WATCH ๋ช
๋ น์ด๋ฅผ ์ฐ๋ฉด Redis ์๋ฒ๊ฐ ๋๋ ค์ง
- ์ด๊ฑธ ์ฌ์๋ํ๋ฉด ์ ๋ณด๋ฅผ ๋ฐ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์์ฒญ์ผ๋ก ์ธํด Redis ์๋ฒ์ ์ถ๊ฐ์ ์ธ ๋ถํ๋ฅผ ๊ฐํ๊ฒ๋จ
- WATCH๋ ๋๋ฌด ๋ง์ ์์ฒญ์ด ์ ์
๋๋ฉด ํธ๋์ญ์
์ด ๋๋ฌด ๋ง์ด ์คํจํ๊ฒ๋จ
๋์จํ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ๋ ์ฝ๊ฐ ๋ ์ฐ์ํ ๋์์ฑ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- Redis ์์์ ์ด๋ค ๊ฐ์ ์
๋ฐ์ดํธํ๋ ค๋, ํน์ ์ฝ๊ธฐ ์์
์ ํ๊ณ ์ฐ๊ธฐ ์์
์ ํ๋ ค๋ ๋ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์ ๋ ์ค์ง ํ ํ๋ก์ธ์ค๋ง ์ด๋ค ์์ ์ ์ด๋ค ๊ฐ์ ์์ ํ ์ ์๋๋ก ํ๊ธฐ
- lock์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ด์ฉํ๋ฉด ๋จ
- ํ๋ก์ธ์ค 1์ด๋ ํ๋ก์ธ์ค 2๊ฐ ์ด ํด์์ ์ฐ๊ณ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์
๋ฐ์ดํธํ๋ ค๊ณ ํ๋ฉด
- ๋จผ์ Redis์์ ์์ฃผ ํน์ํ ํค๋ฅผ ์ค์ ํ๊ธฐ(๋ณ๋์ ํค, ํค ์ด๋ฆ์ ์๊ด ์์)
- ๊ฐ์ ํค ์ด๋ฆ์ผ๋ก ๋ฌด์์ ๋จ์ด๋ฅผ ์ ์ฅํ๋๋ก ํจ + NX ์ต์
๋ถ์ฌ์!
- ๋จผ์ ๋์ฐฉํ ์์ฒญ์ด SET ๋ช
๋ น์ด ์ ์ก - > HASH์ ์์
๊ฐ๋ฅํจ (์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ผ๋ ค๊ณ ํ๋ ๊ฑด, ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ฝ๊ธฐ๋ฅผ ํ๊ณ ์ด์ด์ ์ฐ๊ธฐ ์์
์ ํ๋ ๊ฒ)
- ๋๋ฒ์งธ๋ก ๋์ฐฉํ ์์ฒญ์ SET ๋ช
๋ น์ ์คํจํจ
- ์ด๋ค ์์ ์์ ํ๋ก์ธ์ค 1์ด ๋ชจ๋ ์์
(์ฝ๊ธฐ/์ฐ๊ธฐ)์ ๋ง๋ฌด๋ฆฌ -> lock:item:a1์ ์ ์ฅ๋ ํค๋ฅผ ์ญ์
- ํ๋ก์ธ์ค 2๊ฐ SET ๋ช
๋ น์ ์ ์กํ๊ณ ์ฑ๊ณตํ๊ฒ ๋๊ณ , ํ๋ก์ธ์ค 2๊ฐ item:a1์ ๋ํ ๋ฐฐํ์ ์ธ ์ ๊ทผ๊ถ์ ๊ฐ๊ฒ ๋จ!
- lock์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ด์ฉํด์, ์ค์ง ํ ํ๋ก์ธ์ค๋ง ์ด๋ค ์์ ์ ์ด๋ค ์ฃผ์ด์ง ํค์ ๊ด๋ จ๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์์
๋๋ ์ฑ
์์ ๊ฐ๋๋ก ํ ์ ์์
Redlock์ ๋จ์ํ ๋ฒ์ ์์
- Redlock์ ์ด์ ๋ฑ๊ธ์ ๋์์ฑ ์ ๊ธ ์๊ณ ๋ฆฌ์ฆ
Redlock์ ๋จ์ํ ๋ฒ์ ํจ์ ๊ตฌํ
- ๋จ์ํ ๋ฒ์
- ์ธ์1: ํค(์ ๊ทธ๋ ค๋ ๋์)
- ์ธ์2: ์ฝ๋ฐฑํจ์(์ ๊ธ์ ์ฑ๊ณตํ ๋ค์ ์คํํ ๋ชจ๋ ๋
ผ๋ฆฌ ๊ตฌํํ๊ธฐ. ํญ๋ชฉ fetching -> ๊ฒ์ฆ ์ํ -> ๋ฐ์ดํฐ ์์
)
- ์ฌ์๋ ๊ฐ๊ฒฉ
- ์ฌ์๋ ํ์
- ํด์๋ก ํ ํฐ ๋ง๋ค๊ธฐ
- ๋ฐ๋ณต๋ฌธ์ผ๋ก ์๋(ํ์ฌ ๊ฐ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ์ค์ )
- SET ์์
์ ํ ๋๋ง๋ค ์ฐ๋ฆฌ๋ Redis๊ฐ ๋ฌด์ผ ๋ฆฌํดํ๋์ง ํ์ธ -> ๊ทธ๊ฑธ acquired๋ผ๋ ๋ณ์์ ํ ๋น
- acquired๊ฐ null์ธ์ง ํ์ธ : if(!acquired)๋ผ๊ณ ํ๋ฉด ์ผ์์ ์งํ๊ณ ์ฌ์๋( await pause()๋ฅผ ํธ์ถํ๊ณ retryDelayMS ๋์ ์ผ์์ ์ง)
Redlock์ ๋จ์ํ ๋ฒ์ ์ ๋ฌธ์ ์ ํด๊ฒฐํ๊ธฐ [1] -> ์๋์ผ๋ก lock ๋ง๋ฃ ์ํค๊ธฐ
- ์ค๋ฅ๋ก ์ธํด lock์ ํ์ง ์๊ณ ํ๋ก์ธ์ค๊ฐ ๋๋๋ฒ๋ฆฌ๋ฉด ๋ค์ ์์ฒญ๋ค์ ์๋ํ์๋ฅผ ๋ชจ๋ ์์งํ๊ณ ๋๋๋ฒ๋ฆผ
- PX ์ต์
์ ์ฐ๋ฉด ์ผ์ ์๊ฐ ์ง๋๊ณ ๋ง๋ฃ๋จ
- ํจ์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฃ์ด์ ์ด๋ค ์ด์ ์์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ ๋ ๋ญ๊ฐ ์๋ชป๋๋ฉด ์ด๋ค ์ผ์ด ์์ด๋ ๊ฒฐ๊ตญ delete๋ฅผ ํธ์ถํ๊ธฐ
lock์ ๊ดํ ๋ ๋ค๋ฅธ ๋ฌธ์ [2]
- ๋ฐ์ดํฐ ํ๋ก์ธ์ฑ ๋จ๊ณ์ ์ฝ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ -> ์๋์ผ๋ก ๋ง๋ฃ๋๋ ํค๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ง์ผ ์๊ฐ์ด ์ง์ฒด๋๋ฉด ํค(lock)์ ๊ฐ์ ์ญ์ ํ๊ฒ๋จ
- ํ์ง๋ง ์์๋๋ก ์์
์ด ์งํ๋์ง ์๋ ์ผ์ข
์ ์ค๊ฐ ์ง๋๊ฐ ์์ ์๋ ์์
- ์๋ฒ๋ฅผ ๋ค๋ฃจ๊ณ Redis์ ํต์ ํ ๋๋ ์๋ฒ์์ Redis๋ก ๋ช
๋ น์ ์ ์กํ๊ณ ๊ทธ๊ฒ ์ค์ ๋ก ์ฒ๋ฆฌ๋ ๋๊น์ง ์ผ๋ง๋ ์ค๋ ๊ฑธ๋ฆด์ง์ ๋ํ ๋ณด์ฅ์ด ์ ํ ์๋ค๋ ์ ์ ์ผ๋ํด๋์ด์ผํจ
- lock ๊ฐ์ ํ์ธ ์ํ๊ณ ์ญ์ ํ๋ ๋ฌธ์
- GET์ผ๋ก lock์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ํ์ธํด์ ์ญ์ ํ๊ธฐ(๋น์ฐํ๊ฑฐ ์๋๊ฐ ๋จธ์ผ...)
์ฐ๋ฐ์ ์ธ lock ํด์ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ : lock ํด์ ์คํฌ๋ฆฝํธ ์ถ๊ฐํ๊ธฐ
- Lua ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฃผ ๊ฐ๋จํ ๋ฃจ์ ์คํฌ๋ฆฝํธ ์ฌ์ฉํ๊ธฐ
๋ฃจ์ ์คํฌ๋ฆฝํธ
- Redis์์ ๋ฃจ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ Redis๋ ๋ค๋ฅธ ์ด๋ ํ ๋ช
๋ น๋ ์ฒ๋ฆฌํ์ง ์๊ฒ๋จ
- ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ๊ฑด ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์ฒ์๋ถํฐ ๋๊น์ง ์คํ๋จ
- ์์ ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ง์ณค๊ณ lock์ ํด์ ํ ์ค๋น๊ฐ ๋์๋ค๋ฉด, ๊ณง๋ฐ๋ก delete๋ฅผ ํธ์ถํ์ง ์๊ณ ๋์ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉ
- ๋ฐฐํ์์ Node redis๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๋ฅผ ์คํ
- EVALSHA๋ฅผ ์ง์ ์คํํ์ง ์๊ณ Node redis๊ฐ ์คํ(EVALSHA, ์คํฌ๋ฆฝํธ ID ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ 1๊ฐ์ ํค์ธ lock:item:a1, ๊ทธ๋ฆฌ๊ณ ํ ํฐ์ ์ธ์๋ก ๋ฃ์ด์ฃผ๊ธฐ)
- lock:item:a1์ด๋ผ๋ KEYS[1]์ ์ ์กํ๊ณ , 'hi'๋ผ๋ ARGV[1]์ ์ ์ก
- GET('lock:item:a1')์ด 'hi'๋ผ๋ ๋ฌธ์์ด๊ณผ ๊ฐ์์ง ํ์ธํ๊ณ
- ๋ง์ผ ๊ทธ๋ ๋ค๋ฉด DEL('lock:item:a1') ์คํ
- ์ค์ ๋ก ํ๋ ์ญํ : ์ด ํ ํฐ๋ง์ ์ญ์ ํ๋๋กํจ
- ๋ง์ผ ์๋ lock ๋ง๋ฃ๊ฐ ์ด๋ฏธ ๊ฐ์
ํ๊ณ ์ด๋ฏธ ๊ทธ ๊ฐ์ ์ญ์ ํ๋ค๋ฉด ๋ฃจ์ ์คํฌ๋ฆฝํธ๋ ์๋ฌด๊ฒ๋ ์ญ์ ํ์ง ์์ ๊ฒ์
- ํ์ด๋ฐ ๋ฌธ์ ๋ก ์ธํด ์ด๊ฑธ ์ฐ๋ฐ์ ์ผ๋ก ํด์ ํ์ง ์๊ฒ๋จ
๋ง์ง๋ง์ผ๋ก ๋จ์ ๋ฌธ์
- ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ทธ ์์ ์ดํ์๋ ์๋ฌด๋ฐ ํต์ ๋ ฅ์ด ์์
- ์ฝ๋ฐฑ์ ๋ฃ์ ์ฝ๋๋ ๋ค๋ฅธ ๊ท์น์ ๋ฐ๋ผ ์์ง์ด๊ฒ ๋จ, ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ์ง์ ์ฌ๋ถ๋ฅผ ์ฐ๋ฆฌ๊ฐ ๊ฒฐ์ ํ์ง ๋ชปํจ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ ์๋ฌด๋ ๊ฒ๋ ๊ธธ์ด์ง ์๋ ์๊ณ ์งง์์ง ์๋ ์์ => ํต์ ๋ ฅ ์์
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๊ณ lock์ด ๋ง๋ฃ๋๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ทธ lock์ ํ๋ํ ์ ์์ต๋๋ค
- ๊ทธ ํ๋ก์ธ์ค๋ ํญ๋ชฉ ํด์์ ๋ํ ์๋ฒฝํ ํต์ ๋ ฅ์ ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ค์ ๋ก ๊ทธ๋ ์ง ์์
- ๋ฐ๋ผ์ ์ฝ๋ฐฑ ํจ์ ์์๋ ์ด๋ก ์ ์ผ๋ก, ์ฌ๊ธฐ์ lock์ ๋จ์ ์๊ฐ์ด ์ผ๋ง๋ ๋๋์ง, lock์ด ์์ง ์ ํจํ์ง ๋ฌป๋ ๊ฒ์ด ํ์ํจ
๋ง๋ฃ ์ ํธ ์ ๊ณตํ๊ธฐ
- signal๊ฐ์ฒด
- "์ ๊ฐ์
๋๋ค๋ง lock์ด ๋ง๋ฃ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ด์ ๋ฐ์ดํฐ ์ฐ๊ธฐ๋ฅผ ์๋ํ์ง ๋ง์ญ์์ค, ์๋๋ฉด ์ค์ ๋ก lock์ ๊ฐ๊ณ ์๋ค๋ ๊ฑธ ๋ณด์ฅํ ์ ์์ผ๋๊น์" ใ
ใ
- ๊ทธ๋ฌ๋ ์ด๊ฒ๋ ์์ ํ ํด๊ฒฐ์ ์๋
๋ง๋ฃ์ ๋ํ ๋ ๋ค๋ฅธ ํด๋ฒ Redis
- ๋๊ตฐ๊ฐ Redis ํด๋ผ์ด์ธํธ์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ lock์ด ๋ง๋ฃ๋์๋์ง ํ์ธํ๊ธฐ
- lock์ ๊ฐ๊ณ ์๋ค๋ฉด ์ค๋ฅ๋ฅผ ๋ผ ๊ฒ, ๋ง๋ฃ๋์ง ์์๋ค๋ฉด ์ฐ๋ฆฐ ๊ทธ ์ฌ๋์ด ์ก์ธ์คํ๋ ค๋ ์ด๋ค ๋ฉ์๋๋ ํธ์ถํ ์ ์๊ฒ ํ์ฉ
- ํ ... ๋์ค์ ๋ค์ ํ๋ฒ ๋ ๋ณต์ต