Redis λΆμ° λ½
redisλ μ체μ μΌλ‘ λ½μ μ 곡νλ κΈ°λ₯μ΄ μλλΌ, Redisμ νΉμ§μΈ μμμ±κ³Ό Key-Value λ°μ΄ν° λͺ¨λΈμ νμ©ν΄ λ½ κΈ°λ₯μ ꡬννλ λ°©μμ΄λ€.
λ½μ μ€μ (Lock)
- Redisμμ κ°μ₯ λ§μ΄ μ¬μ©νλ λ½ κ΅¬ν λ©μ»€λμ¦μ SET NX(Not Exists) μ΅μ
μ νμ©νλ λ°©μμ΄λ€.
1
2Boolean acquired = redisTemplate.opsForValue() .setIfAbsent(lockKey, requestId, Duration.ofSeconds(LOCK_TIMEOUT_SECONDS));
- Key μμ± : κ³ μ μλ³ κ° lockKeyλ₯Ό μ¬μ©μκ° λ§λ€μ΄ λ½μ μμ±νλ€.
- Value μ€μ : λ½μ νλν μ¬μ©μμ κ³ μ μλ³μ(requestId)λ₯Ό μ μ₯νμ¬ λκ° λ½μ κ°μ§ μνμΈμ§ μΆμ νλ€.
- NX μ΅μ
:
SET NX
μ΅μ μ μ¬μ©νμ¬, ν΄λΉ ν€κ° μμ λλ§ λ½μ μμ±νλ€. μ΄λ―Έ μ‘΄μ¬νλ€λ©΄ μλ‘μ΄ λ½μ μμ±νμ§ μμ μΆ©λμ λ°©μ§νλ€. - TTL(λ§λ£ μκ°) : λ½μ λ§λ£ μκ°μ μ€μ (
EXμ΅μ
)νμ¬, νΉμ μκ° μ΄ν Redisκ° μλμΌλ‘ ν΄λΉ ν€λ₯Ό μ κ±°νλ€ -> λ°λλ½ λ°©μ§λ₯Ό λͺ©μ μΌλ‘
μμμ λμ
- Redisμ λͺ¨λ λͺ λ Ήμ κΈ°λ³Έμ μΌλ‘ λ¨μΌ μ€λ λλ‘, λͺ λ Ή μ€νμ΄ μμ ν λλ λκΉμ§ λ€λ₯Έ μμ²μ΄ μ²λ¦¬λμ§ μλλ€.
- μ¦ Redisλ λ½μ μμ±νλ μμ (ν€κ° μ‘΄μ¬νμ§ μμ λ μ€μ )μ μμμ μΌλ‘ μ²λ¦¬νλ―λ‘ λμμ± λ¬Έμ λ₯Ό λ°©μ§ν μ μλ€.
λ½μ ν΄μ (Unlock)
- Redis λ½μ ν΄μ νλ €λ©΄
- μμ μ λ½μΈμ§ νμΈ:
λ½ λ³΄μ ν μ¬μ©μκ° λ€λ₯Έ μ¬μ©μκ° μλ μμ μμ κ²μ¦νκΈ° μν΄,
GET
λͺ λ Ήμ μ¬μ©ν΄ Keyμ Valueλ₯Ό νμΈνλ€. - λ½ ν΄μ μλ:
- μ΄ν, μ¬λ°λ₯Έ μλ³μμΌ κ²½μ°μλ§
DEL
λͺ λ Ήμ μ¬μ©νμ¬ λ½μ ν΄μ νλ€. - λ½ ν΄μ λ λ¨κ³λ₯Ό λΆλ¦¬νμ¬
GET -> DEL
μ²λ¦¬νλ©΄ μμμ±μ΄ κΉ¨μ§ μ μλ€ - μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Lua μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ λ°©μμ μ¬μ©ν μ μλ€
- μ΄ν, μ¬λ°λ₯Έ μλ³μμΌ κ²½μ°μλ§
- μμ μ λ½μΈμ§ νμΈ:
λ½ λ³΄μ ν μ¬μ©μκ° λ€λ₯Έ μ¬μ©μκ° μλ μμ μμ κ²μ¦νκΈ° μν΄,
1 |
|
Redis λ½μ μ 체 νλ¦
μ 리ν΄μ μ 체μ μΈ νλ¦μ μμ보μ
- λ½ μμ± μλ
-
SET NX
λͺ λ Ήμ ν΅ν΄ λ½μ μμ±νλ€ - λ½μ΄ μμΌλ©΄ μμ±μ μ±κ³΅ True λ°ν
- λ½μ΄ μ‘΄μ¬νλ©΄ μμ±μ μ€ν¨ False λ°ν
-
- TTL μ€μ
- λ½μ΄ μμ±ν λ λ§λ£ μκ°(
EXμ΅μ
)μ ν¨κ» μ§μ νλ€
- λ½μ΄ μμ±ν λ λ§λ£ μκ°(
- λ½ μμ
μ€
- λ½μ μ»μ μ¬μ©μλ μμ νκ² μμ μ μννλ€
- λ½ μμ λμ€ μ₯μ κ° λ°μνλλΌλ TTL μ λ°λΌ μλμΌλ‘ ν΄μ λλ€
- λ½ ν΄μ
- μμ
μ΄ μλ£λλ©΄ λ½μ μ μ ν μ¬μ©μκ° Keyμ Valueλ₯Ό νμΈνκ³ μΌμΉνλ©΄
DEL
λͺ λ ΉμΌλ‘ ν΄μ - λ½μ΄ μ΄λ―Έ λ§λ£λμλ€λ©΄, λ€λ₯Έ μ¬μ©μκ° λ½μ μλ‘ μμ± κ°λ₯
- μμ
μ΄ μλ£λλ©΄ λ½μ μ μ ν μ¬μ©μκ° Keyμ Valueλ₯Ό νμΈνκ³ μΌμΉνλ©΄
μΏ ν° λ°κΈ νλ‘μ νΈμμ λ½ νλ ꡬν λ°©μ
λ°μ΄ν° ν΅μ μκ°μ CSMA/CDλΌλ λ°©μμ λ°°μ λ€. κ°λ¨νκ² μ€λͺ νλ©΄ μ΄λ€ λ°μ΄ν°λ₯Ό 보λ΄κΈ° μ μ μΌλ¨ λ£κ³ μ무λ μ보λΌλ 보λ΄μ΄ μΆ©λ νλ₯ μ μ€μ΄κ³ μΆ©λμ΄ λ¬λλΌλ μ§μμ μΌλ‘ backoffλ₯Ό νμ¬ μΆ©λμ΄ λ μλ‘ μ§μμ μΌλ‘ λμ΄λλ λ²μ μμμ random numberλ₯Ό 골λΌμ λμ§λ λ°©μμΌλ‘ μΆ©λμ΄ μκΈΈ λ λμνλ μΌμ’ μ λ°©λ²λ‘ κ°μ κ²μ΄λ€.
μ΄κ±Έ λ£λ μκ° μ! Redisμ λΆμ°λ½λ lockμ μ»λ κ³Όμ μμ μΆ©λμ΄ μκΈΈ μ μκ³ μ΄ λ°©λ²μ μ μ©νλ©΄ ν¨μ¨μ μΌλ‘ μ΄λ―Έ κ²μ¦λ λ°©λ²μ μ¬μ©νμ¬ μΆ©λμ ν΄κ²°ν μ μκ² λ€ λΌκ³ μκ°μ΄ λ€μ΄ λ°λ‘ μ μ©ν΄ λ³΄κΈ°λ‘ νλ€.
νμ§λ§ CSMA/CDμ λ°©μμ λͺ¨λ ꡬνν κ²μ μλλ€. μ΄μ λ νκ²½μ΄ λ€λ₯΄κΈ° λλ¬ΈμΈλ° CSMA/CDλ λ¨μΌ λ€νΈμν¬ μ±λμμ μΆ©λμ κ°μ§ λ° ν΄κ²°μ νκΈ°μ λλ€ μλμ°λ₯Ό μ μ°¨μ μΌλ‘ λλ € μΆ©λ λΉλ μ체λ₯Ό μ€μ΄λλ° μ€μ μ΄λΌλ©΄ Redis λ½μ κ²½μ° λΆμ° νκ²½μμ λμμ±μ μ μ΄λ₯Ό μν΄ μ€κ³λμκ³ , μ¬μλ νμμμκ³Ό μ§ν° μΆμλ₯Ό ν΅ν΄ λ½ μ±κ³΅ κ°λ₯μ±μ λμ΄λλ° μ€μ μ΄ μλ€.
κ·Έλμ μΆ©λ μν, μ§μμ λ°±μ€ν, λλ€ν μ΄ μΈκ°μ§μ μ΄λ€ μμ΄λμ΄λ λΉλ €μ€μ§λ§ μ΄κ²μ ꡬννλλ°λ μ°¨μ΄κ° μλ€.
- μΆ©λ κ°μ§ λ°©μ
- Redis λ½μ μΆ©λμ κ°μ§λΌκΈ° 보λ€λ κ²½ν©μν©μ΄ ν΄μλμ§ μλλ€λ©΄ μ¬μλλ₯Ό νλ€. μ΄μ§ κ°μ μ μΌλ‘ μΆ©λμ κ°μ§
- μ¬μλ λ°©μ
- Redis λ½μ μ¬μλλ₯Ό νλ€κ° μΌμ μκ°μμ λ½μ μ»μ§ λͺ»νλ©΄ μλλ₯Ό μ€λ¨νκ³ λ½ μμ± μ€ν¨λ₯Ό λ°ν
- μ΄μ λ μ΅λν λΉ λ₯Έ λ½ νλ λλ μκ° μ΄κ³Ό μμΈ μ²λ¦¬κ° μ£Όμν μꡬμ¬νμ΄κΈ° λλ¬Έμ΄λ€.
- μ§ν°μ μν
μ§ν° : μ§μ λ°±μ€νμμ λκΈ° μκ°μ μ‘°μ νκΈ° μ°ν΄ μ μ©νλ λλ€κ°
- CSMA/CDλ μΆ©λμ΄ λ§μ μλ‘ λλ€ κ°κ²© λ΄μμ μ ννλ λ²μκ° μ»€μ§λ€
- νμ§λ§ Redisλ½μ κ²½μ° λ°λλ‘ μ¬μλ νμκ° λ§μμ§μλ‘ μ§ν° λ²μλ₯Ό μ μ°¨ μ€μΈλ€
- μ΄μ λ μ΄κΈ°μλ κ²½ν©μν©μ΄ λΉκ΅μ λ§μ§λ§ μκ°μ΄ μ§λ¨μ λ°λΌ λ€λ₯Έ ν΄λΌμ΄μΈνΈλ€μ΄ μμ°μ€λ½κ² μ’ λ£(λ½ ν΄μ , TTL λ§λ£) λκΈ° λλ¬Έμ΄λ€
- μ§ν°μ μΆμλ‘ μ€νλ € λ½ νλ μ±κ³΅λ₯ μ체λ₯Ό λμ΄κ² λλ€
- λ½ ν€ μμ±
- μΏ ν°μ½λλ₯Ό κΈ°λ°μΌλ‘ μ λν¬ν ν€λ₯Ό μμ±νλ€.
- ex)
coupon:lock:COUPON123
- νμμμ(νλ μ ν μκ°) λ° λ°±μ€ν μ΄κΈ°ν μ€μ
- λ½ νλ μλ
-
λ½ νλ μ€ν¨ μ μ¬μλ
- μ¬μλ μ’
λ£ μ‘°κ±΄
-
deadline
μ΄ μ΄κ³Όλμλκ°? - μ¬μλ νμ
retryCount
κ° μ΅λμ λλ¬νλκ°?
-
- μ§μ λ°±μ€ν μ μ©
- μ€ν¨ νμμ λ°λΌ λκΈ°μκ°(
backoffTime
)μ΄ μ μ§μ μΌλ‘ μ¦κ° -
calculateBackoffTime()
μ λλ€ μ§ν°(jitter)λ₯Ό μΆκ°ν΄ μΆ©λ λ°©μ§
- μ€ν¨ νμμ λ°λΌ λκΈ°μκ°(
- λ°±μ€νλ§νΌ λκΈ° ν μ¬μλ:
- μ¬μλ νμκ° λμ΄λλ©΄ λμ΄λ μλ‘ λκΈ° μκ° μ체λ λ리 λΌ λ²μ(μ§ν°) μ체λ μ€μ¬ ν¨μ¨μ μΌλ‘ λ½ νλμ κ°λ₯ νλλ‘ κ΅¬ν
- μ¬μλ μ’
λ£ μ‘°κ±΄
μ¬μλ νμ | μΉμ(λκΈ° μκ° μ¦κ°μ¨) | μ§ν° λ²μ(%) |
---|---|---|
1ν | x1.5 | Β±15% |
2ν | x2.0 | Β±13.6% |
3ν | x2.5 | Β±12.5% |
4ν | x3.0 | Β±11.5% |
νμ ν μ€νΈλ₯Ό μ§ννλ©΄μ μ§ν° λ²μλ₯Ό μ‘°μ ν΄λ΄μΌκ² λ€.