공부 이야기/REDIS
-
[Redis] Redis는 key expiration을 어떻게 관리할까?공부 이야기/REDIS 2024. 6. 9. 20:47
1. CPU가 1초마다 전체 키를 순회하면서 expire을 체크하는 방식일까? (Polling)2. 이 방법은 CPU 사용과 같은 자원 소모가 막심할 것으로 보인다.3. expire time이 설정된 키는 TTL(Time2Live) 값을 가진다.4. 이 값은 Secondary Hash Table에 저장된다.5. 키에 접근할 때 (GET), 해당 테이블에 값이 있는지 없는지 먼저 확인한다.6. 만약 만료되었다면, 키를 제거하고 nil을 반환한다.7. 즉, Redis가 1초마다 전체 키를 순회 및 체크하는 방식이 아닌, 만료용 보조 테이블을 통해 관리한다.8. 하지만 여기서 클라이언트가 해당 키에 단 한 번도 접근하지 않는다면?9. 만료가 되어도 키가 제거되지 않은 채 공간만 차지하고 있을 것이다.10. 이..
-
[Redis] 복수 개의 명령어를 한 번에 처리하는 Command - MULTI, EXEC, DISCARD, WATCH공부 이야기/REDIS 2024. 6. 9. 17:38
1. Redis는 Spring JPA의 Transactional 기능처럼 여러 개의 연속된 명령어를 하나의 명령어로 묶는 기능을 지원한다.2. 하나로 묶으면 중간에 다른 클라이언트의 요청을 차단할 수 있다.3. ACID의 원자성을 높일 수 있는 방법이지만 싱글 쓰레드 기반의 Redis에서는 신중하게 써야할 것 같다.4. 명령어> MULTIOK> INCR fooQUEUED> INCR barQUEUED> EXEC1) (integer) 12) (integer) 1- 시작은 MULTI 명령어로 시작한다. Redis 서버는 OK를 응답한다.- 지정한 명령어를 순차적으로 수행한다. Redis 서버는 Queued를 응답한다. 큐에 추가했다는 의미인 듯하다.- EXEC 명령어로 큐에 저장한 명령어를 호출한다. Redi..
-
[Redis] 데이터 타입 - Stream공부 이야기/REDIS 2024. 6. 6. 15:00
1. Periodical Data를 취급할 때 효과적인 데이터 타입- Periodical Data는 연속적인 주기를 갖는 데이터를 맨 마지막에 추가하는 특징이 있다.- Redis Stream 은 Append-Only 방식이다. Redis 5.0 버전에서 List를 사용해 Periodical Data를 처리했다고 한다.2. Redis는 각 스트림 항목에 대해 고유 ID를 생성한다.3. XADD 명령어로 스트림 데이터를 생성할 수 있다.XADD race:france * rider Castilla speed 30.2 position 1 location_id 1"1692632086370-0" # 생성된 ID로 시간+일련번호로 구성res1 = r.xadd( "race:france", {"rider": ..
-
[Redis] Keys * vs Scan공부 이야기/REDIS 2024. 6. 5. 12:52
1. Single Thread Event Loop 기반인 Redis는 한 번에 하나의 명령어만 처리할 수 있다.2. KEYS * 명령어가 실행되는 동안, Redis는 다른 클라이언트 요청을 처리할 수 없으며, 이는 서버 전체의 응답성을 저하시킬 수 있다.3. 한편, Scan은 cursor 기반으로 iterating을 수행하는데 한 번에 전체 키 공간을 스캔하지 않고, 작은 부분씩 순차적으로 스캔한다.4. 각 호출에서 SCAN은 현재 커서를 반환하며, 다음 호출에서 이 커서를 사용하여 스캔을 이어간다. 5. Scan은 명령어가 실행되는 중간에 다른 클라이언트 요청을 처리할 수 있기 때문에 Non-Blocking Operation이다.6. 따라서 Key에 대해 전체 조회 혹은 대량 조회를 할 경우엔 key..
-
[redis] redis는 데이터 타입을 어떻게 처리하나 (redisObject, SDS)공부 이야기/REDIS 2024. 6. 4. 18:21
Redis에 저장된 모든 데이터는 redisObject로 통일된 관리redisObject는 Redis가 데이터의 타입, 인코딩 방식, 참조 카운트 및 기타 메타데이터를 관리하기 위해 사용하는 내부 구조체이를 통해 Redis는 다양한 데이터 타입을 효율적으로 다루고, 메모리 관리를 최적화 1) redisObject의 구성 요소`redisObject`는 다음과 같은 주요 필드로 구성typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data ..
-
[redis] 데이터 타입 - HLL공부 이야기/REDIS 2024. 6. 4. 17:18
HyperLogLog(HLL)- 큰 데이터 집합의 항목 개수를 매우 효율적으로 추정할 수 있는 확률적 데이터 구조(PF : Probalistic Fuction)- Bloom Filter, Cuckoo Filter 등을 사용하는데 False Positive 발생을 허용하는 데이터 타입이다.- 데이터가 존재하는지 확인하기 위해 사용되는 자료구조로 고정된 소량의 크기(12KB)를 갖음 1. 내부 동작 방식1) 해싱: 입력된 요소는 해시 함수에 의해 해싱. 해시 함수는 요소를 균등하게 분포된 비트 스트링으로 변환- "foo" -> 11010010101101000101010100111001...2) 최대 앞자리 0의 개수 계산: 해시된 결과에서 최대 앞자리 0의 개수를 계산. 이를 통해 해당 해시 값이 얼마나 희..
-
[redis] 데이터 타입 - Strings공부 이야기/REDIS 2024. 6. 4. 12:22
1) Strings SET key value [EX seconds] [PX milliseconds] [NX|XX]: 주어진 키에 값을 설정합니다.EX seconds: 만료 시간을 초 단위로 설정합니다.PX milliseconds: 만료 시간을 밀리초 단위로 설정합니다.NX: 키가 존재하지 않을 때만 설정합니다.XX: 키가 존재할 때만 설정합니다.GET key: 주어진 키에 저장된 값을 반환합니다.DEL key: 주어진 키를 삭제합니다.APPEND key value: 주어진 키에 저장된 문자열 값의 끝에 값을 추가합니다.INCR key: 주어진 키의 값을 정수로 간주하고 1 증가시킵니다.INCRBY key offset: 주어진 키의 값을 정수로 간주하고 지정(offset)한 만큼 증가시킵니다.DECR ke..
-
redis-cli info 명령어로 redis 서버 정보 확인하기공부 이야기/REDIS 2024. 3. 22. 16:42
PS C:\Users\djdj0> redis-cli 127.0.0.1:6379> info # Server redis_version:3.0.504 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:a4f7a6e86f2d60b3 redis_mode:standalone os:Windows arch_bits:64 multiplexing_api:WinSock_IOCP process_id:12876 run_id:356ae6667c031e1875136da12028c8ba8279ed0e tcp_port:6379 uptime_in_seconds:32577 uptime_in_days:0 hz:10 lru_clock:16592402 config_file:C:\Program..