본문 바로가기
Database

[Redis] 설치, Redis란

by qoth_0 2023. 11. 27.
728x90
반응형

Redis (Remote Dictionary Server) 개요

  • 고성능의 키-값(key-value)저장소로, 거대한 맵(Map=dictionary) 데이터 저장소형태를 가지고 데이터를 메모리에 저장(인메모리 데이터베이스)하여 빠른 읽기와 쓰기를 지원 - 성능을 위해 사용
    • mariadb도 캐싱을 통해 메모리에 임시저장할 수 있지만 기본적으로 스토리지를 사용하기 때문에 보다 느리다
  • 주로 캐싱, 세션관리(로그인 인증값은 빈번하게 조회되고 빨리 조회되어야 하기 때문에 redis로 사용), db 동시성 제어(RDB 차원에서 지원하는 락은 update 시 select for update(조회)와 동시에 해야하기 때문에 느리고, 데드락 이슈 발생 가능 - Redis는 락의 유무를 관리해서 select for update없이 y/n만 바꾸면 되기 때문에 빠르게 가능, 순서보장도 리스트로 가능) 등에서 다양한 목적으로 사용

특징

  • key-value로 구성된 단순화된 데이터 구조로 sql 쿼리 사용 불필요
  • 기본으로 16개의 데이터베이스 공간이 존재 - 그냥 들어가면 0번으로 들어감 (0~15)
  • 빠른 성능
    • 인메모리 NoSQL 데이터베이스로서 빠른 성능
    • key-value는 구조적으로 해시 테이블 사용함으로서 매우 빠른 속도로 데이터 검색 가능
    • Single Thread 구조로 동시성 이슈 발생 X(한번에 하나만 실행) - 비동기적으로 빠르게 처리 가능
      • Thread는 프로세스 안에서 처리할 수 있는 task 단위
      • 동기는 request를 받아서 thread에 1개가 할당 되면 response될 때 까지, 해당 작업이 다 완료될 때까지 기다려야 함
      • 비동기는 작업을 thread가 할당 받아서 모두 다 완료될 때까지 기다리지 않음 - 작업의 처리를 위임하고 다른 사용자의 요청을 받음
    • 윈도우 서버에서는 지원하지 않고, linux서버 및 macOS 등에서 사용 가능 - 도커에서 지원함

설치

sudo apt-get update

sudo apt-get install -y redis-server

redis-server —version

redis-cli  # 접속

자료구조

  • String, Lists, Sets, Sorted Sets, Hashes 등의 자료 구조를 지원 - key는 항상 String, value의 자료구조가 다른 것
    • Strings
      • 텍스트나 숫자 데이터 저장
      • 가장 일반적인 key-value 구조의 형태
    • Lists
      • 순서가 있는 문자열 목록
    • Sets
      • 중복을 허용하지 않는 문자열 집합, 순서 없음
    • Sorted Sets
      • 점수가 할당된 문자열로 이루어진 집합, 정렬된 순서로 관리
    • Hashes
      • 키-값 쌍으로 이루어진 데이터 구조

⇒ 검색은 list는 항상 느리고 set, map이 빠르다

hash set, hash map→해시 테이블 : 매우빠르게 특정 값을 찾아올 수 있다.

명령어

  • 데이터베이스는 0~15까지로 16개로 구성
    • select 데이터베이스숫자
    • 최초 접속시 default 0
  • String
    • 키에 값을 설정
      • SET key value
    • 키의 값을 가져옴
      • GET key

      ⇒ key는 유일해야 하기 때문에 같은 key로 set하면 덮어쓰기가 됨

    • NX 문법
      • SET if Not eXists : 키가 없으면
      • set key value nx

      ⇒ 키가 존재 하므로 바뀌지 않음

    • EX 문법
      • 만료시간
      • set key value ex 초단위시간

      ⇒ 10초 지나니 만료되어 get 불가능 (로그인 세션의 경우 사용됨)

      • “EXPIRE key네임 3600” 이런식으로 별도 부여 가능
    • 모든 key값 조회
      • keys *
    • 키 삭제
      • DEL key명
      • 전체 key 삭제는 FLUSHDB(현재 데이터베이스의 모든 key 삭제)
  • List
    • Redis 리스트는 간단한 메시징 큐로 사용될 수 있음
    • 예를들어 작업 스케줄링, 최근 웹사이트 방문 캐싱 등
      • 데이터 추가 : LPUSH, RPUSH
      • 데이터 추출 : LPOP key, RPOP key
      • 데이터 개수 : LLEN key
      • member 조회 : lrange key명 start end (전체 조회면 end에 -1)

      ⇒ 오른쪽 왼쪽 구분

      ⇒ rpop으로 가장 오른쪽 4 추출 후 삭제

      ⇒ rpush, lpop으로 순차 작업 스케쥴링 가능

  • TTL(Time To Live), 즉 유효시간 사용 - redis의 주요목적인 캐싱에 사용
    • 만료시간 지정
      • EXPIRE key명 3600
      • 여기서 만료시간은 초단위
    • ttl [key]
      • 남은 만료시간 확인

    ⇒ 만료시간이 지나면 음수로 변함

  • SET
    • 고유한 사용자 ID 목록, 이벤트에서 한 번만 참여할 수 있는 사용자 관리 등에 사용 가능
    • SET(집합)에 멤버 추가
      • SADD myset member
        중복 불가
    • SET의 모든 멤버 반환
      • SMEMBERS myset
        순서 없음
    • 특정 멤버 삭제
      • SREM myset member1 member2
    • 멤버 갯수 반환
      • SCARD myset
  • ZSET(정렬된 집합)
    • 주식, 코인 등의 실시간 시세 또는 게임등의 사용자의 점수나 순위를 관리하는데 사용
    • ZADD key score member
      • score : 멤버를 정렬하는 데 사용되는 점수
      • member형식을 json형식으로도 가능
        • ex)zadd key 1 ‘{”hello”:”world”}’
      SMEMBERS로 조회 불가
    • ZREM key member
      • 특정 키의 특정 멤버 삭제
    • ZRANK key member
      • 특정멤버의 위치 정보 반환(0부터 시작)
      score랑 다름, 그냥 set 내 순서를 나타냄
      score 0을 추가하니 ZRANK 0이었던 member1이 ZRANK 1이 됨
    • ZRANGE key 0 -1
      • score기준 오름차순 조회
    • ZREVRANGE key 0 -1
      • score기준 내림차순 조회

사례별 실습

  • counter 값을 활용한 increment 시키기
    • 적용 가능 서비스
      • 좋아요 기능을 위한 increment값을 빠르게 반영할 수 있고, 추후 RDB에 업데이트 가능

      ⇒ 특정 key에 숫자값 0을 set, INCR 키명, DECR 키명, 키 조회

      • 로그인을 위한 세션데이터 insert 및 get
        • SET session:세션번호 hello1@naver.com ex 3600
        • GET session:세션번호
        • 만약 데이터가 없을경우 null return
      • redis를 통한 동시성 이슈 해결
        • redis를 잠금(Lock) 메커니즘으로 사용
          • SET item_stock_lockk user_email NX EX 30
          • GET item_stock_lockk 를 통해 lock여부 확인
          • DEL item_stock_lockk
      • list를 활용한 최근 방문 페이지 또는 최근 살펴본 상품 리스트 등 구현
        • rpush, rpop을 통해 구현
      • zset을 활용한 예매 시스템 waiting 구현
        • 순차적으로 데이터 정렬 필요
        • 전체 데이터의 개수와 나의 위치를 빠르게 찾을 수 있어야함

          ⇒ ZRANK로 대기열 순서를 반환해 사용자 편의를 높일 수 있다

          ⇒ 예매완료 후 RDB에 insert가 끝나면 랭크가 0인 요청부터 del

728x90
반응형

'Database' 카테고리의 다른 글

[MariaDB] DB 서버 구성  (2) 2023.11.27
[MariaDB] 정규화  (2) 2023.11.27
[MariaDB] DB 설계  (1) 2023.11.27
[MariaDB] DB Dump  (1) 2023.11.24
[MariaDB] 저장 프로시저  (1) 2023.11.24