글 목록으로 돌아가기

Redis

Redis 사용

Redis 설치, 설정, 접속, 자료구조 활용, 키 관리 정리

Dohyeon Kim
Dohyeon Kim 2026년 7월 17일 · 5분 읽기
Redis AutoEverSW

1) 설치


  • public cloud와 같은 곳의 SaaS를 이용
  • OS에 설치
  • Docker나 K8s와 같은 컨테이너를 이용

2) 설정


  • 설정파일 위치
    • MacOS: opt/homebrew/etc/redis.conf
    • Linux: /etc/redis/redis.conf
  • bind: redis에 접근할 수 있는 IP 바인딩 설정
    • 127.0.0.1 → Localhost
    • 0.0.0.0 → AnyWhere
  • port: 애플리케이션을 구분하기 위한 번호
    • 기본 ‘6379’
    • 내부 통신을 위해 16379 사용
  • protected-mode: pw를 설정해야만 redis에 접근할 수 있도록함
    • 기본 ‘yes’
  • requirepass / masterauth: 패스워드

  • daemonize: 프로세스를 deamon으로 실행시키고자 할 때 사용함
    • 기본 ‘no’
  • dir: 작업 디렉토리
    • 기본 ‘./’
  • tcp-backlog: 초당 client 연결 개수
    • 기본 ‘511’
  • timeout: client에서 서버 접속 시 timeout 값
    • 기본 ‘0’
  • maxclient: 최대 접속 가능 client 수
    • 기본 ‘10000’
  • tcp-keepalive: 클라이언트가 반응을 보이지 않을 때 서버가 접속을 제거하는 시간
    • 기본 ‘300’
  • 설정을 변경하면 Server를 리부팅 해야 함

3) 접속


  • redis-cli라는 접속 도구 제공
  • 실행하면 로컬에 있는 redis 서버 접속

  • 원격 접속 시
    • redis-cli -h <IP> -p <port> -a <password>
    • IP 생략 시 127.0.0.1, Port 생략 시 6379

4) Redis 자료구조


종류

  • String
  • Hash
  • List → Linked List
  • Set
  • Sorted Set
  • Bitmap → 비트 연산에 사용
  • Hyperloglog → 집합의 item 개수를 추정할 수 있는 알고리즘이자 자료구조
  • Geospatial Index → 지점과 위도 및 경도를 사용할 수 있음
    • 위도와 경도를 계산하여 두 지점 간 거리를 구할 수 있는 명령어 제공
  • Stream → Event Log를 저장
    • 메시지 서비스 제공

String

  • 가장 간단하게 데이터를 저장할 수 있음
  • 최대 512MB
  • Key-Value가 직접 연결 되는 유일한 자료구조
  • 숫자도 저장 가능
    • 증감 연산 가능
      • INCR / INCRBY
  • 저장 시
    • SET <key> <value
  • 조회 시
    • GET <key>
  • 옵션
    • NX → 키가 없을 때만 저장
    • XX → 키가 있을 때만 저장
  • 여러 개를 저장하고자 할 때
    • MGET / MSET
SET hello world
 OK
GET hello
 "world"

SET hello newvalue NX
 (nil)
GET hello
 "world"

SET hello newvalue XX
 OK
GET hello
 "newvalue"

SET cnt 0
 (integer) 1
INCRBY cnt 50
 (integer) 51


MSET name adam age 50 weight 77
 OK
MGET name age weight
   1) "adam"
	1) "50"
	2) "77"

List

  • 하나의 키에 여러 개의 데이터를 저장하는 자료구조
  • 하나의 list에는 43억 개의 데이터를 저장할 수 있음
  • idx를 이용해서 데이터에 직접 접근하는 것이 가능
  • 큐와 스택의 용도로 사용 가능
  • 맨 앞과 맨 뒤에서 데이터를 삽입하고 꺼내는 것도 가능 → 이중 연결 리스트

  • 삽입
    • LPUSH / RPUSH
LPUSH mylist adam
 (integer) 1

RPUSH mylist hunt
 (integer) 2

LPUSH mylist jessica julia
 (integer) 4

  • 범위 내 조회
    • LRANGE key start stop
    • 맨 끝에서부터 조회할 때는 -1, -2 형태의 음수를 사용
LRANGE mylist 0 2
   1) "julia"
	1) "adam"
	2) "hunt"
LRANGE mylist 0 1
   1) "julia"
	3) "hessica"
  • 맨 끝의 데이터를 삭제하며 조회
    • LPOP / RPOP
    • 횟수 설정 가능
LPOP mylist
   1) "jessica"
	1) "adam"
	2) "hunt"
  • 범위를 제외하고 전부 삭제
    • LTRIM
    • 적절히 활용 시 고정된 길이의 Queue를 쉽게 유지 가능
      • 특정 개수의 로그 데이터를 유지하고자 하는 경우
      • LPUSH logdata <DATA>
      • LTRIM 0 99 → 항상 100개의 최신 로그 유지
  • 중간 데이터 삽입 가능
    • LINSERT
    • LINSERT <LISTNAME> BEFORE / AFTER <DATA1> <DATA2>
LINSERT mylist BEFORE adam mark
 (integer) 4
  • 데이터 수정
    • LSET
    • LSET <KEY> <IDX> <VALUE>
      LSET mylist 2 dsfsdf
       OK
      LRANGE mylist 0 -1
         1) "jessica"
        1) "mark"
        2) "\xbe\xc6\xb4\xe3"
        3) "hunt"
      
  • 특정 인덱스 데이터 조회
    • LINDEX
    • LINDEX <IDX>
      LINDEX mylit 2
       "\xbe\xc6\xb4\xe3"
      
  • 특정 데이터 삭제
    • LREM
    • LREM <KEY> <횟수> <값>
    • 데이터 개수 → LLEN <key>

SET

  • 중복 없이 데이터 저장
  • 집합 관련 기능을 제공
  • 삽입: SADD <키> <데이터 나열="">
    SADD myset A A A B B
     (integer) 2
    
  • 데이터 조회
    • SMEMBERS
  • 특정 값이 있는지 조회
    • SISMEMBER
  • 무작위 추출
    • SRANDMEMBER
  • 삭제
    • SREM
  • 마지막 데이터 삭제
    • SPOP
  • SINTER
  • SUNION
  • SDIFF

HASH

  • 하나의 키에 여러 개의 필드와 값을 가질 수 있는 자료구조
  • Java의 HashMap과 유사
  • 필드는 해시 내에서는 유일해야 함

  • 생성 및 필드 추가 및 수정
    • HSET
  • 특정 필드의 값 가져오기
    • HGET
  • 여러 개의 필드의 값 가져오기
    • HMGET
  • 모든 필드 가져오기
    • HGETALL
  • 모든 키 가져오기
    • HKEYS
  • 모든 값 가져오기
    • HVALS
  • 특정 키 삭제
    • HDEL
HSET myhash name adam
 (integer) 1
HSET myhash age 30
 (integer) 1
HSET myhash album genesis
 (integer) 1
HSET myhash age 29
 (integer) 0

HGET myhash age
 "29"

HMGET myhash name age
   1) "adam"
	2) "29"

HGETALL myhash
   1) "adam"
	2) "29"
	3) "genesis"

Sorted Set(ZSet)

  • score 값에 따라 정렬되는 고유한 문자열의 집합
  • 모든 아이템은 score와 값 쌍을 가지며 저장될 때부터 score 값으로 정렬돼 저장
  • score가 동일하면 데이터의 사전 순서대로 정렬

  • list와 sortedset 모두 순서를 갖는 자료구조
    • index를 이용해 item에 접근 가능
  • 인덱스를 이용한 접근 속도는 sortedset이 빠름
    • list는 Linked List이므로 접근 속도가 O(n)
    • SortedSet은 Hash로 idx를 저장하므로 접근 속도가 O(log n)
  • 저장 시 ZADD 키 스코어 값 스코어 값 • • •
  • Options
    • XX
    • NX
    • LT → 업데이트 하고자 하는 스코어가 기존 아이템의 스코어보다 작을 때만 업데이트, 없으면 추가
    • GT → 업데이트 하고자 하는 스코어가 기존 아이템의 스코어보다 클 때만 업데이트, 없으면 추가
ZADD myzset 100 user:B
ZADD myzset 150 user:C 150 user:A 200 user:D
  • Item 조회
    • idx로 조회 ZRANGE 이름 start end WITHSCORES [REV]
      ZRANGE myzset 1 3 WITHSCORES
      
  • 점수로 조회
    • `ZRANGE 이름 start end BYSCORE WITHSCORES [REV]
    • BYSCORE 앞에 “ ( “ 를 추가하면 start 값은 제외

Bitmap

  • String에 비트연산을 수행할 수 있도록 확장된 형태

Hyperloglog

  • 집합의 원소 개수인 카디널리티를 추정할 수 있는 자료구조
  • 대량의 데이터에서 중복되지 않는 고유한 값을 집계할 때 유용함
  • set과 같은 데이터 구조에서는 중복을 피하기 위해 저장된 데이터를 전부 기억함 → 저장되는 데이터가 많아지면 메모리를 많이 사용하게 됨

  • 입력되는 데이터 자체를 저장하지 않고 자체적인 방법으로 데이터를 변경해 처리함
    • 데이터 개수에 상관 없이 일정한 메모리 유지
    • 중복되지 않는 유일한 원소의 개수를 계산 가능
    • 오차는 어느정도 발생
  • 추가
    • PFADD
  • 데이터 개수
    • PFCOUNT

Geospatial

  • 데이터를 위도 및 경도 쌍의 집합으로 젖아
  • 내부적으로는 SortedSet

  • 삽입
    • GEOADD
  • 조회
    • GEOPOS
  • 데이터 사이의 거리
    • GEODIST
GEOADD travel 14.2323 23.23232 prague
GEOADD travel 123.2131 231.2131 seoul 1231.21313 123.3231 SanFrancisco

GEOPOS travel prague

GEODIST travel seoul prague
  • 특정 위치를 기준으로 원하는 거리 내 아이템 검색
    • GEOSEARCH travel 이름 거리 옵션
    • BYRADIUS 옵션을 이용하면 반경, BYBOX는 직사각형 거리

5) 키 관리


  • 키는 존재하지 않을 때 아이템을 넣으면 자동으로 생성
  • 모든 아이템을 삭제하면 키도 자동으로 삭제
  • 키 삭제: DEL키
  • 키의 존재여부: EXISTS 키
  • 특정 패턴 이용해서 키의 존재여부 확인: KEYS pattern(정규표현식)
  • 이름 변경: RENAME key 새로운이름
  • 복제: COPY 기존키 새로운키
  • 모든 키 삭제: FLUSHALL [ ASYNC | SYNC ]
  • UNLINK 키: 키의 데이터를 백그라운드에서 다른 스레드에 의해 처리
  • 데이터의 유효기간 설정
    • EXPIRE key 유지시간(sec) [ NX | XX | GT | NT ]
    • EXPIREAT key {TIMESTAMP} [ NX | XX | GT | NT ]

댓글