μ΄λ²μ£Ό λ©ν λ§ μ λ©ν λκ»μ λ΄κ° λ§λ Redis Cache + Scheduler + Spring Batchλ₯Ό μ΄μ©ν Updateμ²λ¦¬ λ‘μ§ κ΄λ ¨ν΄μ
λμμ μ¬λ¬ μλ²κ° μ κ·Όνλ©΄ μ΄λ»κ² λ κ² κ°λμ? λΌλ μ§λ¬Έμ λμ Έμ£Όμ ¨κ³ λ©ν λ§ μ§μ κΉμ§ ν΄λΉ λ‘μ§μ λ§λ€μ΄λ΄λλ°μ κΈκΈνλ λλ
ππ» Redisμλ²λ₯Ό κ° λ‘컬μ μμ±νλ€λ©΄ μ무 λ¬Έμ κ° μμ§ μμκΉμ© ? μ΄λΌκ³ λλ΅μ νμλ€.
μ κΈ°λ€ μΈλͺ μ΄ μ€λ½κΈ° νλ κ°μ§κ³ μΈμ°κ³ μλλ° μ΄κ±Έ μ΄λ»κ² μ¬μ΄μ’κ² λλ μ λλλ‘ ν μ μμκΉ? λν μ§λ¬Έμ
μ€λ½κΈ°λ₯Ό μΈκ°λ₯Ό λλ©΄ λμ§ μλμ?μ λ΅λ³μ ν μ μ
λλ΅μ΄ νλ Έλ€κ³ ν μλ μμ§λ§ λμμ± μ μ΄ λΆλΆμ μμ μκ°λ μνκ±Έ λ°λ‘ λ€ν¬μ μλ ꡬ문μ΄μλ€
γ γ γ γ γ γ γ γ γ γ γ γ γ γ
κ·Έλμ νλ° λ¦μμ§λ§ μ±λ₯ κ°μ μ μν΄μ 곡λΆν΄λ³΄λ λΆμ°λ½ κΈ°λ² πͺπ»
π λΆμ°λ½
: μλ²κ° μ¬λ¬λμΈ μν©μμ λμΌν λ°μ΄ν°μ λν λκΈ°νλ₯Ό 보μ₯νκΈ° μν΄μ μ¬μ©
: μλ²κ° νλκ° μλλΌ μ¬λ¬λμΈ κ²½μ° μ¬λ¬ μλ²λ‘ APIκ° λΆμ° νΈμΆλκ² λλ€
: μλ²λ€κ°μ λκΈ°νλ μ²λ¦¬κ° νμνκ³ , μ¬λ¬ μλ²μ 곡ν΅λ λ½μ μ μ©ν΄μΌ νκΈ° λλ¬Έμ λΆμ°λ½μ μ¬μ©νλ€.
ππ» μ΄λ€ κ²½μ°μ λΆμ°λ½ μ¬μ©μ΄ νμν κΉ? λμμ 2κ°μ νΈλμμ μ΄ νλμ λ μ½λμ μ κ·Όνλ κ²½μ° κ°μ λ μ½λ λ²μ μ κ°κ² λλλ°, μ΄λ 2κ°μ νΈλμμ μ΄ λμμ λ°μ΄ν°λ₯Ό λ³κ²½νλ€λ©΄ ν νΈλμμ μμ λ³κ²½ν λ°μ΄ν° λ³κ²½κ° κ²°κ³Όλ μμ΄λ²λ¦¬κ³ μ°μ μ μΌλ‘ μ²λ¦¬ ν νΈλμμ μ κ²°κ³Όλ§ λ¨κ²λκ±°λ, λ§μ§λ§μΌλ‘ μ²λ¦¬ν κ²°κ³Όλ§ λ¨κ² λλ€ .. ! μν©μ λ°λΌ λ§μ§λ§ κ²°κ³Όλ§ λ°μλλ©΄ λλ κ²½μ°μλ λΆμ°λ½ μ²λ¦¬λ₯Ό λ³λλ‘ ν΄μ£Όμ§ μμλ λμ§λ§, μ²λ¦¬λ νΈλμμ μ κ²°κ³Όκ° μ΄νμ νΈλμμ μ κ²°κ³Όμλ μν₯μ΄ μλ€λ©΄ νΈλμμ μ΄ μμ°¨μ μΌλ‘ μ²λ¦¬ λμ΄μΌνλ€. |
μ¬λ¬κ°μ§ κΈ°μ μ€ λμμ μμ²μ΄ μλ μμ μ΄ λλ½λμ§ μκ³ , μ μμ μΌλ‘ μ²λ¦¬ λμ΄μΌνλ€λ λΆλΆμ μ΄μ μ λ§μΆλ€λ©΄
μ¬μ©ν μ μλ κΈ°μ λ€μ μλμ κ°λ€.
- JPA Version λ°©μμ νμ©ν λκ΄μ λ½(Optimistic Locking)
- MySQLμ User Lock νμ©νκΈ°
- Redis Java Client μ€μ νλμΈ Redissonμ RLockμ νμ©νκΈ°
1) λκ΄μ λ½(Optimistic Locking)
λκ΄μ λ½μ μ΄μ ν¬μ€ν μ λ΄μ©μ²λΌ μΆ©λμ κ°μ§νμ¬ μΆ©λμ΄ λ°μν κ²½μ° μ¬μλνκ±°λ, μΆ©λμ΄ λ°μν λ°μ΄ν°μ λν΄μ λ‘€λ°±νλ μμ μ λ³λλ‘ κ΅¬νν΄μΌνλ€.
2) Mysqlμ User Lock
μ¬μ©μκ° νΉμ λ¬Έμμ΄μ Lockμ κ±Έ μ μλ LockμΌλ‘ μ΄λ ν μμ μ΄ μ€λκ±Έλ¦°λ€λ©΄ μμ μκ°λ§νΌ Lockμ μμ νλ κΈ°λ²
Connetion Poolκ³Ό Lockμ νλνλ DB Connetion Poolμ λΆλ¦¬νλ μμ μ΄ νμνλ€.
3) Redis κΈ°λ° λΆμ°λ½
- Lettuce Clientμ λΆμ°λ½ κΈ°λ² :
- Lockμ νμμμμ΄ μ§μ λμ΄μμ§ μμ
- μ€νλ½μ μ¬μ©ν ꡬν κΈ°λ²μΌλ‘ λ½μ νλνμ§ λͺ»ν κ²½μ° Redisμκ² λ½μ νλνκΈ° μν΄ κ³μ μμ²μ 보λ΄μ μλ² λΆν λ°μ
- Lock-Unlockνλ κ³Όμ μ΄ μμ£Ό 짧μμ λ½ νλ κ²½μ°κ° λλ¬Έ κ²½μ°μλ μ μ©ν¨
- Redisson Clientμ λΆμ°λ½ κΈ°λ² :
- Lockμ νμμμμ μ§μ ν μ μμ΄μ 무νμ λκΈ° μνλ‘ λΉ μ§ μ μλ μνμ΄ μμ
- pub/subλ°©μμ μ¬μ©νλ―λ‘ μ€νλ½μ μ¬μ©νμ§ μμ
-> λ½μ΄ ν΄μ λλ©΄ λ½μ subscribeνλ ν΄λΌμ΄μΈνΈμκ² λ½μ΄ ν΄μ λμλ€λ μ νΈλ₯Ό 보λ΄μ€
-> ν΄λΌμ΄μΈνΈλ€μ λμ΄μ λ½ νλ νμΈ μμ²μ redisλ‘ λ³΄λ΄μ§ μμ
π 0. λ³μ²¨ | μ€νλ½
: μ€νλ½μ λ½μ κ±Έμ§ λͺ»νλ©΄ 무ν 루νλ₯Ό λλ©΄μ κ³μ λ½μ μ»μΌλ €κ³ μλνλ λκΈ°ν κΈ°λ²
: 'μ‘°κΈλ§ κΈ°λ€λ¦¬λ©΄ λ°λ‘ μΈ μ μλλ° κ΅³μ΄ Context SwitchingμΌλ‘ λΆνλ₯Ό μ€ νμκ° μλ?'λΌλ 컨μ μΌλ‘ κ°λ°λ κΈ°λ²
: λ½μ μ»μ§ λͺ»ν κ²½μ° μ¬μ§μκ³ κ³μ λ½μ μ»μΌλ €λ μλλ₯Ό νκΈ° λλ¬Έμ λ½νλ κ²½μ°κ° μ¦μ κ²½μ° μλ²μ λ§μ λΆνλ₯Ό μ€
: Lock-Unlockνλ κ³Όμ μ΄ μμ£Ό 짧μμ λ½ νλ κ²½μ°κ° λλ¬Έ κ²½μ°μλ μ μ©ν¨
κ²°λ‘
- CPUλ νλμ μ½μ΄λ§ μλ κ²½μ°μλ μ μ©νμ§ μμ
- μ€νλ½μ κΈ°λ³Έμ μΌλ‘ 무ν for루νλ₯Ό λλ©΄μ Lockμ κΈ°λ€λ¦¬λ―λ‘ νλμ μ€λ λκ° lockμ μ€λ«λμ κ°μ§κ³ μλ€λ©΄,
λ€λ₯Έ Blockingλ μ€λ λλ busy Waitingμ νλ―λ‘ CPUλ₯Ό μΈλμμ΄ λλΉνκ² λ¨
( Busy Waiting = 무ν 루νλ₯Ό λλ©΄μ μ΅λν λ€λ₯Έ μ€λ λμκ² CPUλ₯Ό μ보νμ§ μλ κ² )
Redis μλ²λ₯Ό μ΄λ―Έ ꡬμΆν΄λμκΈ° λλ¬Έμ Redisμ λ κΈ°λ² μ€μ κ³ λ―Όν΄λ³΄λ©΄ λ κ² κ°μλ°
μ΄λ€ Lock κΈ°λ²μ μ¬μ©νλκ² λ§μμ§ μ‘°κΈ λ κ³ λ―Όμ΄ νμν κ² κ°λ€ π€
'π JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λμμ± μ μ΄ Chap 1 | λΉκ΄μ λ½, λκ΄μ λ½ ? (0) | 2023.01.24 |
---|---|
JPA | JPA With Native Query (0) | 2022.12.14 |
JPA | μ°κ΄κ΄κ³ (0) | 2022.12.08 |