π² [ko] Management of Hierarchical Data with Redis Caching
κ³μΈ΅ν(μΉ΄ν κ³ λ¦¬ μ±) λ°μ΄ν°μ μΊμ±
Efficiently manage hierarchical data by leveraging Redis caching to improve performance and simplify maintenance. Avoid repetitive executions of high-cost queries/logic.
μ€λ ν¬μ€ν ν λ΄μ©μ κ³μΈ΅ν λ°μ΄ν°λ₯Ό λ λμ€ μΊμλ₯Ό μ΄μ©νμ¬ ν¨μ¨μ μΌλ‘ κ°μ νλ κ²½νμ λν΄μ κ°λ¨νκ² νκΈ°λ₯Ό λ¨κΈ°λ €κ³ ν©λλ€.
λ¨Όμ μ¬κΈ°μ λ§νλ κ³μΈ΅ν λ°μ΄ν°λ μλμ κ°μ΄ νλμ ν μ΄λΈ λ΄μμ, λΆλͺ¨ - μμ κ°μ κ΄κ³κ° μ μλ ννλ₯Ό μλ―Έν©λλ€.
νΉμ μμμ΄ μ£Όμ΄μ‘μ λ, μ΅μμ λΆλͺ¨λ₯Ό μμμΌ νλ κ²½μ°κ° λ°μνλ€λ©΄ μ΄λ»κ² λ‘μ§μ νμ΄λ΄λ κ² μ’μκΉμ?
Mysql μμ μ 곡νλ μ¬κ·μ CTE λ₯Ό μ¬μ©νλ©΄ μ΄λ¨κΉμ?
μ΅κ·Όμ Real Mysql 2 κΆ μ€ν°λλ₯Ό μ§ννκ³ μλ κΉμ νλ² μ¬κ·μ CTE 쿼리λ₯Ό μμ±ν΄λ³ΌκΉμ!?
with recursive cte as (
select id, name, parent_id, id as root_id
from category
where parent_id is null
union all
select child.id,
child.name,
child.parent_id,
root.root_id
from category child
inner join cte root
on child.parent_id = root.id)
select cte.id, cte.name, root_id
from cte
μμ κ°μ μΏΌλ¦¬λ‘ μ½κ² ꡬνν μ μκ² κ΅°μ!
νμ§λ§, QueryDsl, JPA μμλ μ¬κ·μ CTE λ₯Ό 곡μμ μΌλ‘ μ 곡νκ³ μμ§ μμΌλ―λ‘
@Query μ΄λ Έν μ΄μ λ΄μμ 쿼리λ₯Ό λ¬Έμμ΄λ‘ μ μμ±ν΄μ λ€μ΄ν°λΈ μΏΌλ¦¬λ‘ μ€νν΄λλ‘ ν΄μΌλ§ νκ² μ£ .
νμ§λ§ μ΄ λ°©λ²μ λ¬Έμμ΄λ‘ 쿼리λ₯Ό μμ±νλ€λ³΄λ,
쿼리μ μ€λ₯κ° μμμ΄λ μ»΄νμΌ λ¨κ³μμ μ‘μ§ λͺ»νλ€λ μΉλͺ μ μΈ λ¨μ μ΄ μμ΅λλ€.
μ€μ λ‘ ν΄λΉ 쿼리 λ©μλλ₯Ό νΈμΆνλ μμ μ μ€λ₯κ° λ°μν μ λ°μ μλλ°μ,
μ΄λ¬ν ꡬ쑰λ μΆν μ μ§λ³΄μνλ κ΄μ μμ μ’μ§ μμ κ² λΆλͺ νλ€κ³ μκ°ν©λλ€.
λ€λ₯Έ λ°©λ²μ μμκΉμ?
λ§μ½ ν΄λΉ ν μ΄λΈμ λν΄μ read μ°μ°λ§ λ°μνλ€κ³ κ°μ νλ€λ©΄ μΊμ±μ ν΄λμ΄ μ¬μ©ν΄λ μ’μ κ² κ°μ΅λλ€.
μΊμ λ©λͺ¨λ¦¬λ λ³΄ν΅ λ λμ€λ₯Ό λ§μ΄ μ¬μ©νλλ°μ,
μΈλ©λͺ¨λ¦¬ db μ΄κΈ° λλ¬Έμ λΉ λ₯Έ I/O κ° κ°λ₯νλ©°, μ μ₯λλ λ°μ΄ν°λ§λ€μ ttl μ λ³λλ‘ μ§μ ν΄μ€μλ μκ³
μ¬μ©μ΄ λ§€μ° κ°νΈνλ©° λ νΌλ°μ€λ λ€μν μ μ΄ μ₯μ μΈ κ² κ°μμ.
μΊμ±μ μ μ ν μ¬μ©νλ©΄ API μ±λ₯μ λμ΄λ λ°μ μμ£Ό μ’μ ν¨κ³Όλ₯Ό λ³Ό μ μμ΅λλ€.
λ§μ½μ μΉ΄ν κ³ λ¦¬ ν μ΄λΈμ λν update / delete κΈ°λ₯μ΄ μΆκ°κ° λλ€λ©΄
TTL λμ λ°μ΄ν° μ ν©μ±μ΄ λ§μ§ μλ λ¬Έμ κ° λ°μν κ² κ°μ΅λλ€.
μ΄λ₯Ό λ°©μ§νκΈ° μν΄μλ μΉ΄ν κ³ λ¦¬μ λν update / delete λ₯Ό μνν λ cache μ μ μ₯λ λ°μ΄ν°λ μμ ν΄μ μ±ν¬λ₯Ό λ§μΆμ΄μ£Όλ λ°©λ²μ μ¬μ©νκ±°λ,
νΉμ 무ν¨νν΄μ λ€μ μΊμ±νκ²λ νλ κ²λ κ°λ₯νκ² μ£ .
μν©μ λ°λΌ μ μ ν μ νν΄μ£Όλ©΄ λ κ² κ°μμ!
λ νλ κ³ λ €ν΄μΌ ν μ μ μΊμ μ€ν¬νΌλ(Cache Stampede) μ μν duplicated read/write κ° λ°μνμ¬ μ±λ₯μ΄ μ νλ μλ μλ€λ κ±°μμ.
λ¨μν μΊμ λ©λͺ¨λ¦¬μμ λ°μ΄ν°λ₯Ό get ν기보λ€λ,
API νΈμΆ μμ μ,
TTL μ΄ λ§λ£λκΈ°κΉμ§ μΌλ§ λ¨μ§ μμλλΌλ©΄, μλ‘ μΊμ±νλλ‘ νλ©΄ ν΄κ²°ν μ μμ΅λλ€.
TTL μ΄ λ§λ£λκΈ°κΉμ§ μΌλ§ λ¨μ§ μμλμ§ νλ¨νλ λ°©λ²μ μ£Όλ‘ PER ( Probabilistic Early Recomputation ) Algorithm μ μ¬μ©νλ κ² κ°μμ.
λ§μ§λ§μΌλ‘ μΊμ λ°μ΄ν°μ μ’ λ₯λ§λ€ λ€λ₯Έ TTL μ μ μ©ν΄μΌλ§ νλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
νμ¬μ μꡬμ¬νμμλ μΊμ λ°μ΄ν°λ§λ€ λ³λμ TTL μ μ μ©νμ§ μμλ λκΈ° λλ¬Έμ,
RedisConfig μμ μΌκ΄μ μΌλ‘ λμΌν TTL μ μ€μ ν΄λμμ§λ§ μμΌλ‘λ μΊμ λ°μ΄ν°λ§λ€ TTL μ λ€λ₯΄κ² μ£Όμ΄μΌ ν μν©μ΄ μκΈΈ μλ μμ κ² κ°μμ.
κ·Έλ¬λ©΄ μΊμ λ°μ΄ν° μ’ λ₯λ§λ€ redisCacheManager μ λ³λλ‘ Bean μΌλ‘ λ±λ‘νμ¬ μ¬μ©νλ©΄ λ κΉμ?
λ¬Όλ‘ κ°λ₯νμ§λ§, μ’μ ꡬ쑰λ μλ κ² κ°μ΅λλ€.
ν루νλ£¨κ° μκ°μ΄ λΆμ‘±νλ€μ..!! π₯²
μΆν μ λ‘λν ν¬μ€ν μμ κΉκ² λ€λ£¨μ΄λ³΄λλ‘ νκ² μ΅λλ€!
Leave a comment