λ λμ€(Redis)λ λ©λͺ¨λ¦¬ κΈ°λ°μ λ°μ΄ν° μ μ₯μμ΄λ€. ν€-λ°Έλ₯(key-value) λ°μ΄ν° ꡬ쑰μ κΈ°λ°ν λ€μν ννμ μλ£ κ΅¬μ‘°λ₯Ό μ 곡νλ©°, λ°μ΄ν°λ€μ μ μ₯ν μ μλ μ μ₯μμ΄λ€. μ΅μ λ²μ μ λ λμ€λ PUB/SUB ννμ κΈ°λ₯μ μ 곡νμ¬ λ©μΈμ§λ₯Ό μ λ¬ν μ μλ€. μ¦, λ°μ΄ν° μ μ₯ λΏλ§ μλλΌ λ€μν λͺ©μ μΌλ‘ μ¬μ©ν μ μλ€.λ λμ€λ λ©λͺ¨λ¦¬μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° λλ¬Έμ μ μ₯ 곡κ°μ μ μ½μ΄ μμ΄, μ£Όλ‘ λ³΄μ‘° λ°μ΄ν° μ μ₯μλ‘ μ¬μ©νλ€. μ΄λ₯Ό 극볡νκΈ° μν΄ λ λμ€ ν΄λ¬μ€ν° κΈ°λ₯μ μ 곡νκ³ μμ΄ μ μ₯ 곡κ°μ νμ₯ν μ μλ€. λν μ μ₯λ λ°μ΄ν°λ₯Ό μꡬμ μΌλ‘ λμ€ν¬μ μ μ₯ν μ μλ λ°±μ κΈ°λ₯μ μ 곡νλ―λ‘ μ ν리μΌμ΄μ μ μ£Ό μ μ₯μλ‘λ μ¬μ©ν μ μλ€. λν λ©λͺ¨λ¦¬μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° λλ¬Έμ λΉ λ₯Έ μ²λ¦¬ μλκ° μ₯μ μ΄λ€. λ λμ€ λ΄λΆμμ λͺ λ Ήμ΄λ₯Ό μ²λ¦¬νλ λΆλΆμ μ±κΈ μ€λ λ μν€ν μ²λ‘ ꡬνλμ΄ μλ€. λ©ν° μ€λ λ μν€ν μ²λ³΄λ€ κ΅¬μ‘°κ° λ¨λ¨νκ² μ€κ³λμ΄ μ¬λ¬ μ₯μ μ΄ μλ€. - “μ€νλ§ λΆνΈλ‘ κ°λ°νλ MSA μ»΄ν¬λνΈ - κΉλ³λΆ“
Install Redis or Redis Stack
How to install your preferred Redis flavor on your target platform
redis.io
Redisλ?
- Key-Value ꡬ쑰μ μ μ₯μ (In-Memory DB)
- λΉμ ν λ°μ΄ν°λ₯Ό μ μ₯, κ΄λ¦¬νκΈ° μν μ€νμμ€ κΈ°λ°μ NoSQL
- μΉ μλ²μ λΆλ΄μ νκΈ°μ μΌλ‘ μ€μ΄κ³ κ³ μμΌλ‘ λ°μ΄ν°λ₯Ό μ 곡ν μ μκ² ν¨
- DB(λ°μ΄ν°λ² μ΄μ€), Cache(μΊμ), Message Queue, Shared Memory μ©μΌλ‘ μ¬μ©
In-Memory(μΈλ©λͺ¨λ¦¬)λ?
μ»΄ν¨ν°μ μ£ΌκΈ°μ΅μ₯μΉμΈ RAM(λ¨)μ λ°μ΄ν°λ₯Ό μ μ¬νμ¬ μ¬μ©νλ λ°©λ²μΌλ‘, RAMμ λ°μ΄ν°λ₯Ό μ μ₯νκ² λλ©΄ λ©λͺ¨λ¦¬ λ΄λΆμμ μ²λ¦¬κ° λλ―λ‘, λ°μ΄ν°λ₯Ό μ μ₯ λλ μ‘°νν λ νλλμ€ν¬λ₯Ό μ€κ³ κ°λ κ³Όμ μμμ μλ μμ€μ΄ μ€μ΄ λΉ λ₯΄κ² λ°μ΄ν°μ μ κ·Ό κ°λ₯
- νμ§λ§, μλ²μ λ©λͺ¨λ¦¬ μ©λμ μ΄κ³Όνλ λ°μ΄ν°λ₯Ό μ²λ¦¬ν κ²½μ° RAMμ νΉμ±μΈ 'νλ°μ±'μ λ°λΌ λ°μ΄ν°κ° μ μ€λ μ μμ
μΌλ°μ μΈ DBλ λ°μ΄ν°λ₯Ό λμ€ν¬μ μ§μ μ μ₯(Write)νκΈ° λλ¬Έμ μλ²μ λ¬Έμ κ° λ°μνμ¬ λ€μ΄λλλΌλ λ°μ΄ν°κ° μμ€λμ§ μμ§λ§, λ§€λ² λμ€ν¬μ μ κ·Όν΄μΌ νκΈ° λλ¬Έμ μ¬μ©μκ° λ§μμ§μλ‘ λΆνκ° λ§μμ§κ³ μλκ° λλ €μ§λ€.
→ μΊμ μλ²λ₯Ό λμ νμ¬ μ¬μ©ν΄μΌ ν¨. μ΄λ, μΊμ μλ²λ‘ μ΄μ©ν μ μλ κ²μ΄ Redis.
κ°μ μμ²μ΄ μ¬λ¬ λ² λ€μ΄μλ Redisλ₯Ό μΊμλ‘ μ΄μ©νλ©΄ λ§€λ² DBλ₯Ό κ±°μΉμ§ μμλ λλ―λ‘(μΊμ μλ²μμ νμν λ°μ΄ν°λ₯Ό κ°μ Έμ΄) DBμ λΆνλ₯Ό μ€μ΄κ³ μλλ₯Ό λΉ λ₯΄κ² μ μ§ν μ μλ€.
Redisμ νΉμ§
1. λ€μν λ°μ΄ν° νμ μ§μ
λ λμ€λ λ€μν ννμ μλ£ κ΅¬μ‘°λ₯Ό μ 곡νλ€. κΈ°λ³Έμ μΌλ‘ ν€-κ°(Key-Value) ννμ ꡬ쑰λ₯Ό μ¬μ©νλ©°, Valueκ° μ¬μ©νλ μλ£ κ΅¬μ‘°μ λ°λΌ μ¬λ¬ κΈ°λ₯μ μ΄μ©ν μ μλ€. μ¦, μ΄λ€ ννμ μλ£ κ΅¬μ‘°λ₯Ό μ¬μ©νλλΌλ Keyλ νμμ΄λ€.
- String : λ¬Έμμ΄ λ°μ΄ν°λ‘, λ¨μ μ¦κ° μ°μ°μΌλ‘ μ¬μ© κ°λ₯νλ€. (INCR, INCRBY, INCRBYFLOAT, HINCRBY, HINCRBYFLOAT, ZINCRBY)
- Bitmap : λΉνΈ μ°μ° κ°λ₯
- List : 리μ€νΈ λ°μ΄ν°λ‘, 리μ€νΈ μμ΄ν μ Linked List ννλ‘ μ°κ²°λλ€.
- Hashe : ν΄μ λ°μ΄ν°λ‘, ν΄μ νλ(Field)μ κ°(Value)μΌλ‘ ꡬμ±λλ€. ν΄μ λ°μ΄ν°λ λ λμ€ ν€μ λ§€νλλ―λ‘ κ°μ μμ±νκ±°λ μ‘°ννλ €λ©΄ λ λμ€ ν€μ νλλ₯Ό λμμ μ¬μ©ν΄μΌ νλ€.
- Set : μ€λ³΅μ νμ©νμ§ μλ μ§ν©
- Sorted Set(Zset) : μ€μ½μ΄ κ°μ μ¬μ©νμ¬ μ λ ¬ κΈ°λ₯μ μ 곡νλ Set
- Hyperloglog : μ§ν©μ λ°μ΄ν° κ°μλ₯Ό μΆμ ν μ μλ μκ³ λ¦¬μ¦ μ΄λ¦μ΄μ μ΄λ₯Ό μ¬μ©ν μ μλ λ λμ€ μλ£ κ΅¬μ‘°. λΉνΈ ν¨ν΄μ λΆμνμ¬ λΉκ΅μ μ νν μΆμ κ°(μ€μ°¨ 0.81%)μ κ³μ°ν μ μλ€.
- Stream : λ λμ€ 5.0λΆν° μ 곡νλ κΈ°λ₯μΌλ‘, μ΄λ²€νΈμ± λ‘κ·Έλ₯Ό μ²λ¦¬ν μ μλ€.
2. λ°μ΄ν° λ°±μ κΈ°λ₯
μΈλ©λͺ¨λ¦¬ μ μ₯μμ νλ°μ±μΌλ‘ μΈν΄ λ°μ΄ν°κ° μ μ€λ κ²½μ°λ₯Ό λ°©μ§νμ¬ λ°±μ κΈ°λ₯μ μ 곡νλ€.
- μΌλΆ λ°μ΄ν° μμ€μ μν₯μ λ°μ§ μλ κ²½μ° (μΊμλ‘λ§ μ¬μ©ν λ) = RDB
- μ₯μ μν© μ§μ κΉμ§μ λͺ¨λ λ°μ΄ν°κ° 보μ₯λμ΄μΌ νλ κ²½μ° = AOF
- κ°λ ₯ν λ΄κ΅¬μ±μ΄ νμν κ²½μ° = RDB + AOF (μΌλ°μ μΌλ‘ λμ μ¬μ©)
- λ§€μΌ Nμλ§λ€ RDB μ€λ μ·μ μμ±νκ³ , RDB μμ± μ΄ν λ³κ²½λλ λ°μ΄ν°λ AOFλ‘ λ°±μ νλ λ°©μ
1) RDB (Redis DataBase; Snapshotting)
λ©λͺ¨λ¦¬μ μλ λ°μ΄ν° μ 체μμ μ€λ μ·μ μμ±νκ³ , μ΄λ₯Ό λμ€ν¬λ‘ μ μ₯νλ λ°©μμ΄λ€. μ¦, μκ°μ μΌλ‘ λ©λͺ¨λ¦¬μ μλ λ΄μ© μ 체λ₯Ό λμ€ν¬μ λ΄μ μꡬμ μΌλ‘ μ μ₯νλ€.
- νΉμ μκ°λ§λ€ μ¬λ¬ κ°μ μ€λ μ·μ μμ±νκ³ , λ°μ΄ν°λ₯Ό 볡μν΄μΌ νλ€λ©΄ μ€λ μ· νμΌμ κ·Έλλ‘ λ‘λ©νλ€.
- μ€λ μ· μ΄ν λ³κ²½λ λ°μ΄ν°λ 볡ꡬν μ μλ λ°μ΄ν° μ μ€ λ¬Έμ κ° μ‘΄μ¬νλ€.
2) AOF (Append Only File)
λ λμ€μ λͺ¨λ Write, Update μ°μ°λ€μ λͺ¨λ λ‘κ·Έ νμΌμ κΈ°λ‘νλ λ°©μμ΄λ€. μ¦, λ°μ΄ν°κ° λ³κ²½λλ μ΄λ²€νΈκ° λ°μνλ©΄ μ΄λ₯Ό λͺ¨λ λ‘κ·Έμ μ μ₯νλ€.
- λ°μ΄ν°λ₯Ό μμ±, μμ , μμ νλ μ΄λ²€νΈλ₯Ό μ΄ λ¨μλ‘ μ·¨ν©νκ³ λ‘κ·Έ νμΌμ μμ±νλ€.
- λͺ¨λ λ°μ΄ν° λ³κ²½ κΈ°λ‘μ 보κ΄νκ³ μμΌλ―λ‘ μ΅μ λ°μ΄ν° μ 보λ₯Ό λ°±μ ν μ μλ€.
- RDB λ°©μμ λΉν΄ λ°μ΄ν° μ μ€λμ΄ μ μ§λ§(μ΄ λ¨μ λ°μ΄ν°λ μ μ€λ μ μμ), λ‘λ© μλκ° λλ¦¬κ³ νμΌ ν¬κΈ°κ° ν° λ¨μ μ΄ μ‘΄μ¬νλ€.
Redis λ°±μ λ°©μ μ€μ
1) RDB
- μλ : redis.conf νμΌμ SAVE μ΅μ μ€μ (μκ° κΈ°μ€)
- μλ : redis-cliμμ BGSAVE λͺ λ Ή μ΄μ©νμ¬ μλμΌλ‘ RDB νμΌ μ μ₯ (μ±κΈ μ€λ λμ΄λ―λ‘ SAVE 컀맨λ μ¬μ© μ νμΌμ μ μ₯νλ λμ λ€λ₯Έ μμ μ΄ λΆκ°νλ―λ‘ SAVEλ μ¬μ©νμ§ λ§ κ²)
2) AOF
- μλ : redis.conf νμΌμ auto-aof-rewrite-percentage μ΅μ μ€μ (ν¬κΈ° κΈ°μ€)
- μλ : redis-cliμμ BGREWRITEAOF λͺ λ Ή μ΄μ©νμ¬ μλμΌλ‘ AOF νμΌ μ¬μμ±
3. μ±κΈ μ€λ λ
λ λμ€λ μ¬μ©μκ° μ€νν λͺ λ Ήμ΄λ€μ μ΄λ²€νΈ 루ν(Event Loop) λ°©μμΌλ‘ μ²λ¦¬νλ€. ν΄λΌμ΄μΈνΈκ° μ€νν λͺ λ Ήμ΄λ€μ Event Queueμ μ μ¬νκ³ μ±κΈ μ€λ λλ‘ νλμ© λΉ λ₯΄κ² μ²λ¦¬νλ κ².
1) μ₯μ
- λ©ν° μ€λ λ νκ²½μ΄ μλκΈ° λλ¬Έμ μλμ κ°μ μ₯μ μ΄ μ‘΄μ¬νλ€.
- Context Switch(λ¬Έλ§₯ κ΅ν)κ° λ°μνμ§ μμ ν¨μ¨μ μΌλ‘ μμ€ν 리μμ€λ₯Ό μ¬μ©ν μ μλ€.
- Deadlock(κ΅μ°© μν)μ΄ λ°μνμ§ μλλ€.
- Race Condition(κ²½μ μν)μ΄ λ°μνμ§ μλλ€.
Race Conditionμ΄λ?
곡μ μμμ λν΄ μ¬λ¬ νλ‘μΈμ€κ° λμμ μ κ·Όμ μλν λ, νμ΄λ°μ΄λ μμ λ±μ΄ κ²°κ³Όκ°μ μν₯μ μ€ μ μλ μνλ‘ λ κ°μ μ€λ λκ° νλμ μμμ λκ³ μλ‘ μ¬μ©νλ €κ³ κ²½μνλ μν©μμ λ°μνλ€. κ²½μ μν λ°μ μ νλ‘κ·Έλ¨μ μΌκ΄μ±κ³Ό μ νμ±μ ν΄μΉ μ μμ΄ μ£Όμν΄μΌ νλ€.
2) λ¨μ
- μ±κΈ μ€λ λμ΄λ―λ‘ μ 체 λ°μ΄ν° μ€μΊκ³Ό κ°μ΄ μ€λ²ν€λκ° ν° λͺ
λ Ήμ μ²λ¦¬νλ λμ λ€λ₯Έ λͺ
λ Ήμ μ²λ¦¬ν μ μλ€.
- λ€λ₯Έ λͺ λ Ήμ μ΄λ²€νΈ νμ μ μ₯λ μνλ‘ λκΈ°νλ―λ‘ μλ΅ μλκ° μ νλλ€.
Redis μ¬μ© μ μ£Όμμ
1. μκ° λ³΅μ‘λ
λ λμ€λ μ±κΈ μ€λ λ(Single Thread)λ₯Ό μ¬μ©νλ―λ‘, ν λ²μ νλμ λͺ λ Ήλ§ μνν μ μμ΄ μ²λ¦¬ μκ°μ΄ κΈ΄ μμ²μλ μ₯μ κ° λ°μν μ μλ€.
2. λ©λͺ¨λ¦¬ λ¨νΈν
ν¬κ³ μμ λ°μ΄ν°λ₯Ό ν λΉνκ³ ν΄μ νλ κ³Όμ μμ λ©λͺ¨λ¦¬μ ννΈνκ° λ°μνμ¬ μλ΅ μλκ° λλ €μ§ μ μλ€.
λ©λͺ¨λ¦¬ λ¨νΈν(Memory Fragmentation)λ?
RAMμμ λ©λͺ¨λ¦¬λ₯Ό ν λΉ, ν΄μ νλ κ³Όμ μμ μ κ·Έλ¦Όκ³Ό κ°μ΄ λΆλΆμ μΌλ‘ λΉμ΄ μλ 곡κ°μ΄ μκΈ°λλ°, μ λ©λͺ¨λ¦¬ ν λΉ μ μ¬μ© κ°λ₯ν λ©λͺ¨λ¦¬κ° μΆ©λΆν μ‘΄μ¬νμ§λ§ λ©λͺ¨λ¦¬ ν¬κΈ°λ§νΌμ 곡κ°μ΄ μμ΄ λ©λͺ¨λ¦¬ λλΉκ° 컀μ§λ λ¬Έμ
- λ¨νΈν νμμ΄ μ§μλλ©΄, μ€μ 물리(Physical) λ©λͺ¨λ¦¬ ν¬κΈ°κ° μ»€μ Έ νλ‘μΈμ€κ° μ£½λ νμμ΄ λ°μν μ μμ΄ λ λμ€ μ¬μ© μ λ©λͺ¨λ¦¬λ₯Ό μ λΉν μ μ§νλ κ²μ΄ μ€μνλ€.
3. μ£ΌκΈ°μ μΈ λͺ¨λν°λ§
λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λ무 λ§μΌλ©΄ λ λμ€ μλ²μ μ±λ₯ μ νλ μ₯μ λ‘ μ΄μ΄μ§ μ μμ΄ μ£ΌκΈ°μ μΈ λͺ¨λν°λ§μ ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν΄μΌ νλ€.
Redis μ ν¨ κΈ°κ°
λ λμ€μ μ μ₯λλ λͺ¨λ λ°μ΄ν°λ μ ν¨ κΈ°κ°μ μ€μ ν μ μλ€. μ ν¨ κΈ°κ°μ΄ μ§λ λ°μ΄ν°λ λ©λͺ¨λ¦¬μμ μμ λμ΄ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλ€. λ λμ€λ λ€μν λ°©λ²μΌλ‘ μ΄ μ ν¨ κΈ°κ°μ μ€μ κ°λ₯νλ€.
- EXPIRE λͺ λ ΉμΌλ‘ μ΄λ―Έ μμ±λ λ°μ΄ν°μ μ ν¨ κΈ°κ° μ€μ
- λ°μ΄ν° μμ± μ EX μ΅μ μ¬μ©νμ¬ μμ±κ³Ό λμμ μ ν¨ κΈ°κ° μ€μ (μλ£κ΅¬μ‘°μ λ°λΌ μ§μνμ§ μμ μ μμ)
λ λμ€λ λ©λͺ¨λ¦¬μ λ°μ΄ν°λ₯Ό μ μ₯νλ―λ‘ μ μ₯ 곡κ°μ΄ νμ μ μ΄μ΄μ, μ ν¨ κΈ°κ°μ μ€μ νλ κ²μ΄ κΆμ₯λλ€. μ ν¨ κΈ°κ°μ μ€μ νμ§ μμΌλ©΄ λ°μ΄ν°λ₯Ό μ§μ μμ ν λκΉμ§ μμν μ μ§(μμμ±)λλ―λ‘ μ ν¨ κΈ°κ°μ μ€μ νμ.