4 분 소요

0. redis 공부 이유

  • 오픈 소스를 활용해, 자체 프로그램을 개발하기 위해 공부하게 되었다. kafka와 마찬가지로 짬이 난 김에 정리해두려 한다.

1. redis 란?

  • 오픈소스 인메모리 데이터 저장소
    • 인메모리란? 즉, RAM에 저장 시킴으로써, Disk I/O 문제를 일으키지 않고, 빠른 송수신이 가능하게 한다. 단, 영구적으로 저장되지 않기에 휘발성 메모리라, 데이터 영구 저장 시, 별도 데이터베이스가 필요하다.
  • 빠른 속도와 다양한 자료구조 지원 (string, list, set 등)
  • 캐시, 세션 관리, 메시지 큐 등에 활용
  • 혼자 생각 해보는 최대 장단점 : 최우선적으로 설치와 사용이 쉽다……..
    • IPC(Inter-Process Communication) 등의 프로세스 간 통신에서 shm(Shared Memory)의 좋은 대체제
      • 단점 : shm은 OS 커널 레벨에서 직접 메모리 공유하는 방식인데 반해, Redis는 네트워크를 통한 접근하는 별도의 프로세스로 약간의 네트워크 오버헤드가 존재하며, 상대적으로 느릴 수 밖에 없다.
      • 장점 : redis가 별도의 프로세스로 존재하기에 한 서버 내에 다중 redis를 올려, 쉽게 격리 시킬 수 있으며, Python, Go, Java 등 다른 language로 작성된 프로세스 간 IPC에 편리한 인터페이스를 제공한다.
    • 동시성 제어 : Redis의 원자성(Atomicity) 보장
      • 장점 : 싱글 스레드 구조로 여러 클라이언트가 동시에 요청하더라도, 명령어의 실행 순서는 보장된다. 즉, 한 번에 하나의 명령어를 처리함으로써, 명령의 순서와 원자성을 보장한다.(근데 생각 외로… 엄청나게 빠르다.. 초당 8만건 이상 가능하다고 한다…)
      • 단점 : Race Condition이 발생할 수 있다. 즉, 현재 읽는 데이터가 최신 데이터가 아닐 수 있다.(데이터 조회 작업 시, 별도 클라이언트가 데이터 업데이트 명령이 들어오더라도 이는 후 순위 명령이기에 이는, 조회 되는 데이터가 최신 데이터가 아닐 수 있음을 뜻한다.)
        • *Race Condition : 둘 이상의 스레드나 프로세스가 동시에 같은 공유 자원에 접근해 작업

2. redis 설치

  • Ubuntu: sudo apt-get update && sudo apt-get install redis-server
      dev@0a229da298da:/$ sudo apt-get update && sudo apt-get install redis-server
      [sudo] password for dev: ## ssh + sudo로 설치한거라 뜬다.
      Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
      Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
      Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [128 kB]
      Get:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease [128 kB]
      Get:5 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [4801 kB]
      Get:6 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1599 kB]
      Get:7 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [4919 kB]
      Get:8 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [4998 kB]
      Get:9 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [36.8 kB]
      Get:10 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [33.1 kB]
      Get:11 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [1308 kB]
      Get:12 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [4432 kB]
      .
      .
      .
      Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
      Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.
      Processing triggers for systemd (245.4-4ubuntu3.24) ...
      Processing triggers for libc-bin (2.31-0ubuntu9.16) ...
    

3. redis 실행

1) 옵션 설정 파일

  • 위치 : /etc/redis/redis.conf
  • 주요 설정 예시
      port 6379                          <포트설정>
      bind 127.0.0.1                     <IP설정>
      requirepass strongpassword         <접속 시, password요청>
      maxmemory 256mb                    <최대 메모리 사용 제한>
      maxmemory-policy allkeys-lru       <메모리 관리를 위한 키삭제정책>
      save 900 1                         <snapshot 저장 시점 설정(900초)> : 디스크에 데이터 저장
      appendonly yes                     <AOF(Append Only File) 방식 활성화> : 모든 쓰기 명령 기록
      appendfilename "appendonly.aof"    <AOF 로그 파일 이름 지정>
    

2) redis 서버 시작

 sudo redis-server /etc/redis/redis.conf
  • 실행 확인
      dev@0a229da298da:/$ ps aux
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root      2352  0.1  0.1  47228 12104 ?        Ssl  19:46   0:00 redis-server 127.0.0.1:6379
    

3) redis 사용 하기

  • redis-cli 입력
      dev@0a229da298da:/$ redis-cli
      127.0.0.1:6379> PING
      PONG
      127.0.0.1:6379> SET mykey "hello"
      OK
      127.0.0.1:6379> GET mykey
      "hello"
      127.0.0.1:6379>
    

4) redis 자료형 별 명령어 모음

문자열(String)

  • 가장 기본 데이터 타입으로 문자, 숫자, 바이너리 등이 저장 가능
  • 주요 명령어
    • SET key value : 키에 값 저장
    • GET key : 키 값 조회
    • MSET key1 val1 key2 val2 : 여러 키-값 한번에 저장
    • MGET key1 key2 : 여러 키 값 조회
    • INCR key : 키 값 1 증가
    • DECR key : 키 값 1 감소
    • APPEND key value : 기존 값에 문자열 추가

리스트(List)

  • 순서 있는 문자열의 시퀀스, 중복 허용
  • 주요 명령어
    • LPUSH key value : 왼쪽에 값 추가
    • RPUSH key value : 오른쪽에 값 추가
    • LPOP key : 왼쪽 값 제거 및 반환
    • RPOP key : 오른쪽 값 제거 및 반환
    • LRANGE key start stop : 범위 내 값 조회

집합(Set)

  • 중복 없는 순서 없는 문자열 집합
  • 주요 명령어
    • SADD key member : 집합에 멤버 추가
    • SREM key member : 멤버 제거
    • SMEMBERS key : 모든 멤버 조회
    • SISMEMBER key member : 멤버 존재 여부 확인

정렬된 집합 (Sorted Set)

  • 멤버에 점수(score)를 부여해 정렬된 집합
    • 개인 생각 : kafka로 여러 파티션으로 나눈 뒤, 데이터를 읽을 때 순서가 보장되지 않기에, 함께 활용하면 좋은 듯 하다.
  • 주요 명령어
    • ZADD key score member : 멤버와 점수 추가
    • ZRANGE key start stop [WITHSCORES] : 순위 범위 내 멤버 조회
    • ZREM key member : 멤버 제거
    • ZSCORE key member : 멤버 점수 조회

해시 (Hash)

  • 필드-값 쌍으로 구성된 맵(객체 저장에 적합)
    • 개인 생각 : json형태를 자주 활용해 No sql마냥 쓰기도 하는 듯하다.
  • 주요 명령어
    • HSET key field value : 필드에 값 저장
    • HGET key field : 필드 값 조회
    • HGETALL key : 전체 필드와 값 조회
    • HDEL key field : 필드 제거
    • HEXISTS key field : 필드 존재 여부 확인

채널 (Channel)

  • 1대다 메시지 전달에 유용한 Pub/Sub (게시/구독) 모델 지원
  • 주요 명령어
    • SUBSCRIBE channel [channel ...] : 하나 이상의 채널 구독 시작
    • PSUBSCRIBE pattern [pattern ...] : 패턴으로 여러 채널 구독
    • PUBLISH channel message : 채널에 메시지 발행, 구독자에게 전달
    • UNSUBSCRIBE [channel [channel ...]] : 채널 구독 해제 (인자 없으면 모두 해제)
    • PUNSUBSCRIBE [pattern [pattern ...]] : 패턴 구독 해제
    • PUBSUB CHANNELS [pattern] : 활성화된 채널 목록 조회, 패턴 필터 가능
    • PUBSUB NUMSUB channel [channel ...] : 각 채널별 구독자 수 조회
    • PUBSUB NUMPAT : 패턴형 구독자 수 조회

      스트림 (Stream)

  • 메시지 시퀀스 저장, 시계열 데이터에 활용
  • 주요 명령어
    • XADD key ID field value [field value ...] : 메시지 추가 (ID*로 자동생성 가능)
    • XRANGE key start end [COUNT count] : 범위 내 메시지 조회
    • XREAD [COUNT count] STREAMS key ID : 스트림에서 메시지 읽기
    • XDEL key ID [ID ...] : 메시지 삭제

태그:

카테고리:

업데이트:

댓글남기기