일단 Redis.py 로 Redis 를 클라이언트와 설정과 연결을 확인하는 함수를 만들어놓고 Chat.py를 구현하려고 한다.
import redis# {"conversationId":"c2646750-7516-4ea2-85dc-fefb609e6e02","source":"instruct"}
# Redis 클라이언트 설정
redis_client = redis.StrictRedis(
host="localhost", # 로컬 개발 환경에서는 localhost
port=6379,
decode_responses=True
)
# Redis 연결 확인 함수
def get_redis_client():
try:
redis_client.ping()
print("Connected to Redis server successfully!")
return redis_client
except redis.ConnectionError:
print("Failed to connect to Redis server!")
raise
이런식으로 구현 해놓고 chat.py를 구현할때, WebSocket 연결과 Redis 를 사용하기 위해서, 실시간 시스템을 만들어보기 위해 redis 와 chatclient 를 설정해주고 만드는 주요 구성 요소는 WebSocket, Redis, 채팅방 관리를 할껀데 Redis를 활용하기위 해 딕셔너리와 집합
그래서 일단 실시간 체팅을 위해 웹소켓 엔드포인트 를 구현하였다.
@router.websocket("/ws/chat/{room_id}")
async def chat_endpoint(websocket: WebSocket, room_id: str):
await websocket.accept()
if room_id not in chat_clients:
chat_clients[room_id] = set()
chat_clients[room_id].add(websocket)
이렇게 웹소켁을 연결하고 체팅방 초기화 그리고 클라이언트 측 사용자 등록을 할수 잇도록 만들었고 방기반의 유저들 그룹화를 시키면서 중복방지를 시켰다.
그후 메세지 처리시스템을 따로 구현했는데. 나같은경우 메세지 수신과, 타임스템프 (30분 정도 후에 자동삭제) Redis를 활용하기 위해 설정했고
Redis에 메세지가 저장되도록 설정했다.
try:
while True:
# 메시지 수신
data = await websocket.receive_text()
message_data = json.loads(data)
# 타임스탬프 추가
message_data["timestamp"] = datetime.now().isoformat()
# Redis 저장
message_key = f"chat:{room_id}:{message_data['timestamp']}"
redis_client.set(message_key, json.dumps(message_data))
이를 통해 메세지 수신은 Json 형식으로 파싱되도록 만들어 넣고 저장같은 경우 redis 키 저장후 Json으로 직력화한후 영구 저장식으로 만들어 구현을 해보았다.
그후 메세지 조회를 할수 있게끔 짰는데
# 최근 메시지 조회
message_keys = redis_client.keys(f"chat:{room_id}:*")
recent_messages = []
for key in sorted(message_keys)[-50:]:
msg = redis_client.get(key)
if msg:
recent_messages.append(json.loads(msg))
# 브로드캐스팅
disconnected = set()
for client in chat_clients[room_id]:
try:
await client.send_json({
"type": "messages",
"messages": recent_messages
})
except Exception:
disconnected.add(client)
일단 간단하게 메세지의 히스토리를 50개로 제한하고 보관을 하도록 구현해봤고 시간순으로 정렬을 했다 그리고 이미 Json으로 직렬화되어 있기에 역정렬화를 시켜 구현시 log data 가 아닌 내가 입력했던 내용이 나오도록 설정하였다. 그리고 방전체를 브로드케스팅을 하여 실시간으로 모든 체팅방을 연결하였다.
일단 이렇게 세가지를 구성후 FASTAPI를 시작하여 Swagger를 통해 확인후에 Front를 만들어봐야겠다.
'[Redis]' 카테고리의 다른 글
[Redis] Redis 로 미들웨어 및 main 정리 (2) | 2024.12.23 |
---|---|
[Redis] Redis 기반 할일 목록 과 채팅 기능 만들어보기! (4) | 2024.12.20 |
[Redis] Redis 간단정리 (2) | 2024.12.19 |