Redis 세션 관리[레디스 세션 관리]: 클라이언트 연결 및 세션 데이터 일괄 삭제 가이드
Redis를 세션 스토어로 사용할 때, 개발이나 테스트 환경에서 쌓인 세션 데이터와 클라이언트 연결을 깔끔하게 정리해야 하는 경우가 자주 있습니다. 이 글에서는 DataGrip을 사용해서 Redis의 세션 관련 데이터와 클라이언트 연결을 효율적으로 관리하는 방법을 알아보겠습니다.
사전 준비: DataGrip에서 Redis 연결
먼저 DataGrip에서 Redis에 연결해야 합니다.
- 데이터소스 추가:
Database
→+
→Data Source
→Redis
- 연결 정보 입력: Host, Port(기본 6379), 인증 정보 설정
- 연결 테스트:
Test Connection
→OK
- 콘솔 열기: Redis 데이터소스 우클릭 →
Jump to Console
세션 데이터 일괄 삭제
1. 전체 세션 데이터 삭제
가장 간단하지만 강력한 방법입니다.
-- 현재 데이터베이스의 모든 데이터 삭제
FLUSHDB
-- 모든 데이터베이스의 데이터 삭제
FLUSHALL
⚠️ 주의: 이 명령어는 세션 외의 모든 데이터도 함께 삭제합니다.
2. 패턴별 세션 데이터 선별 삭제
세션 키가 특정 패턴을 따르는 경우 선별적으로 삭제할 수 있습니다.
-- Spring Session 삭제
EVAL "
local keys = redis.call('keys', 'spring:session:*')
if #keys > 0 then
return redis.call('del', unpack(keys))
else
return 0
end
" 0
-- Django Session 삭제
EVAL "
local keys = redis.call('keys', 'django.contrib.sessions.cache*')
if #keys > 0 then
return redis.call('del', unpack(keys))
else
return 0
end
" 0
-- 일반적인 세션 패턴 삭제
EVAL "
local keys = redis.call('keys', 'session:*')
if #keys > 0 then
return redis.call('unlink', unpack(keys))
else
return 0
end
" 0
3. 안전한 세션 정리 프로세스
삭제 전 반드시 확인하는 습관을 들이는 것이 좋습니다.
-- 1단계: 현재 세션 키 개수 확인
KEYS "session:*" | wc -l
-- 2단계: 샘플 키 확인
SCAN 0 MATCH "session:*" COUNT 10
-- 3단계: 안전한 삭제 실행
EVAL "
local cursor = '0'
local deleted = 0
repeat
local result = redis.call('SCAN', cursor, 'MATCH', 'session:*', 'COUNT', 100)
cursor = result[1]
local keys = result[2]
if #keys > 0 then
deleted = deleted + redis.call('UNLINK', unpack(keys))
end
until cursor == '0'
return deleted
" 0
클라이언트 연결 관리
1. 연결 상태 확인
클라이언트 정리 전에 현재 상황을 파악합니다.
-- 연결된 클라이언트 목록
CLIENT LIST
-- 클라이언트 연결 수 확인
INFO clients
-- 현재 내 연결 ID 확인
CLIENT ID
2. 조건별 클라이언트 연결 해제
-- 모든 일반 클라이언트 연결 해제 (본인 제외)
CLIENT KILL TYPE normal
-- 5분 이상 IDLE 상태인 클라이언트만 해제
CLIENT KILL TYPE normal MAXAGE 300
-- 특정 IP의 모든 연결 해제
CLIENT KILL ADDR 192.168.1.100:0
-- 특정 사용자의 연결 해제 (ACL 사용 시)
CLIENT KILL USER session_user
3. 세션 관련 클라이언트만 선별 해제
애플리케이션별로 클라이언트를 구분해서 정리할 수 있습니다.
-- 특정 클라이언트 이름을 가진 연결 해제
CLIENT KILL TYPE normal NAME "spring-session-client"
-- 특정 포트 범위의 클라이언트 해제
EVAL "
local clients = redis.call('CLIENT', 'LIST')
local killed = 0
local myId = redis.call('CLIENT', 'ID')
for line in clients:gmatch('[^\r\n]+') do
local id = tonumber(line:match('id=(%d+)'))
local port = tonumber(line:match('addr=[^:]+:(%d+)'))
if id and id ~= myId and port and port >= 50000 and port <= 60000 then
redis.call('CLIENT', 'KILL', 'ID', id)
killed = killed + 1
end
end
return killed
" 0
통합 세션 정리 스크립트
세션 데이터와 클라이언트를 한 번에 정리하는 종합적인 스크립트입니다.
-- 종합 세션 정리
EVAL "
-- 1. 세션 데이터 삭제
local sessionKeys = redis.call('keys', 'session:*')
local deletedKeys = 0
if #sessionKeys > 0 then
deletedKeys = redis.call('unlink', unpack(sessionKeys))
end
-- 2. 세션 관련 클라이언트 연결 해제
local clients = redis.call('CLIENT', 'LIST')
local killedClients = 0
local myId = redis.call('CLIENT', 'ID')
for line in clients:gmatch('[^\r\n]+') do
local id = tonumber(line:match('id=(%d+)'))
local name = line:match('name=([^%s]*)')
if id and id ~= myId and name and name:match('session') then
redis.call('CLIENT', 'KILL', 'ID', id)
killedClients = killedClients + 1
end
end
return {deletedKeys, killedClients}
" 0
실행 후 검증
정리 작업 후에는 반드시 결과를 확인합니다.
-- 세션 키 개수 확인
EVAL "return #redis.call('keys', 'session:*')" 0
-- 클라이언트 연결 수 확인
INFO clients
-- 전체 키 개수 확인
DBSIZE
-- 메모리 사용량 확인
INFO memory
주의사항 및 베스트 프랙티스
운영 환경에서의 주의점
- 백업 우선: 중요한 데이터가 있다면 사전에 백업
- 단계적 접근:
MAXAGE
조건을 활용해 단계적으로 정리 - 모니터링: 정리 전후 시스템 상태 비교
- 애플리케이션 영향도 확인: 세션 삭제 시 로그아웃 처리 방식 고려
성능 고려사항
- 대용량 데이터의 경우
UNLINK
사용 (비동기 삭제) KEYS
대신SCAN
사용으로 블로킹 최소화- 배치 크기 조절로 메모리 사용량 관리
자동화 고려사항
정기적인 세션 정리가 필요하다면 Redis의 TTL 설정이나 애플리케이션 레벨에서의 자동 정리 로직 구현을 고려해보세요.
-- 새로운 세션에 TTL 설정 예시
SET session:user123 "session_data" EX 3600 -- 1시간 후 자동 삭제
Redis 세션 관리는 개발 효율성과 시스템 안정성에 직결되는 중요한 작업입니다. DataGrip의 강력한 콘솔 기능을 활용하여 안전하고 효율적으로 세션을 관리해보세요.