Blog
컴퓨터 공학
Database
Redis

Redis

Remote Dictionary Server의 약자이다.
In Memory Database로써 cache 저장, 세션 저장 등에 활용되는 데이터베이스이다.

Cache

cache hit이 얼마나 되는지가 서버 운영관점에서 중요하다. 왜냐하면 cache 서버를 따로 관리하는게 의미가 없을 정도로 chache hit이 적다면 cache 서버를 제외 하는게 낫기 때문이다.

  • chache hit : cache에 데이터가 존재하는 경우
  • cache miss : cache에 데이터가 존재하지 않는 경우

Cache 패턴

Cache Aside Pattern

read 관점에서 사용하며, 가장 많이 활용되는 패턴이다.

  1. cache에 데이터가 있는지 확인한다.
  2. DB에서 데이터를 조회한다.
  3. DB에서 데이터를 조회했다면 이를 cache에 저장한다. 3-1. 3에서 저장할 때 TTL을 함께 저장하게 되는데 이는 cache의 만료시간을 설정해서 cache의 메모리가 부족한 경우를 대비하기 위해서이다.

Write-Back Pattern

write 관점에서 활용되는 패턴이다.

특징

  • 다수의 write 요청이 들어오면 cache에 데이터를 저장하고 DB에 데이터를 저장한다.
  • 쓰기 부하를 cache로 줄일 수 있다.
  • cache가 유실될 가능성이 있고 복잡한 데이터는 어려울 가능성이 있다.

특징

💾Persist on Disk

Redis에서는 가용성과 백업을 위해서 Disk에 데이터를 저장할 수 있다.
크게 두 가지 방식으로 구분되는데 하나는 RDB(Snapshot) 방식이고, 다른 하나는 AOF(Append Only File) 방식이다.

💾Data Types

String, List, Set, Sorted Set, Hash 등 다양한 데이터 타입을 지원한다.

💾Single Thread

싱글스레드임에도 불구하고 초당 10만건까지 지연없이 처리할 수 있다고 한다.

💾활용사례

  1. Cache : cache로 활용할 수 있다.
  1. Session Store : 세션을 저장할 수 있다. TTL을 설정하여 세션의 만료시간을 설정할 수 있다.
  1. Pub/Sub : 메시지 발행인 Publish 메시지 구독인 Subscribe의 약자로써 클라이언트가 메시지를 주고 받을 수 있게 기능을 제공해준다.

이러한 특징을 활용해서 Message Queue로도 활용할 수 있다.

  1. GeoSpatial : 지리 공간 데이터를 Redis에 적재하고 쿼리할 수 있다.
  1. Leader Board : 사용들간 경쟁할 수 있는 점수체계를 말하고 순위대로 표시할 수 있는 기능을 제공한다. Sorted Set 데이터 타입을 통해서 Leader Board를 간단하게 구현할 수 있다.

명령어

  • CLI 실행
docker exec -it [레디스 컨테이너 ID] redis-cli

해당 명령어 뒤에 GET이나 SET 등의 명령어를 입력해서 결과를 출력할 수 있다.

docker exec -it [레디스 컨테이너 ID] redis-cli GET [KEY]
docker exec -it [레디스 컨테이너 ID] redis-cli SET [KEY]

물론 CLI에 접속한 상태에서 GET [KEY]와 같이 입력해도 된다.

  • slowlog get

명령어 처리과정에서 시간이 많이 소요된 결과들을 확인할 수 있다. 처리 시간이 10초 이상 경과된 명령에 대해서 기록을 해놓는다.

  • info

다양한 정보를 확인할 수 있다.

  • --stat

메모리 사용률, 클라이언트 개수, Block된 개수 등을 볼 수 있다.
간단하게 Redis의 리소스를 확인하는데 유용하다.

  • monitor
  • benchmark

/bin/bash 쉘로 접속해서 redis-benchmark 명령어를 입력하면 된다.

// bash 쉘로 접속
docker exec -it [레디스 컨테이너 ID] /bin/bash
// benchmark 실행
redis-benchmark
  • SELECT [DB번호]

데이터베이스를 변경할 수 있다.
0번 데이터 베이스에서 1번 데이터베이스의 데이터를 조회하거나 변경할 수 없다.

🛠️컨테이너 생성

docker run --rm -it -d -p 6379:6379 redis

GET SET

키에 :을 사용해서 관용적으로 표현할 수 있다.

예시
SET users:1:email lee@fastcampus.co.kr
GET users:1:email

MGET

여러개의 키에 대한 값을 조회할 수 있다.

MGET key1 key2

INCR

키의 값(밸류)을 1씩 증가시킨다.

INCR counter

INCRBY

키 뒤에 붙은 수만큼 값을 증가시킨다.

INCRTBY counter 10

DECR

INCR의 반대

EXPIRE / DEL

  • EXPIRE [KEY] [TIME] : 키가 만료될 시간을 알 수 있다.
  • TTL [KEY] : 키가 만료될 시간을 초 단위로 알 수 있다.
EXPIRE counter 10
TTL counter

DEL(sync) / UNLINK(async)

  • DEL : 키를 삭제한다. 동기적으로 동작하는 명령어이다.
DEL counter
  • UNLINK : 키를 삭제하는데 비동기적으로 동작한다.
    서비스 운영 관점에서보면 삭제로 인한 메모리 점유가 적기 때문에 UNLINK를 사용하는 것이 좋다.
UNLINK counter

MEMORY USAGE

해당키의 메모리 점유율을 알 수 있다. 이 때 단위는 byte이다.

MEMORY USAGE counter

SCAN

redis의 bash로 접속한 후 아래의 쉘 명령어를 통해서 100,000개의 키를 생성한다.

\는 빼고 돌려야 함
for i in \{00000..99999}; do echo set key$i $i >> redis-strings.txt; done
cat redis-strings.txt | redis-cli --pipe

SCAN [시작인덱스] MATCH [패턴] COUNT [개수]를 통해서 키를 조회할 수 있다.

예시
SCAN 10000 MATCH * COUNT 10000

Redis Insight

설정해보기

🧱Data Type

String

maximum 512MB

Lists

Queue, Stack 타입의 데이터 구조를 가진다.

LPUSH

리스트의 왼쪽에 데이터를 추가한다.

RPUSH

리스트의 오른쪽에 데이터를 추가한다.

LPOP

리스트의 왼쪽에서 데이터를 꺼낸다.

RPOP

리스트의 오른쪽에서 데이터를 꺼낸다.

LLEN

리스트의 길이를 알 수 있다.

LRANGE

리스트의 범위를 알 수 있다.

lrange [key] [start] [end]
👇 마지막 인덱스까지 조회
lrange books 0 -1

Sets

SADD

Set에 데이터를 추가한다.

SREM

Set에 데이터를 삭제한다.

SMEMBERS

Set에 있는 데이터를 조회한다.

SISMEMBER

Set에 데이터가 있는지 확인한다.

SINTER

중복된 데이터를 조회한다.

SCARD

Set의 길이를 구한다.

Sorted Sets

ZADD

Sorted Set에 데이터를 추가한다.

ZRANGE

Sorted Set에 데이터를 조회한다.

  • byscore limit : 점수의 범위를 지정할 수 있다.

ZRANGEBYSCORE

Score를 기준으로 데이터를 조회한다.

ZREM

Sorted Set에 데이터를 삭제한다.

ZCARD

Sorted Set의 길이를 구한다.

ZRANK

데이터의 순위를 구한다.

ZINCRBY

데이터의 Score를 증가시킨다.

Hashes

HSET, HGET, HGETALL

HDEL

HINCRTBY

GeoSpatial

  • GEOADD
  • GEOSEARCH
  • GEODIST
  • GEOPOS

Bitmap

0 또는 1의 값으로 이루어진 비트열, 메모리를 적게 사용하여 대량의 데이터 저장에 유용하다.

  • SETBIT
  • GETBIT
  • BITCOUNT

Transaction

  • MULTI : 트랜잭션의 시작

👇 MULTI는 트랜잭션의 시작을 알리고 이후에 실행되는 모든 명령어는 트랜잭션에 대기하기 때문에 트랜잭션을 실행하기 전에는 다른 곳에서 결과를 알 수 없다.

  • EXEC : 트랜잭션 실행

👇 EXEC명령어 실행 후에 트랜잭션에 대기하던 명령어가 실행되어서 다른 CLI 창에서도 값을 확인할 수 있다.

  • DISCARD : 트랜잭션 취소
  • WATCH : 동시에 같은 키를 참조할 때 트랜잭션 취소
  1. Transaction을 시작하기 전에 WATCH할 key를 선택한다.
  2. 해당 key가 다른 CLI에서 변경되게되면 Transaction이 취소된다.