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 관점에서 사용하며, 가장 많이 활용되는 패턴이다.
- cache에 데이터가 있는지 확인한다.
- DB에서 데이터를 조회한다.
- 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만건까지 지연없이 처리할 수 있다고 한다.
💾활용사례
- Cache : cache로 활용할 수 있다.
- Session Store : 세션을 저장할 수 있다.
TTL
을 설정하여 세션의 만료시간을 설정할 수 있다.
- Pub/Sub : 메시지 발행인 Publish 메시지 구독인 Subscribe의 약자로써 클라이언트가 메시지를 주고 받을 수 있게 기능을 제공해준다.
이러한 특징을 활용해서 Message Queue로도 활용할 수 있다.
- GeoSpatial : 지리 공간 데이터를 Redis에 적재하고 쿼리할 수 있다.
- 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 : 동시에 같은 키를 참조할 때 트랜잭션 취소
- Transaction을 시작하기 전에 WATCH할 key를 선택한다.
- 해당 key가 다른 CLI에서 변경되게되면 Transaction이 취소된다.