본문 바로가기

전체 글262

[Redis] 레디스 기본타입(Sorted Sets) redis 공식문서를 보고 정리한 글입니다. redis sorted set은 score로 정렬된 중복되지 않은 문자열의 집합입니다. 같은 score를 가지는 문자열이 존재하는 경우 사전순으로 정렬 됩니다. sorted sets은 온라인 게임의 랭킹 시스템이나, api rate limiters에 사용할 수 있습니다. ZMPOP O(K) + O(M*log(N)), K는 keys의 개수, N은 set의 element 개수, M은 pop하려는 데이터 개수 ZMPOP numkeys key [key ...] [COUNT count] keys로 입력받은 sorted sets들에서 MIN/MAX 데이터를 count개수만큼(default 1)삭제 후 반환함. 입력받은 key(sorted set) 중에서 데이터가 없으면 .. 2024. 3. 30.
[Redis] 레디스 기본타입(Sets) redis 공식문서를 보고 정리한 글입니다. redis set은 순서가 없고 고유한 문자열의 집합 입니다. key에 중복되지 않은 값들을 넣을 수 있으며 아래의 용도로 사용할 수 있습니다. - 게시글을 읽은 IP 모음 - 모든 유저에 대한 역할(role) - 교집합, 합집합 및 차집합과 같은 일반적인 집합 연산 member:users라는 key에 user1, user2, user3를 2번 삽입합니다. set은 중복이 없이 때문에 member:users의 값을 확인하면 하나만 존재하는 것을 확인 할 수 있습니다. > SADD member:users user1 user2 user3 (integer) 3 > SADD member:users user1 user2 user3 (integer) 0 > SMEMBER.. 2024. 2. 12.
[Redis] 레디스 기본타입(Lists) redis 공식문서를 보고 정리한 글입니다. redis lists는 문자열 값의 linked lists 이며, 주로 아래의 경우 사용됩니다. - stack, queue 구현 - background worker의 큐 관리 리스트라는 개념은 종종 부적절하게 사용되는데, 예를 들어 파이썬의 리스트는 연결 리스트가 아닌 배열이며, Ruby에서는 동일한 데이터 유형이 배열(Array)로 불립니다. 매우 일반적인 관점에서 리스트는 순서가 있는 요소의 sequence 일 뿐입니다. 그러나 배열을 사용하여 구현된 리스트의 특정은 linked list로 구현된 리스트의 특성과 매우 다릅니다. redis lists는 linked list로 구현됩니다. 이는 리스트 안에 수백만 개의 요소가 있더라도, 맨앞/뒤에 새로운 요.. 2024. 1. 31.
[Redis] 레디스 기본타입(String) redis string은 가장 기본적인 redis 데이터 타입으로 binary arrays, serialized objects, text, 연속된 bytes를 저장합니다. redis의 키는 string이기 때문에 값으로 사용할 때, 문자열을 문자열로 매핑하고 있습니다(key:value -> 문자열:문자열). 이런 특징 때문에 HTML page를 캐싱하는데 redis를 사용할 수 있습니다. > SET fruit banana OK > GET fruit banana SET, GET 명령어로 key에 데이터를 할당, 검색할 수 있으며, SET명령어는 key에 값이 존재하더라도 기존 값을 덮어 씁니다. 값은 binary data를 포함한 모든 종류의 문자열이 될 수 있으며, 심지어 jpeg 이미지를 value에 .. 2024. 1. 18.
redis-semaphore 사용해서 mutex 해결하기 CJ 택배사 API연동하는 과정에서 semaphore를 사용하여 mutex를 해결한 경험을 공유하고자 글을 작성합니다. 전체적인 흐름은 A 서버에서 B서버로 주문 등록 요청을 하면 B서버는 redis에서 토큰을 조회 후, 토큰과 함께 CJ API를 호출하게 됩니다. A서버에서 B서버로 요청을 하면 B서버는 validation 이후, 토큰을 조회하는 함수를 실행합니다. getToken 함수에서는 토큰키를 사용하여 redis에서 토큰을 조회하고 존재하면 사용하고, 존재하지 않으면 CJ측에 토큰 재발급 요청 후, redis에 저장합니다. token의 ttl은 하루 입니다. const getToken = () => { try { const token = await redis.get('토큰 키'); if (tok.. 2024. 1. 12.
기본키를 in 조건에 넣었을 때 full scan 되는 현상(range_optimizer_max_mem_size) mysql version : 8.0.31 사내에서 prisma interactive transaction의 타임아웃을 60초로 설정하여 사용하고 있다. 하지만 트랜잭션에서 수행되는 로직이 60초를 넘어 time out이 발생하는 일이 간헐적으로 발생했다. 단순히 트랜잭션의 time out 시간을 늘려도 되지만, 어떤 쿼리가 왜 오래 걸리는지 확인해 보았다. prisma query log 옵션을 줘서 쿼리 실행시간을 측정했을 때 아래의 쿼리가 오래 걸리는 것을 확인할 수 있었다. 해당 테이블에 있는 row수는 5571220개 이다. explain SELECT * FROM CourierInvoice WHERE id IN (....) in에 들어가는 변수 10302개 기준으로 16s가 소요되었다. innodb.. 2023. 12. 6.
역치 뚫어버리기 2년만에 생각정리에 글을 쓰는 것 같다. 그동안 이런 저런 경험을 하면서 느낀 것은 많은데 미루다가 최근에 나에게 긍정적인 영향을 주는 경험과 그로인해 느낀점을 글로 남기고 싶어서 역치 뚫어버리기 라는 주제로 글을 써본다. 역치라는 단어를 검색해보기 전에, 내가 알고 있는 역치라는 단어의 정의는 어떤 행동을 막 시작할 수 있는 최소한의 에너지 이다. 실제로 역치의 정의를 찾아보면 아래와 같이 나온다. 물리학에서 어떤 현상을 일으키게 하기 위하여 계(系)에 가해야 하는 물리량의 최소치 감각을 일으킬 수 있는 최소의 자극의 세기 생물이 자극에 대해 어떤 반응을 일으키는 데 필요한 최소한의 자극의 세기 어느정도 비슷한 것 같다. 그럼 역치를 내가 정의한 개념, 어떤 행동을 막 시작할 수 있는 최소한의 에너지.. 2023. 11. 21.
[Nexus] NexusGenObjects와 NexusGenFieldTypes의 차이 nexus는 graphql 서버를 code first하게 작성할 수 있게 도와주는 라이브러리 이다. nexus의 여러 장점중 하나는 생성된 graphql schema를 기반으로 typescript type을 제공해준다는 것이다. 덕분에 우리는 type safe하게 개발을 할 수 있다. nexus schema를 만들 때 다음과 같이 작성해주면 된다. const schema = makeSchema({ types: [ /* All schema types provided here */ ], outputs: { schema: path.join(__dirname, '../../my-schema.graphql'), typegen: path.join(__dirname, '../../my-generated-types... 2023. 3. 24.
[nodejs] nodejs와 nginx timeout 이글에서 자주 등장하는 upstream은 node 서버를 의미한다. nginx를 프록시 서버로 사용할 때 발생할 수 있는 에러중에, 502 Bad Gateway, 504 Gateway Time-out 가 있다. 보통 502, 504에러?면 nginx의 책임(?)으로 몰아가는 경우가 있다. 사실 nginx 문제일 수도 있고, 아닐수도 있다. 아닐 수 있는 이유는 upstream 서버에서도 timeout이 존재하기 때문이다. 일단은 502, 504에러를 알아보기 전에 upstream에서 timeout이 어떻게 동작하고 있는지 확인해보자. nodejs timeout 테스트로 사용하는 node버전은 v19.7.0 이며, 아래의 글은 해당 버전을 기준으로 한다. express로 다음과 같이 서버를 만들었다고 .. 2023. 3. 21.