Redis 주요 동기(Synchronous) 명령어
- 명령어 실행시 Redis 메인 스레드가 차단, 블로킹(Blocking)
- 명령어 처리 완료 후 클라이언트에 응답
- 데이터 일관성 보장, 데이터 처리 완료 후 다음 명령어 처리
Redis 비동기(Asynchronous) 명령어
- 메인 스레드에서 키 참조를 즉시 해제하지만, 실제 메모리 해제는 백그라운드 스레드에서 처리
- 대규모 데이터 삭제, 백업 작업 시 사용
- Redis 메인 스레드의 차단을 최소화하여 서비스 성능에 미치는 영향을 줄임
동기 / 비동기 사용 케이스 비교
| 동기 | 비동기 |
| 작고 빠른 작업에 적합 | 큰 데이터 삭제, 백그라운드 작업 시 적합 |
| 메모리 부족 상황에서 즉시 메모리 회수 | 메인 스레드 차단을 최소화 |
| 데이터 일관성 보장 | 서비스 중단 없이 대량 데이터 처리 |

동기 / 비동기 명령어 비교
| 동기 | 비동기 | 설명 |
| SET key value | X | 단일 키-값 쌍 저장 |
| GET key | X | 단일 키 값 조회 |
| DEL key | UNLINK key | 키 삭제 |
| LPUSH list value | X | 리스트에 값 추가 (왼쪽 삽입) |
| HSET hash field value | X | 해시에 필드-값 쌍 추가 |
| FLUSHALL | FLUSHALL ASYNC | 모든 데이터베이스 초기화 |
| ZADD zset score member | X | 정렬된 집합(Sorted Set)값 추가 |
| EXPIRE key seconds | PEXPIRE key milliseconds | 키의 TTL(만료 시간) 설정 |
| SAVE | BGSAVE | 스냅샷(RDB파일) 생성 |
| SLAVEOF host port | RELICAOF host port | 마스터-슬레이브 복제 설정 |
| X | MEMORY PURGE | 백그라운드에서 메모리 비우기 |
성능 비교 ( 리스트 삭제 시 )
예제 코드
import redis
import time
import psutil
# Redis 연결
redis_client = redis.Redis(host='localhost', port=6379, db=1, decode_responses=True)
# 테스트 데이터 생성 (1,000,000 키)
print("Generating test data...")
for i in range(1000000):
redis_client.set(f"key:{i}", "value")
print("Test data generated.\n")
# 메모리 사용량 체크 함수
def get_memory_usage():
process = psutil.Process()
mem = process.memory_info().rss / (1024 * 1024)
return f"{mem:.2f} MB"
# 1. 동기 명령어 DEL 성능 테스트
print("Testing DEL (Synchronous)...")
start_time = time.time()
for i in range(1000000):
redis_client.delete(f"key:{i}")
sync_duration = time.time() - start_time
print(f"DEL Duration: {sync_duration:.2f} seconds")
print(f"Memory Usage After DEL: {get_memory_usage()}\n")
# 테스트 데이터 재생성
print("Regenerating test data...")
for i in range(1000000):
redis_client.set(f"key:{i}", "value")
print("Test data regenerated.\n")
# 2. 비동기 명령어 UNLINK 성능 테스트
print("Testing UNLINK (Asynchronous)...")
start_time = time.time()
for i in range(1000000):
redis_client.unlink(f"key:{i}")
async_duration = time.time() - start_time
print(f"UNLINK Duration: {async_duration:.2f} seconds")
print(f"Memory Usage After UNLINK: {get_memory_usage()}\n")
# 결과 비교
print("====== Summary ======")
print(f"DEL (Sync) Duration: {sync_duration:.2f} seconds")
print(f"UNLINK (Async) Duration: {async_duration:.2f} seconds")
결과
- 위 내용대로 메모리는 async명령어가 더 사용하고, 실행 속도는 sync명령어가 더 느림
- 100만건의 데이터의 예제였지만 데이터가 커질 수록 이 차이는 벌어짐
DEL Duration: 44.78 seconds
Memory Usage After DEL: 29.27 MB
Testing UNLINK (Asynchronous)...
UNLINK Duration: 43.97 seconds
Memory Usage After UNLINK: 29.53 MB
====== Summary ======
DEL (Sync) Duration: 44.78 seconds
UNLINK (Async) Duration: 43.97 seconds
참조 :
Sync and async
Sync and async functions
redis.io
'Storage > Redis' 카테고리의 다른 글
| Redis - Queue (0) | 2025.02.04 |
|---|---|
| Redis - 입문 (0) | 2024.10.03 |