<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Redis-Cli on kastori</title><link>http://blog.kastori.dev/tags/redis-cli/</link><description>Recent content in Redis-Cli on kastori</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Tue, 14 Jul 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://blog.kastori.dev/tags/redis-cli/index.xml" rel="self" type="application/rss+xml"/><item><title>[Redis 실무 입문 #1] Redis 시작하기 — 왜 쓰나, 설치, 첫 명령어까지</title><link>http://blog.kastori.dev/tech/2026-07-14-redis-01-getting-started/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0900</pubDate><guid>http://blog.kastori.dev/tech/2026-07-14-redis-01-getting-started/</guid><description>&lt;h2 id="redis는-알겠는데-그래서-뭘-어떻게-넣으라는-거지"&gt;&lt;a href="#redis%eb%8a%94-%ec%95%8c%ea%b2%a0%eb%8a%94%eb%8d%b0-%ea%b7%b8%eb%9e%98%ec%84%9c-%eb%ad%98-%ec%96%b4%eb%96%bb%ea%b2%8c-%eb%84%a3%ec%9c%bc%eb%9d%bc%eb%8a%94-%ea%b1%b0%ec%a7%80" class="header-anchor"&gt;&lt;/a&gt;Redis는 알겠는데, 그래서 뭘 어떻게 넣으라는 거지
&lt;/h2&gt;&lt;p&gt;Redis가 빠르다는 건 나도 오래전부터 알고 있었다. 면접 단골 질문이라 &amp;ldquo;인메모리라서 빠르고 단일 스레드고&amp;hellip;&amp;rdquo; 정도는 줄줄 외웠다. 그 원리는 &lt;a class="link" href="http://blog.kastori.dev/tech/2026-06-01-db-07-redis-internals/" &gt;지난 글&lt;/a&gt;에도 정리해뒀다.&lt;/p&gt;
&lt;p&gt;문제는 정작 &amp;ldquo;이 조회가 느리니까 Redis로 캐싱하자&amp;quot;는 상황이 왔을 때였다. 서버를 띄우고 &lt;code&gt;redis-cli&lt;/code&gt;를 켜긴 했는데, 그 다음이 막막했다. &lt;strong&gt;뭘 어떤 키로 넣고, 무슨 명령을 쓰고, 언제 지워야 하는가.&lt;/strong&gt; 원리를 아는 것과 실제로 붙이는 건 완전히 다른 얘기였다.&lt;/p&gt;
&lt;p&gt;이 시리즈는 그때의 나 같은 사람을 위한 것이다. 원리는 접어두고, 설치부터 시작해서 실제 서비스에 캐시·세션·랭킹을 붙이는 데 필요한 것만 흐름대로 다룬다. 첫 편은 개념 잡기와 설치, 그리고 첫 명령어다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="먼저-사고방식부터--redis는-db가-아니다"&gt;&lt;a href="#%eb%a8%bc%ec%a0%80-%ec%82%ac%ea%b3%a0%eb%b0%a9%ec%8b%9d%eb%b6%80%ed%84%b0--redis%eb%8a%94-db%ea%b0%80-%ec%95%84%eb%8b%88%eb%8b%a4" class="header-anchor"&gt;&lt;/a&gt;먼저 사고방식부터 — Redis는 DB가 아니다
&lt;/h2&gt;&lt;p&gt;Redis를 처음 붙일 때 가장 헷갈렸던 게 이거였다. &amp;ldquo;이거 DB랑 뭐가 다르지? 그냥 빠른 DB 아닌가?&amp;rdquo; 아니다. 역할이 다르다.&lt;/p&gt;
&lt;p&gt;Redis는 &lt;strong&gt;메모리에 데이터를 저장하는 Key-Value 저장소&lt;/strong&gt;다. MySQL 같은 DB가 디스크에 데이터를 안전하게 보관하는 창고라면, Redis는 자주 쓰는 데이터를 손 닿는 곳에 잠깐 올려두는 작업대에 가깝다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;일반 DB (MySQL) Redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;───────────────── ─────────────────
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;디스크 저장 (영구) 메모리 저장 (빠름, 휘발성 주의)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;복잡한 쿼리 / 조인 단순 Key로 값 꺼내기
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ms(밀리초) 단위 μs(마이크로초) 단위 — 훨씬 빠름
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;데이터의 &amp;#34;원본&amp;#34; 원본의 &amp;#34;사본 / 임시 데이터&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;여기서 딱 하나만 몸에 새기고 가면 된다. &lt;strong&gt;Redis에 있는 데이터는 언제 날아가도 되는 것만 넣는다.&lt;/strong&gt; 메모리 기반이라 서버가 재시작되면 사라질 수 있다(영속성 옵션이 있긴 하지만, 그건 안전망이지 보험이 아니다). 그래서 나는 항상 &amp;ldquo;이 데이터, Redis가 통째로 비어도 DB에서 다시 만들 수 있나?&amp;ldquo;를 먼저 자문한다. 답이 &amp;ldquo;아니오&amp;quot;면 그건 Redis에 단독으로 둘 데이터가 아니다.&lt;/p&gt;
&lt;p&gt;이 원칙만 지켜도 초보가 저지르는 사고의 절반은 안 난다. 이 시리즈에서 하나씩 실제로 붙여볼 용도는 이렇다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;캐시&lt;/strong&gt;: 느린 DB 조회 결과를 잠깐 저장해 다음 요청을 빠르게 (#3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;세션 저장소&lt;/strong&gt;: 로그인 정보를 서버 여러 대가 공유 (#4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실시간 랭킹 / 카운터&lt;/strong&gt;: 조회수, 좋아요, 게임 점수 (#4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;선착순 / 횟수 제한&lt;/strong&gt;: &amp;ldquo;1분에 5번만&amp;rdquo; 같은 제어 (#4)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;임시 데이터&lt;/strong&gt;: 이메일 인증코드처럼 시간 지나면 알아서 사라지는 값&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전부 &amp;ldquo;없어져도 DB로 복구되거나, 애초에 임시&amp;quot;라는 공통점이 있다. 우연이 아니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="설치--고민-말고-docker"&gt;&lt;a href="#%ec%84%a4%ec%b9%98--%ea%b3%a0%eb%af%bc-%eb%a7%90%ea%b3%a0-docker" class="header-anchor"&gt;&lt;/a&gt;설치 — 고민 말고 Docker
&lt;/h2&gt;&lt;p&gt;로컬에서 굴려볼 거라면 나는 그냥 Docker로 띄운다. 버전 관리도 편하고, 다 쓰고 컨테이너만 지우면 흔적이 안 남는다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Redis 실행 (포트 6379)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name my-redis -p 6379:6379 -d redis:7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 컨테이너 안의 redis-cli로 바로 접속&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it my-redis redis-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;로컬에 직접 깔고 싶으면 이것도 어렵지 않다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;redis-server &lt;span class="c1"&gt;# 서버 실행&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;redis-cli &lt;span class="c1"&gt;# 다른 터미널에서 접속&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu / Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install redis-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows는 얘기가 좀 다르다. Redis는 공식 Windows 지원이 없어서, 예전 마이크로소프트 포트를 찾아 깔면 버전이 한참 낡았다. 삽질하지 말고 &lt;strong&gt;WSL2 + apt&lt;/strong&gt;나 &lt;strong&gt;Docker&lt;/strong&gt;로 가는 게 정답이다.&lt;/p&gt;
&lt;p&gt;접속이 됐는지는 &lt;code&gt;PING&lt;/code&gt; 한 번이면 안다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;127.0.0.1:6379&amp;gt; PING
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PONG &lt;span class="c1"&gt;# 이게 뜨면 성공&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="첫-명령어--넣고-빼고-만료시키기"&gt;&lt;a href="#%ec%b2%ab-%eb%aa%85%eb%a0%b9%ec%96%b4--%eb%84%a3%ea%b3%a0-%eb%b9%bc%ea%b3%a0-%eb%a7%8c%eb%a3%8c%ec%8b%9c%ed%82%a4%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;첫 명령어 — 넣고, 빼고, 만료시키기
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;redis-cli&lt;/code&gt;는 Redis랑 직접 대화하는 창구다. 코드로 붙이기 전에 여기서 손으로 쳐보는 게 감을 잡는 제일 빠른 길이다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 값 저장 / 조회 / 삭제&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET name &lt;span class="s2"&gt;&amp;#34;kastori&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET name &lt;span class="c1"&gt;# &amp;#34;kastori&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEL name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 키가 있는지 확인&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EXISTS name &lt;span class="c1"&gt;# 1(있음) / 0(없음)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 만료 시간(TTL) — 이게 Redis의 진짜 무기다&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET code &lt;span class="s2"&gt;&amp;#34;123456&amp;#34;&lt;/span&gt; EX &lt;span class="m"&gt;300&lt;/span&gt; &lt;span class="c1"&gt;# 300초 뒤 알아서 사라짐 (이메일 인증코드에 딱)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TTL code &lt;span class="c1"&gt;# 남은 초. -1은 만료없음, -2는 이미 없는 키&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 숫자 카운터&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET views &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INCR views &lt;span class="c1"&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INCR views &lt;span class="c1"&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INCRBY views &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;# 12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;여기서 두 가지를 짚고 싶다.&lt;/p&gt;
&lt;p&gt;첫째, &lt;strong&gt;&lt;code&gt;EX&lt;/code&gt;로 거는 TTL&lt;/strong&gt;. RDB로 임시 데이터를 다루던 사람이 Redis에 오면 제일 감동하는 부분이 이거다. 인증코드 5분 뒤 만료? DB였으면 &lt;code&gt;expires_at&lt;/code&gt; 컬럼 만들고 배치 돌려 지웠을 일을 &lt;code&gt;EX 300&lt;/code&gt; 한 방이면 끝낸다. 앞으로 캐시든 세션이든 TTL이 계속 나오니 지금 눈에 익혀두자.&lt;/p&gt;
&lt;p&gt;둘째, &lt;strong&gt;&lt;code&gt;INCR&lt;/code&gt;&lt;/strong&gt;. 별것 아닌 것 같지만 이게 원자적이라는 게 핵심이다. 조회수를 &lt;code&gt;GET&lt;/code&gt;해서 +1 하고 다시 &lt;code&gt;SET&lt;/code&gt;하면 동시 요청에서 값이 꼬이는데, &lt;code&gt;INCR&lt;/code&gt;은 Redis가 명령을 하나씩 처리하기 때문에 락 없이도 정확하다. 조회수·좋아요 카운터를 마음 편히 맡길 수 있다.&lt;/p&gt;
&lt;h3 id="딱-하나만-외워라-keys--금지"&gt;&lt;a href="#%eb%94%b1-%ed%95%98%eb%82%98%eb%a7%8c-%ec%99%b8%ec%9b%8c%eb%9d%bc-keys--%ea%b8%88%ec%a7%80" class="header-anchor"&gt;&lt;/a&gt;딱 하나만 외워라: &lt;code&gt;KEYS *&lt;/code&gt; 금지
&lt;/h3&gt;&lt;p&gt;실무에서 Redis로 사고 치는 대표적인 방법이 &lt;code&gt;KEYS *&lt;/code&gt;다. &amp;ldquo;키 목록 좀 보자&amp;rdquo; 하고 운영 서버에 쳤다가 Redis 전체를 멈춰버리는 경우를 심심찮게 본다. 전체 키를 한 번에 훑는 O(N) 명령인데, Redis는 단일 스레드라 그동안 다른 요청이 전부 대기한다(&lt;a class="link" href="http://blog.kastori.dev/tech/2026-06-01-db-07-redis-internals/" &gt;원리편&lt;/a&gt;에서 왜 그런지 자세히 다뤘다).&lt;/p&gt;
&lt;p&gt;키를 훑어야 하면 커서로 조금씩 도는 &lt;code&gt;SCAN&lt;/code&gt;을 쓴다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SCAN &lt;span class="m"&gt;0&lt;/span&gt; MATCH user:* COUNT &lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="c1"&gt;# 블로킹 없이 100개씩 나눠서 조회&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;로컬에서 &lt;code&gt;KEYS&lt;/code&gt;는 편하니까 습관이 들기 쉬운데, 그 습관이 운영에서 사고로 이어진다. 처음부터 &lt;code&gt;SCAN&lt;/code&gt;으로 손에 익히는 걸 권한다.&lt;/p&gt;
&lt;h3 id="키-이름은-으로-계층-짓기"&gt;&lt;a href="#%ed%82%a4-%ec%9d%b4%eb%a6%84%ec%9d%80-%ec%9c%bc%eb%a1%9c-%ea%b3%84%ec%b8%b5-%ec%a7%93%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;키 이름은 &lt;code&gt;:&lt;/code&gt;으로 계층 짓기
&lt;/h3&gt;&lt;p&gt;마지막으로 사소하지만 나중에 크게 갈리는 습관 하나. 키 이름은 &lt;code&gt;user:1:name&lt;/code&gt;처럼 &lt;code&gt;:&lt;/code&gt;으로 계층을 준다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user:1:name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user:1:cart
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;session:abc123
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;post:100:views
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;:&lt;/code&gt;는 Redis 입장에선 그냥 글자지만, 관례로 굳어져서 도구들도 이 기준으로 키를 트리처럼 보여준다. &lt;code&gt;SCAN user:1:*&lt;/code&gt;로 묶어 찾기도 좋고, 무엇보다 반년 뒤에 봐도 이게 무슨 키인지 바로 읽힌다. 처음에 대충 &lt;code&gt;user1name&lt;/code&gt; 같이 지어두면 나중에 후회한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="마치며"&gt;&lt;a href="#%eb%a7%88%ec%b9%98%eb%a9%b0" class="header-anchor"&gt;&lt;/a&gt;마치며
&lt;/h2&gt;&lt;p&gt;여기까지면 Redis를 띄우고 값을 넣고 빼고 만료시키는 것까진 손에 붙었을 것이다. 근데 사실 여기까지는 Redis를 &amp;ldquo;빠른 문자열 저장소&amp;quot;로만 쓴 거다. 진짜 힘은 String 말고 &lt;strong&gt;나머지 자료구조를 상황에 맞게 고르는 데&lt;/strong&gt; 있다.&lt;/p&gt;
&lt;p&gt;다음 편에서는 Hash·List·Set·Sorted Set을 각각 어떤 실무 상황에서 꺼내 쓰는지, &amp;ldquo;이럴 땐 이거&amp;quot;를 시나리오로 풀어본다. 개인적으로 Sorted Set을 처음 알았을 때 &amp;ldquo;랭킹을 이렇게 쉽게 만든다고?&amp;rdquo; 했던 기억이 있는데, 그 얘기도 거기서 한다.&lt;/p&gt;</description></item></channel></rss>