redis
-
Redis: n분 동안 키워드 랭킹? timeseries컴퓨터/JAVA 2025. 3. 15. 22:37
1시간 동안 메시지 수 그래프 등 기능을 만들기 위해somekey::keywords: 와 같이 정렬된 집합 (ZSET)을 주로 쓰고 있었다. 문제는 문서에 따르면 small size의 ZSET은 압축된 형식 (ziplist/listpack)으로 저장하지만,항목 개수 또는 항목 크기 제한을 초과하면 자동으로 Hashtable로 변환된다고 한다. (메모리 2배 이상 증가 가능) 그래서 TimeSeries 데이터 구조를 사용하면 빠르고 효율적으로 시간 기반 쿼리가 가능하다고 한다.redis-stack이나 enterprise 깔면 쉬운데 일단 wsl2 환경에서 redis-server를 로컬로 돌리고 있으니모듈을 설치해야 한다. (아니면 아래 명령어를 통해 모듈이 있나 확인)redis-cli> MODULE LIS..
-
HyperLogLog 데이터 구조컴퓨터/Go language 2024. 4. 3. 17:49
매일 접속한 unique 사용자들을 어떻게 알 수 있을까? (google analytics 무시) 수백만 명이 접속해 있다면 정확하진 않더라도 n 명 접속 중을 빠르게 표시할 수 있는 자료 구조가 있을까? 해쉬맵을 통해 모든 유저를 저장하면, 서버 메모리보다 커지지 않을까 등을 생각하다가 HyperLogLog 데이터 구조란 것을 알게 되었다. (다른 방법도 많을 것이다) https://www.youtube.com/watch?v=lJYufx0bfpw&t=479s HyperLogLog 추정치를 구하기 때문에 정확한 값을 원하면 옳지 않다. 이름이 왜 하이퍼로그로그 일까? 먼저, "LogLog"는 알고리즘이 고유한 요소들을 (유니크) 효율적으로 계산하기 위해 log 함수들을 사용함으로 셀 수 있는 요소들의 수..
-
Go: 백엔드 웹소켓 채팅 (fiber v2 + websocket + rabbitmq)컴퓨터/Go language 2024. 3. 31. 16:02
여러 가지 방이 있고 각 유저들이 있는 채팅 서비스를 만들고 싶었다. 우선 분산 시스템을 고려하지 않고 베이스를 만들어 준다. 싱글 서버 웹소켓이 양방향이라 (bi-directional) 선택했고, 객체를 저장하고 있으면 계속 주고받을 수 있다. 채팅 서버에서 websocket 연결 객체를 저장하고 있어야만 메시지를 전송할 수 있다. var WsRoomManager *RoomConnectionManager = NewRoomConnectionManager() type RoomConnectionManager struct { connections *haxmap.Map[string, []*websocket.Conn] // roomid and users } Concurrent Map 연결 객체들을 해쉬 맵에 저장..