<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>JSON — 데이터스케쳐스 위키</title>
  <meta name="description" content="JSON (JSON) (json) Redis 공식 문서의 json 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요. 출처: Redis 공식 문서 — json Redis에서 JSON(JavaScript Object Notation) 데" />
  
  <link rel="canonical" href="https://data-sketchers.com/wiki/tech-stack.databases.redis.json" />
  

  <!-- Hreflang (KO/EN + x-default) — 대안 언어는 koUrl/enUrl(없으면 생략) -->
  <link rel="alternate" hreflang="ko" href="https://data-sketchers.com/wiki/tech-stack.databases.redis.json" />
  <link rel="alternate" hreflang="en" href="https://data-sketchers.com/en/wiki/tech-stack.databases.redis.json" />
  <link rel="alternate" hreflang="x-default" href="https://data-sketchers.com/wiki/tech-stack.databases.redis.json" />

  <!-- Open Graph -->
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="DataSketchers" />
  <meta property="og:title" content="JSON — 데이터스케쳐스 위키" />
  <meta property="og:description" content="JSON (JSON) (json) Redis 공식 문서의 json 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요. 출처: Redis 공식 문서 — json Redis에서 JSON(JavaScript Object Notation) 데" />
  <meta property="og:url" content="https://data-sketchers.com/wiki/tech-stack.databases.redis.json" />
  <meta property="og:image" content="https://data-sketchers.com/assets/logo-black.png" />
  <meta property="og:image:width" content="2172" />
  <meta property="og:image:height" content="724" />
  <meta property="og:image:alt" content="JSON — 데이터스케쳐스 위키" />
  <meta property="og:locale" content="ko_KR" />
  <meta property="og:locale:alternate" content="en_US" />

  <!-- Twitter -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="JSON — 데이터스케쳐스 위키" />
  <meta name="twitter:description" content="JSON (JSON) (json) Redis 공식 문서의 json 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요. 출처: Redis 공식 문서 — json Redis에서 JSON(JavaScript Object Notation) 데" />
  <meta name="twitter:image" content="https://data-sketchers.com/assets/logo-black.png" />
  <meta name="twitter:image:alt" content="JSON — 데이터스케쳐스 위키" />

  <!-- Organization JSON-LD — th:inline 금지(파싱 오류): 사이트 url 을 컨트롤러가 organizationJson 으로 주입.
       주입이 없으면 고정 생략(페이지별 통합 시 site/json 주입). -->
  <script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"DataSketchers","url":"https://data-sketchers.com","logo":"https://data-sketchers.com/assets/logo-black.png","sameAs":["https://github.com/data-sketchers"]}</script>
  <!-- 페이지별 커스텀 JSON-LD (BlogPosting/Article/BreadcrumbList) — 호출측에서 pageJson 통째로 주입 -->
  <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":"1","name":"Home","item":"jdbc:postgresql://pg-dev.data-sketchers.dev:23452/data-sketchers-wiki?user=data-sketchers-land&password=OZcV%2Brr7rTR7vVJgDFkq6gFsZcBXyoKb1bBsEDIJw12%2BC6uo&sslmode=prefer/wiki/"},{"@type":"ListItem","position":"2","name":"tech-stack.databases.redis.json","item":"jdbc:postgresql://pg-dev.data-sketchers.dev:23452/data-sketchers-wiki?user=data-sketchers-land&password=OZcV%2Brr7rTR7vVJgDFkq6gFsZcBXyoKb1bBsEDIJw12%2BC6uo&sslmode=prefer/wiki/tech-stack.databases.redis.json"}]},{"@type":"Article","headline":"JSON","description":"JSON (JSON) (json) Redis 공식 문서의 json 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요. 출처: Redis 공식 문서 — json Redis에서 JSON(JavaScript Object Notation) 데","mainEntityOfPage":"jdbc:postgresql://pg-dev.data-sketchers.dev:23452/data-sketchers-wiki?user=data-sketchers-land&password=OZcV%2Brr7rTR7vVJgDFkq6gFsZcBXyoKb1bBsEDIJw12%2BC6uo&sslmode=prefer/wiki/tech-stack.databases.redis.json","url":"jdbc:postgresql://pg-dev.data-sketchers.dev:23452/data-sketchers-wiki?user=data-sketchers-land&password=OZcV%2Brr7rTR7vVJgDFkq6gFsZcBXyoKb1bBsEDIJw12%2BC6uo&sslmode=prefer/wiki/tech-stack.databases.redis.json","dateModified":"2026-09-10T13:05:25.336902Z"}]}</script>

  <link rel="icon" type="image/png" href="/assets/favicon.png" />
  <link rel="preconnect" href="https://cdn.jsdelivr.net" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap" />
  <link rel="stylesheet" href="/ds/tokens.css" />
  <!-- 원본 디자인 시스템 재현 (기존 대비 95%+ 목표) -->
  <link rel="stylesheet" href="/ds/base.css" />
  <link rel="stylesheet" href="/ds/components.css" />
  <link rel="stylesheet" href="/ds/post.css" />
  <link rel="stylesheet" href="/ds/effects.css" />
  <script src="/ds/effects.js" defer></script>
  <script src="/ds/threads.js" defer></script>
</head>
<body>
  <html>
<header id="site-header" class="site-header">
  <div class="site-header__inner">
    <a href="/" class="site-header__logo" aria-label="DataSketchers 홈" data-logo-host>
      <img class="site-header__logo-word" src="/assets/logo-data-sketchers-light-bg.png" alt="" width="153" height="51" style="height:48px;width:auto" />
    </a>
    <nav class="site-header__nav" aria-label="주 메뉴">
      <!-- DB 관리 헤더 메뉴 (site_menu source-of-truth). 항목이 children 을 가지면 서브메뉴 렌더 -->
      <div class="site-header__nav-wrap">
        
        
          <a href="/about" class="site-header__nav-item">회사소개</a>
        
      </div>
      <div class="site-header__nav-wrap">
        
        
          <a href="/blog" class="site-header__nav-item">블로그</a>
        
      </div>
    </nav>
    <div class="site-header__utils">
      <button class="site-header__menu-btn" data-menu-open aria-label="전체 메뉴 열기" aria-expanded="false">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
          <line x1="4" y1="8" x2="20" y2="8" /><line x1="4" y1="16" x2="20" y2="16" />
        </svg>
      </button>
    </div>
  </div>
</header>

<!-- 전체 메뉴(햄버거) 풀 스크린 오버레이 — 데스크톱·모바일 모두 동작. hamburger_menu (DB) 기반 -->
<div class="site-menu-overlay" data-menu-overlay aria-hidden="true">
  <div class="site-menu-overlay__scrim" data-menu-close></div>
  <div class="site-menu-overlay__panel" role="dialog" aria-modal="true" aria-label="전체 메뉴">
    <div class="site-menu-overlay__head">
      <a href="/" class="site-menu-overlay__logo" data-menu-close>
        <img src="/assets/logo-data-sketchers-light-bg.png" alt="DataSketchers" width="132" height="44" style="height:36px;width:auto" />
      </a>
      <button class="site-menu-overlay__close" data-menu-close aria-label="전체 메뉴 닫기">
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></svg>
      </button>
    </div>
    <nav class="site-menu-overlay__nav" aria-label="전체 메뉴 목록">
      <h2 class="site-menu-overlay__title">전체 메뉴</h2>
      <div class="site-menu-overlay__group">
        <a href="/about" class="site-menu-overlay__group-title"
           data-menu-close>회사소개</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/services" class="site-menu-overlay__group-title"
           data-menu-close>사업영역</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/products" class="site-menu-overlay__group-title"
           data-menu-close>D-SKET</a>
        <div class="site-menu-overlay__subs">
          <a href="/products/webbuilder"
             class="site-menu-overlay__sub" data-menu-close>웹빌더</a><a href="/products/canvas"
             class="site-menu-overlay__sub" data-menu-close>Canvas</a><a href="/products/events"
             class="site-menu-overlay__sub" data-menu-close>Events</a>
        </div>
      </div>
      <div class="site-menu-overlay__group">
        <a href="/clients" class="site-menu-overlay__group-title"
           data-menu-close>고객사</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/blog" class="site-menu-overlay__group-title"
           data-menu-close>블로그</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/" class="site-menu-overlay__group-title"
           data-menu-close>위키</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/press" class="site-menu-overlay__group-title"
           data-menu-close>보도자료</a>
        
      </div>
      <div class="site-menu-overlay__group">
        <a href="/esg" class="site-menu-overlay__group-title"
           data-menu-close>ESG</a>
        
      </div>
    </nav>
  </div>
</div>
</html>

  <main class="ds-container" style="padding-top:calc(var(--header-h) + 24px);">
    <div class="wiki-layout" style="padding-top:0;">   <!-- layout CSS(columns/gap) 는 ds/effects.css 의 .wiki-layout 가 담당 -->

      <!-- ═══ 왼쪽: scope tree (재귀, 접기/펼치기) ═══ -->
      <aside id="wiki-scope" class="wiki-scope">
        <div style="padding:12px 12px 10px; font-family:var(--font-mono); font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:var(--ds-text-3);">Topics</div>
        <!-- 조상 breadcrumb (root=현재 페이지이므로 위로 이동 경로) -->
        <nav aria-label="위키 경로" style="display:flex; flex-wrap:wrap; gap:4px 2px; align-items:center; padding:0 12px 10px; border-bottom:1px solid var(--ds-line); margin-bottom:8px;">
          <a href="/wiki/tech-stack" style="font-size:11px; color:var(--ds-text-3); text-decoration:none; white-space:nowrap;">기술 스택</a><a href="/wiki/tech-stack.databases" style="font-size:11px; color:var(--ds-text-3); text-decoration:none; white-space:nowrap;">데이터베이스</a><a href="/wiki/tech-stack.databases.redis" style="font-size:11px; color:var(--ds-text-3); text-decoration:none; white-space:nowrap;">Redis</a>
          <span style="color:var(--ds-line-strong); font-size:10px;">›</span><span style="color:var(--ds-line-strong); font-size:10px;">›</span><span style="color:var(--ds-line-strong); font-size:10px;">›</span>
        </nav>
        <nav aria-label="위키 주제 트리" style="display:flex; flex-direction:column; gap:2px;">
          <ul class="wiki-tree" style="list-style:none; margin:0; padding:0;">
    
      <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      <button type="button" class="wiki-tree__toggle" data-wtree-toggle
              aria-label="하위 토글" aria-expanded="true">▾</button>
      

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis">Redis</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    <ul class="wiki-tree"
        style="list-style:none; margin:0; padding:0 0 0 14px;">
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.caching">캐시 패턴 (Caching)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.data-types">Redis 데이터 타입</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.persistence">영속성·백업 (Persistence/Backup)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.pubsub">Pub/Sub 메시징</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.arrays">Redis 배열</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.arrays-2">Redis 배열</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.bitfields">Redis 비트필드</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.bitmaps">Redis 비트맵</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.bitmaps-2">Redis 비트맵</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.bloom-filter">블룸 필터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.bloom-filter-2">블룸 필터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.cli">Redis CLI</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.clustering">클러스터링 (Clustering/Scalability)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.compare-data-types">데이터 타입 비교하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.compare-data-types-2">데이터 타입 비교</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.configuration">구성 파라미터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.configuration-2">확률적 자료구조 구성 파라미터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.configuration-3">구성 파라미터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.configuration-4">Time Series 구성 파라미터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.connect">Redis 클라이언트 라이브러리로 연결하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.count-min-sketch">카운트-민 스케치</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.count-min-sketch-2">카운트-민 스케치</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.cuckoo-filter">쿠쿠 필터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.cuckoo-filter-2">쿠쿠 필터</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.data-types-2">Active-Active 데이터베이스의 데이터 타입</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.data-types-3">Active-Active 데이터베이스의 데이터 타입</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.data-types-tutorial">Redis 데이터 타입</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.developer">개발자 노트</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.developer-2">개발자 노트</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.eviction">캐시 만료·퇴출 정책 (Expiration &amp; Eviction)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.eviction-policy">만료 정책</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.eviction-policy-2">제거 정책</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.filtered-search">필터 표현식</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.geospatial">Redis 지리공간</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.geospatial-2">Redis 지리공간 데이터 타입</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.get-started">빠른 시작</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.hashes">Redis 해시</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.hashes-2">Redis 해시</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.hashes-5">Active-Active 데이터베이스의 해시</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.high-availability">고가용성과 복제</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.hyperloglog">Active-Active 데이터베이스의 HyperLogLog</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.hyperloglogs">HyperLogLog</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.idempotency">멱등 메시지 처리</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.indexing-json">JSON 문서 인덱싱/검색</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.insight">Redis Insight</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.java">자바용 Jedis 클라이언트 시작하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node is-active" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link is-active"
         href="/wiki/tech-stack.databases.redis.json">JSON</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.json-3">Active-Active 데이터베이스의 JSON</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.lists">리스트</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.lists-3">Active-Active 데이터베이스의 리스트</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.lua">루아 스크립팅 (Lua Scripting)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.memory">메모리 최적화</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.memory-limit">데이터베이스 메모리 한도</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.memory-performance">메모리와 성능</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.monitor-performance">데이터베이스 성능 모니터링</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.monitor-performance-2">데이터베이스 성능 모니터링</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.nodejs">Node.js용 node-redis 시작하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.optimization">성능 최적화 (Optimization)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.out-of-order-performance-considerations">순서 어긋난 / 과거 데이터 입력의 성능 고려사항</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.out-of-order-performance-considerations-2">중복 없이/백필 방식 수집 성능 고려사항</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.path">JSON 경로</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.path-2">JSON 경로</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.performance">Redis JSON 성능</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.performance-2">Redis JSON 성능</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.performance-3">벡터 집합 성능</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.performance-4">벡터 집합 성능</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.probabilistic">확률형 데이터 구조</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.probabilistic-2">확률적 데이터 구조</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.query-performance-factor">Query performance factor 객체</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.query-performance-factor-2">쿼리 성능 계수 객체</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.quick-start">빠른 시작</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.ram">Redis JSON RAM 사용량</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.ram-2">Redis JSON RAM 사용량</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.redis-py">Python용 redis-py 시작하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.replication">Redis 복제</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.replication-2">복제</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.replication-3">데이터베이스 복제</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.replication-4">데이터베이스 복제</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.resp3">RESP2에서 RESP3로 마이그레이션하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.resp3-2">RESP2에서 RESP3로 마이그레이션하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.scalability">벡터 집합 확장성</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.scalability-2">벡터 집합 확장성</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.securely">안전하게 연결하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.security">보안 (Security)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sets">Redis 집합</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sets-2">Redis 집합</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sets-3">Active-Active 데이터베이스의 집합</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.shard-placement-policy">샤드 배치 정책</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.shard-placement-policy-2">샤드 배치 정책</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sorted-sets">Redis 정렬 집합</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sorted-sets-2">Redis 정렬 집합</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.sorted-sets-3">Active-Active 데이터베이스의 Sorted Sets</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.spring">스프링 데이터 리디스 시작하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.stack">Redis Stack 시작하기</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.streams">Redis Streams</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.streams-3">Active-Active 데이터베이스의 Streams</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.strings">Redis Strings</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.strings-3">Active-Active 데이터베이스의 Strings와 Bitfields</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.t-digest">t-digest</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.timeseries">Time series</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.top-k">Top-K</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.transactions">트랜잭션 (Transactions)</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.troubleshooting">벡터 셋 문제 해결</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.use-cases">JSON 사용 사례</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.use-cases-3">Time series 사용 사례</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.vector-sets">Redis vector sets</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
        <li class="wiki-tree__node" style="margin:0; padding:0;">

    <div class="wiki-tree__row">
      <!-- 접기/펼치기 토글: 자식 보유 노드만. 클릭 = 하위 토글(페이지 이동 없음) -->
      
      <span class="wiki-tree__dot" aria-hidden="true"></span>

      <!-- 제목: 문서 링크 또는 목차 앵커.
           th:if / th:else 는 이 템플릿에서 인접 정합이 깨져 둘 다 렌더되는 버그가 있음(중복 2열 노출).
           반드시 버튼/점 처럼 상호배타 th:if 두 개로 쓴다. -->
      
      <a class="wiki-tree__link"
         href="/wiki/tech-stack.databases.redis.vector-similarity">Redis 벡터 유사도 검색</a>
    </div>

    <!-- 하위 트리: 펼침(isOpen)일 때만 재귀 렌더. 접힌 노드는 빈 placeholder `<ul>` 만 두고
         (data-wtree-lazy = 지연 로드 경로) 펼칠 때 /wiki/tree/{path} 프래그먼트로 로드.
         hidden 속성 금지 — hidden=false 가 요소를 숨김. CSS is-collapsed 로 숨김. -->
    
  </li>
      
    </ul>
  </li>
    
  </ul>
        </nav>
      </aside>

      <!-- ═══ 중앙: 콘텐츠 ═══ -->
      <article class="ds-doc" style="min-width:0;">
        <nav class="ds-breadcrumb" aria-label="breadcrumb" style="padding:12px 0 16px; font-size:12.5px; color:var(--ds-text-3);">
          <a href="/wiki/tech-stack" style="color:inherit; text-decoration:none;">기술 스택</a><a href="/wiki/tech-stack.databases" style="color:inherit; text-decoration:none;">데이터베이스</a><a href="/wiki/tech-stack.databases.redis" style="color:inherit; text-decoration:none;">Redis</a>
          <span style="color:var(--ds-line-strong);"> › </span><span style="color:var(--ds-line-strong);"> › </span><span style="color:var(--ds-line-strong);"> › </span>
        </nav>
        <h1 style="margin-bottom:20px;">JSON</h1>
        <!-- 모바일 전용: 목차를 본문 상단(제목 하단)에 항상 펼침 -->
        <nav aria-label="페이지 목차" class="wiki-toc-mobile"
             style="display:none; border-bottom:1px solid var(--ds-line); padding-bottom:12px; margin-bottom:24px;">
          <div class="ds-label" style="font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:var(--ds-text-3); margin-bottom:8px;">목차</div>
          <div style="display:flex; flex-direction:column; gap:2px;">
            <a href="#json-json-json" style="padding-left:0px">JSON (JSON) (json)</a><a href="#주요-기능-primary-features" style="padding-left:0px">주요 기능 (Primary features)</a><a href="#첫-번째-json-명령" style="padding-left:0px">첫 번째 JSON 명령</a><a href="#문자열-연산-jsonstrlen-jsonstrappend" style="padding-left:10px">문자열 연산 (JSON.STRLEN, JSON.STRAPPEND)</a><a href="#숫자-연산-jsonnumincrby-jsonnummultby" style="padding-left:10px">숫자 연산 (JSON.NUMINCRBY, JSON.NUMMULTBY)</a><a href="#배열-연산-jsonarrappend-jsonarrinsert-jsonarrtrim-jsonarrpop" style="padding-left:10px">배열 연산 (JSON.ARRAPPEND, JSON.ARRINSERT, JSON.ARRTRIM, JSON.ARRPOP)</a><a href="#객체-연산-jsonobjlen-jsonobjkeys" style="padding-left:10px">객체 연산 (JSON.OBJLEN, JSON.OBJKEYS)</a><a href="#redis-88-이후의-fpha-지원" style="padding-left:0px">Redis 8.8 이후의 FPHA 지원</a><a href="#json-명령-요약" style="padding-left:0px">JSON 명령 요약</a><a href="#redis-json-활성화" style="padding-left:0px">Redis JSON 활성화</a><a href="#더-알아보기-learn-more" style="padding-left:0px">더 알아보기 (Learn more)</a>
          </div>
        </nav>
        <div><h2 id="json-json-json">JSON (JSON) (json)</h2>
<p>Redis 공식 문서의 json 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요.</p>
<blockquote>
<p>출처: <a href="https://redis.io/docs/latest/develop/data-types/json">Redis 공식 문서 — json</a></p>
</blockquote>
<p>Redis에서 JSON(JavaScript Object Notation) 데이터 타입을 어떻게 지원하는지 알려드릴게요. Redis Open Source의 JSON 기능을 쓰면 다른 Redis 데이터 타입처럼 Redis 데이터베이스에 <strong>JSON 값을 저장·업데이트·조회</strong>할 수 있어요. Redis JSON은 <a href="https://redis.io/docs/latest/develop/ai/search-and-query/">Redis Search</a>와 매끄럽게 연동되어 <a href="https://redis.io/docs/latest/develop/ai/search-and-query/indexing/">JSON 문서를 인덱싱하고 쿼리</a>할 수도 있어요.</p>
<h2 id="주요-기능-primary-features">주요 기능 (Primary features)</h2>
<ul>
<li>JSON 표준의 <strong>완전한 지원</strong></li>
<li>문서 안 요소를 선택/업데이트하기 위한 <a href="http://goessner.net/articles/JsonPath/">JSONPath</a> 구문 (자세한 내용은 <a href="https://redis.io/docs/latest/develop/data-types/json/path#jsonpath-syntax">JSONPath syntax</a> 참고)</li>
<li>문서가 <strong>트리 구조의 바이너리 데이터</strong>로 저장되어 하위 요소에 대한 빠른 접근 가능</li>
</ul>
<h2 id="첫-번째-json-명령">첫 번째 JSON 명령</h2>
<p>가장 먼저 시도할 JSON 명령은 <a href="https://redis.io/docs/latest/commands/json.set/"><code>JSON.SET</code></a>이에요. Redis 키에 JSON 값을 설정하는 명령이죠. <code>JSON.SET</code>은 모든 JSON 값 타입을 받아들여요. 이 예시는 JSON string을 만들어요.</p>
<p><strong>명령:</strong> JSON.SET, JSON.GET, JSON.TYPE</p>
<p><strong>복잡도(Complexity):</strong></p>
<ul>
<li>JSON.SET: O(M+N)</li>
<li>JSON.GET: O(N)</li>
<li>JSON.TYPE: O(1)</li>
</ul>
<p><strong>사용 가능한 곳:</strong> Redis CLI, C#, Go, Java (Asynchronous - Lettuce), Java (Reactive - Lettuce), Java (Synchronous - Jedis), JavaScript (Node.js), PHP, Python, Rust (Asynchronous), Rust (Synchronous)</p>
<h5>Redis CLI</h5>
<pre><code class="language-text">&gt; JSON.SET bike $ '&quot;Hyperion&quot;'
&gt; OK
&gt; JSON.GET bike $
&gt; &quot;[&quot;Hyperion&quot;]&quot;
&gt; JSON.TYPE bike $
1) &quot;string&quot;
</code></pre>
<h3 id="문자열-연산-jsonstrlen-jsonstrappend">문자열 연산 (JSON.STRLEN, JSON.STRAPPEND)</h3>
<p><code>JSON.STRLEN</code>으로 길이를, <code>JSON.STRAPPEND</code>로 문자열 값을 이어붙일 수 있어요. (난이도: beginner)</p>
<h3 id="숫자-연산-jsonnumincrby-jsonnummultby">숫자 연산 (JSON.NUMINCRBY, JSON.NUMMULTBY)</h3>
<p><code>JSON.NUMINCRBY</code>로 JSON 숫자를 증분하고 <code>JSON.NUMMULTBY</code>로 곱하는 <strong>원자적(atomic) 산술 연산</strong>을 할 수 있어요. (난이도: beginner)</p>
<h3 id="배열-연산-jsonarrappend-jsonarrinsert-jsonarrtrim-jsonarrpop">배열 연산 (JSON.ARRAPPEND, JSON.ARRINSERT, JSON.ARRTRIM, JSON.ARRPOP)</h3>
<p><code>JSON.ARRAPPEND</code>로 요소를 추가하고, <code>JSON.ARRINSERT</code>로 위치에 삽입하고, <code>JSON.ARRTRIM</code>으로 범위를 유지하고, <code>JSON.ARRPOP</code>으로 요소를 제거할 수 있어요. (난이도: intermediate)</p>
<h3 id="객체-연산-jsonobjlen-jsonobjkeys">객체 연산 (JSON.OBJLEN, JSON.OBJKEYS)</h3>
<p><code>JSON.OBJLEN</code>으로 필드 수를 세고 <code>JSON.OBJKEYS</code>로 모든 키를 가져오는 식으로 JSON 객체를 검사할 수 있어요. (난이도: intermediate)</p>
<h2 id="redis-88-이후의-fpha-지원">Redis 8.8 이후의 FPHA 지원</h2>
<p>Redis 8.8부터 JSON 데이터 타입은 부동소수점 동질 배열(FPHAs, floating point homogeneous arrays)을 저장할 때 특정 타입을 강제하는 기능을 지원해요. <a href="https://redis.io/docs/latest/commands/json.set"><code>JSON.SET</code></a> 명령에 <code>FPHA BF16|FP16|FP32|FP64</code> 옵션을 쓰면 돼요.</p>
<pre><code class="language-text">JSON.SET fp BF16 $
'[1.1, 2.2, 3.3]'
</code></pre>
<h2 id="json-명령-요약">JSON 명령 요약</h2>
<table>
<thead>
<tr>
<th>명령</th>
<th>설명</th>
<th>복잡도</th>
<th>버전</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://redis.io/commands/json.arrappend/">JSON.ARRAPPEND</a></td>
<td>path에서 배열 끝(마지막 요소 다음)에 하나 이상의 JSON 값을 추가</td>
<td>path가 단일 값으로 평가되면 O(1), ...</td>
<td>1.0.0</td>
</tr>
<tr>
<td><a href="https://redis.io/commands/json.arrindex/">JSON.ARRINDEX</a></td>
<td>path에서 배열에서 JSON 스칼라 값의 첫 번째 발생 인덱스 반환</td>
<td>path가 단일 값으로 평가되면 O(N), ...</td>
<td>1.0.0</td>
</tr>
</tbody>
</table>
<p>(이외에도 JSON.SET, JSON.GET, JSON.TYPE, JSON.OBJLEN, JSON.OBJKEYS 등 다양한 명령이 있어요.)</p>
<h2 id="redis-json-활성화">Redis JSON 활성화</h2>
<p>Redis JSON 데이터 타입은 Redis Open Source의 일부이며, Redis Software와 Redis Cloud에서도 사용할 수 있어요.</p>
<p>설치 방법은 <a href="https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack">Redis Open Source 설치</a>나 <a href="https://redis.io/docs/latest/operate/rs/installing-upgrading/install">Redis Software 설치</a> 문서를 참고하세요.</p>
<h2 id="더-알아보기-learn-more">더 알아보기 (Learn more)</h2>
<p>JSON 데이터 타입에 대해 더 알고 싶다면 아래 링크를 확인해 보세요.</p>
<ul>
<li><a href="https://redis.io/docs/latest/develop/data-types/json/path">https://redis.io/docs/latest/develop/data-types/json/path</a></li>
<li><a href="https://redis.io/docs/latest/develop/data-types/json/indexing_json">https://redis.io/docs/latest/develop/data-types/json/indexing_json</a></li>
</ul>
</div>
      </article>

      <!-- ═══ 오른쪽: TOC (H2/H3 목차, 접기/펼치기) ═══ -->
      <aside class="wiki-toc" data-toc
             style="position:sticky; top:calc(var(--header-h) + 24px); max-height:calc(100vh - var(--header-h) - 48px); overflow:auto; padding:8px 0; border-left:1px solid var(--ds-line); padding-left:16px;">
        <button type="button" class="wiki-toc__toggle" aria-expanded="true" aria-controls="wiki-toc-nav">
          <span class="wiki-toc__label">목차</span>
          <span class="wiki-toc__chevron">▾</span>
        </button>
        <nav id="wiki-toc-nav" class="wiki-toc__nav" aria-label="페이지 목차">
          <a href="#json-json-json" style="padding-left:0px">JSON (JSON) (json)</a><a href="#주요-기능-primary-features" style="padding-left:0px">주요 기능 (Primary features)</a><a href="#첫-번째-json-명령" style="padding-left:0px">첫 번째 JSON 명령</a><a href="#문자열-연산-jsonstrlen-jsonstrappend" style="padding-left:10px">문자열 연산 (JSON.STRLEN, JSON.STRAPPEND)</a><a href="#숫자-연산-jsonnumincrby-jsonnummultby" style="padding-left:10px">숫자 연산 (JSON.NUMINCRBY, JSON.NUMMULTBY)</a><a href="#배열-연산-jsonarrappend-jsonarrinsert-jsonarrtrim-jsonarrpop" style="padding-left:10px">배열 연산 (JSON.ARRAPPEND, JSON.ARRINSERT, JSON.ARRTRIM, JSON.ARRPOP)</a><a href="#객체-연산-jsonobjlen-jsonobjkeys" style="padding-left:10px">객체 연산 (JSON.OBJLEN, JSON.OBJKEYS)</a><a href="#redis-88-이후의-fpha-지원" style="padding-left:0px">Redis 8.8 이후의 FPHA 지원</a><a href="#json-명령-요약" style="padding-left:0px">JSON 명령 요약</a><a href="#redis-json-활성화" style="padding-left:0px">Redis JSON 활성화</a><a href="#더-알아보기-learn-more" style="padding-left:0px">더 알아보기 (Learn more)</a>
        </nav>
      </aside>
    </div>
  </main>

  <!-- ═══ scope tree 접기/펼치기 인터랙션 ═══ -->
  <script>
  (function () {
    // 페이지 이동 시 항상 최상단(제목/목차)에서 시작 — 모바일에서 트리가 하단에 있어도 뷰포트를 하단에 남기지 않음
    if ('scrollRestoration' in history) { history.scrollRestoration = 'manual'; }
    window.addEventListener('load', function () { window.scrollTo(0, 0); });

    document.querySelectorAll('[data-wtree-toggle]').forEach(function (btn) {
      btn.addEventListener('click', function (e) {
        e.preventDefault();
        e.stopPropagation();
        var li = btn.closest('.wiki-tree__node');
        if (!li) return;
        var sub = li.querySelector(':scope > .wiki-tree');
        if (!sub) return;
        var lazyPath = sub.getAttribute('data-wtree-lazy');
        if (lazyPath && sub.getAttribute('data-wtree-loaded') !== '1') {
          // 첫 펼침: 하위 트리를 lazy 프래그먼트로 로드 후 펼침
          fetch('/wiki/tree/' + lazyPath.replace(/^\/+/, ''))
            .then(function (r) { return r.text(); })
            .then(function (html) {
              sub.innerHTML = html;
              sub.setAttribute('data-wtree-loaded', '1');
              sub.removeAttribute('data-wtree-lazy');
              wireToggles(sub);
              openSub(sub, btn);
            })
            .catch(function () { openSub(sub, btn); });
          return;
        }
        openSub(sub, btn);
      });
    });

    function openSub(sub, btn) {
      var collapsed = sub.classList.toggle('is-collapsed');
      sub.hidden = collapsed;
      btn.textContent = collapsed ? '▸' : '▾';
      btn.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
    }

    // lazy 프래그먼트로 삽입된 하위 노드들의 토글도 이벤트 연결
    function wireToggles(scope) {
      scope.querySelectorAll('[data-wtree-toggle]').forEach(function (btn) {
        if (btn._wtreeBound) return;
        btn._wtreeBound = true;
        btn.addEventListener('click', function (e) {
          e.preventDefault();
          e.stopPropagation();
          var li = btn.closest('.wiki-tree__node');
          if (!li) return;
          var sub = li.querySelector(':scope > .wiki-tree');
          if (!sub) return;
          var lazyPath = sub.getAttribute('data-wtree-lazy');
          if (lazyPath && sub.getAttribute('data-wtree-loaded') !== '1') {
            fetch('/wiki/tree/' + lazyPath.replace(/^\/+/, ''))
              .then(function (r) { return r.text(); })
              .then(function (html) {
                sub.innerHTML = html;
                sub.setAttribute('data-wtree-loaded', '1');
                sub.removeAttribute('data-wtree-lazy');
                wireToggles(sub);
                openSub(sub, btn);
              })
              .catch(function () { openSub(sub, btn); });
            return;
          }
          openSub(sub, btn);
        });
      });
    }

    // TOC 접기/펼치기 토글
    var toc = document.querySelector('[data-toc]');
    if (toc) {
      var toggleBtn = toc.querySelector('.wiki-toc__toggle');
      var nav = toc.querySelector('.wiki-toc__nav');
      var chevron = toc.querySelector('.wiki-toc__chevron');
      if (toggleBtn && nav) {
        toggleBtn.addEventListener('click', function () {
          var collapsed = toc.classList.toggle('is-collapsed');
          toggleBtn.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
          if (chevron) chevron.textContent = collapsed ? '▸' : '▾';
        });
      }
    }
    // 페이지 진입 시 활성 노드로 스크롤 노출
    var active = document.querySelector('.wiki-tree__node.is-active');
    if (active && active.scrollIntoView) {
      try { active.scrollIntoView({ block: 'nearest' }); } catch (e) {}
    }
  })();
  </script>

  <style>
    /* scope tree 행 스타일: 활성 강조 + 들여쓰기 토글 정렬 */
    .wiki-tree__row { display:flex; align-items:center; gap:6px; border-radius:var(--r-xs); }
    .wiki-tree__row:hover { background:var(--ds-bg-subtle); }
    .wiki-tree__toggle {
      flex:0 0 auto; width:16px; height:22px; padding:0; border:none; background:none;
      cursor:pointer; color:var(--ds-text-3); font-size:10px; line-height:1;
      display:flex; align-items:center; justify-content:center;
    }
    .wiki-tree__dot { flex:0 0 auto; width:16px; height:1px; }
    .wiki-tree__link {
      flex:1 1 auto; min-width:0; padding:6px 6px; border-radius:var(--r-xs);
      font-size:13px; color:var(--ds-text-2); text-decoration:none; line-height:1.35; overflow:hidden; text-overflow:ellipsis;
    }
    .wiki-tree__node.is-active > .wiki-tree__row { background:var(--ds-text); }
    .wiki-tree__node.is-active > .wiki-tree__row .wiki-tree__link { color:var(--ds-bg-card); font-weight:700; }
    .wiki-tree.is-collapsed { display:none; }
    /* TOC 접기/펼치기 토글 버튼 */
    .wiki-toc__toggle {
      display:flex; align-items:center; justify-content:space-between; width:100%;
      padding:4px 6px; margin-bottom:6px; border:none; background:none; cursor:pointer;
      font-size:12px; font-weight:600; letter-spacing:.08em; text-transform:uppercase;
      color:var(--ds-text-2); border-radius:var(--r-xs); text-align:left;
    }
    .wiki-toc__toggle:hover { color:var(--ds-text); background:var(--ds-bg-subtle); }
    .wiki-toc__nav { display:flex; flex-direction:column; gap:2px; }
    .wiki-toc__chevron { font-size:10px; color:var(--ds-text-3); transition:transform .15s var(--ease-out); }
    .wiki-toc.is-collapsed .wiki-toc__chevron { transform:rotate(-90deg); }
    .wiki-toc.is-collapsed .wiki-toc__nav { display:none; }
  </style>

  <html>
<footer style="background:var(--ds-bg-strong); color:var(--ds-text-on-dark); margin-top:80px;">
  <div style="max-width:var(--w-wide); margin:0 auto; padding:40px 32px 28px;">
    <!-- 1줄 블록: 좌측 브랜드 + 우측 링크 가로 나열 -->
    <div style="display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:20px 32px;">
      <div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;">
        <img src="/assets/logo-white.png" alt="DataSketchers" style="height:32px; width:auto;" />
        <span style="font-size:13px; color:#b0b0b2; max-width:320px;">AI·데이터·디자인으로 기업의 디지털 전환을 지원합니다. 서울시립대학교 캠퍼스타운 창업기업</span>
      </div>
      <nav style="display:flex; flex-wrap:wrap; gap:8px 24px; font-size:13px;" aria-label="푸터 링크">
        <a href="/about" style="color:#e5e5e6; text-decoration:none;">회사소개</a>
        <a href="/services" style="color:#e5e5e6; text-decoration:none;">사업영역</a>
        <a href="/products" style="color:#e5e5e6; text-decoration:none;">D-SKET</a>
        <a href="/clients" style="color:#e5e5e6; text-decoration:none;">고객사</a>
        <a href="/blog" style="color:#e5e5e6; text-decoration:none;">블로그</a>
        <a href="/" style="color:#e5e5e6; text-decoration:none;">위키</a>
        <a href="/press" style="color:#e5e5e6; text-decoration:none;">보도자료</a>
        <a href="/esg" style="color:#e5e5e6; text-decoration:none;">ESG</a>
        <a href="/contact" style="color:#e5e5e6; text-decoration:none;">문의</a>
      </nav>
    </div>
    <div style="margin-top:28px; padding-top:16px; border-top:1px solid rgba(255,255,255,0.12); display:flex; justify-content:space-between; flex-wrap:wrap; gap:12px; font-size:13px; color:#8a8a8d;">
      <span>© 데이터스케쳐스. All rights reserved.</span>
      <span>사업자등록번호 349-81-03411</span>
    </div>
  </div>
</footer>
</html>
</body>
</html>
