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
- 키-값 쌍으로 이루어진 데이터 구조
- Strings
⇒ 검색은 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”}’
- ZREM key member
- 특정 키의 특정 멤버 삭제
- ZRANK key member
- 특정멤버의 위치 정보 반환(0부터 시작)
- 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
- redis를 잠금(Lock) 메커니즘으로 사용
- 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 |