Blog
컴퓨터 공학
Database
Redis
레디스 세션 관리

Redis 세션 관리[레디스 세션 관리]: 클라이언트 연결 및 세션 데이터 일괄 삭제 가이드

Redis를 세션 스토어로 사용할 때, 개발이나 테스트 환경에서 쌓인 세션 데이터와 클라이언트 연결을 깔끔하게 정리해야 하는 경우가 자주 있습니다. 이 글에서는 DataGrip을 사용해서 Redis의 세션 관련 데이터와 클라이언트 연결을 효율적으로 관리하는 방법을 알아보겠습니다.

사전 준비: DataGrip에서 Redis 연결

먼저 DataGrip에서 Redis에 연결해야 합니다.

  1. 데이터소스 추가: Database+Data SourceRedis
  2. 연결 정보 입력: Host, Port(기본 6379), 인증 정보 설정
  3. 연결 테스트: Test ConnectionOK
  4. 콘솔 열기: 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의 강력한 콘솔 기능을 활용하여 안전하고 효율적으로 세션을 관리해보세요.