Redis Persistence
Redis는 데이터를 영구 저장하기 위해 다양한 지속성 옵션을 제공함
-
RDB(Redis Database) : RDB 지속성은 데이터 세트의 특정 시점 스냅샷을 일정한 간격으로 지정
- 장점
- 자식 프로세스를 포크하여 디스크 작업을 수행하므로 성능에 영향을 주지 않음
- 대규모 데이터 세트의 경우 AOF보다 빠르게 재시작 가능
- S3나 데이터센터 등 다양한 저장소에 전송 가능해서 재해 복구에 유리함
- 단점
- RDB는 자주 백업하지 않기 때문에 중단될 경우 최신 몇 분간의 데이터가 손실될 수 있음
- 데이터 세트가 큰 경우 자식 프로세스를 포크하는 데 시간이 걸릴 수 있고 이로 인해 클라이언트 서비스가 일시적으로 중단될 수 있음
- 장점
-
AOF(Append Only File) : AOF 지속성은 서버가 받은 모든 쓰기 작업을 기록
- 장점
- 기본적으로 매초 fsync를 수행해서 1초의 데이터 손실만 발생할 수 있음
- 잘못된 명령이 로그에 남아도 redis check aof에서 쉽게 수정 가능
- AOF 파일이 너무 커지면 Redis가 백그라운드에서 자동으로 로그를 재작성
- 단점
- 동일한 데이터 세트에 대해 AOF 파일이 RDB 파일보다 큼
- 재작성 중에 많은 메모리를 사용할 수 있음
- 특징
- AOF 파일은 갈수록 커짐 👉 백그라운드에서 AOF 파일을 재작성해서 불필요한 항목 제거 (2.4 버전부터)
- 장점
Snapshotting
save 60 1000
AOF 설정
appendonly yes
AOF 파일의 내구성
- appendfsync always : 매우 안전하지만 매우 느림
- 모든 Redis 명령이 실행될 때마다 AOF 로그 파일에 fsync를 수행
- appendfsync everysec : 기본 설정으로 빠르고 비교적 안전함
- Redis는 매 초마다 AOF 로그 파일에 fsync를 수행
- appendfsync no : 가장 빠르지만 안전하지 않음
실습용 docker 구성
- docker compose yaml
services:
redis:
image: redis:latest
container_name: redis
environment:
REDIS_PASSWORD: df159357
ports:
- "6379:6379"
- 실행 및 접속
docker-compose up -d
docker exec -it redis redis-cli
Redis Indexing
https://redis.io/docs/latest/develop/interact/search-and-query/indexing/ (opens in a new tab)
docker compose 파일
- 이미지를 RedisSearch와 RedisJSON 모듈이 포함된 이미지를 사용해야 한다.
services:
redis:
image: redislabs/redisearch:latest
사용방법
- 기본형
FT.CREATE (index_name) ON JSON SCHEMA {json_path} AS {attribute} {type}
- 실사용 예시
RedisJSON 모듈을 사용해서 JSON 데이터 생성
JSON.SET user:1 $ '{"name":"John Doe","age":30,"email":"john.doe@example.com"}'
- 인덱스 생성
FT.CREATE myIndex ON JSON SCHEMA $.name AS name TEXT
- 인덱스 검색
FT.SEARCH myIndex "@name:John Doe"
# 인덱스 설정 안할경우 아래와 같은 에러 발생
127.0.0.1:6379> FT.SEARCH myIndex "@name:John Doe"
(error) myIndex: no such index
# 검색 성공한 경우
127.0.0.1:6379> FT.SEARCH myIndex "@name:John Doe"
1) (integer) 1
2) "user:1"
3) 1) "$"
2) "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}"
인덱스 생성 방식
- 인덱스를 작성한 후 Redis Stack은 데이터베이스에 저장된 기존, 수정 또는 새로 작성된 JSON 문서를 자동으로 인덱싱함
- 기존 문서의 경우 인덱싱이 백그라운드에서 비동기식으로 실행되므로 문서를 사용할 수 있기까지 시간이 걸릴 수 있음
검색 동작 원리
- FT.SEARCH 방식과 FT.AGGREGATE 방식이 있음
- 기본적인 검색 기능을 제공, 빠른 검색 성능
- FT.AGGREGATE
- 검색 결과를 집계하고 분석하는 기능을 제공
Hilighting
- 검색한 문자를 Hilighting할 수 있음
127.0.0.1:6379> FT.SEARCH itemIdx '(@name:(bluetooth))|(@description:(bluetooth))' RETURN 3 name description price HIGHLIGHT FIELDS 2 name description TAGS '<b>' '</b>'
1) "2"
2) "item:1"
3) 1) "name"
2) "Noise-cancelling <b>Bluetooth</b> headphones"
3) "description"
4) "Wireless <b>Bluetooth</b> headphones with noise-cancelling technology"
5) "price"
6) "99.98"
4) "item:2"
5) 1) "name"
2) "Wireless earbuds"
3) "description"
4) "Wireless <b>Bluetooth</b> in-ear headphones"
5) "price"
6) "64.99"