-In-Memory : 모든 데이터를 RAM 에 저장 (백업/ 스냅샷 제외)
-Single Threaded : 단일 thread에서 모든 task 처리
-Cluster Mdoe : 다중 노드에 데이터를 분산 저장 -> 안전성,고가용성 제공
-Persistence : RDB(Redis Database) +AOF(Appen only file) 통해 영속성 옵션 제공
-Pub/Sub : Pub/Sub패턴 지원을 통한 손쉬운 어플리케이션 개발(채팅,알람)




SET key value
MSET price 100 language ko -> 다수의 string 값 한번에 저장(key,value,key,value)
MGET lecture 100 language -> 다수의 값 반환

INCR price -> 별도의 Integer 타입 없이 String으로 저장, 더하기 빼기 가능 (1더하기)
INCR price 10 -> 특정 숫자만큼 저장 가능






job 2 순으로 -1 -> -2 -> ...
job5 순으로 0 -> 1 -> 2
LPUSH queue job1 job2 job3
LRANGE queue -2 -1 -> 인덱스로 여러 데이터 조회가능














field-value로 추가가능 (이벤트 스트림)
append-only log(수정,삭제가 없고 추가만 있는)에 consumer groups과 같은 기능을 더한 자료구조
unique id를 통해 entry를 읽을 때, 0(1) 시간 복잡도를 가지게 된다

Consumer Group를 통해 분산 시스템에 다수의 consumber가 event처리
동일한 메세지 여러번 처리 방지

xadd 를 통해 events 라는 스트림을 만들며 * 를 통해 unique_id생성
id 값은 entry가 추가된 시간 - 그시간대에 동일하게 event가 발생할수 있기때문에 몇번째인지 나타냄
user_id 1 인 유저가 product_id 1 좋아요를 누른 이벤트를 생성한것

xrange 스트림이름 - +
가장 처음 이벤트부터 마지막 이벤트 까지 조회


실제 데이터 타입은 아니고, String에 binary operation을 적용한 것
최대 42억개 bianry 데이터 표현
setbit 키 value
bitcount 키 -> 해당 1이 몇개인지 카운트


집합의 cardinality(높으면 중복 적음)를 추정할 수 있는 확률형 자료구조(= 결과값이 실제와 오차가 발생할 수 있다)
정확성을 일부 포기하는 대신 저장공간을 효율적으로 사용, 근사치만 필요할때 사용
Set에 비해 실제 값을 저장하지 않기 때문에 매우 적은 메모리지만 모든 아이템을 다시 출력 해야하는 경우에는 사용 불가
element가 집합 안에 포함되어 있는지 확인할 수 있는 확률형 자료 구조 (=membership test)
실제 값을 저장하지 않기 때문에 매우 적은 메모리 사용

element가 집합에 실제로 포함되지 않는건 정확히 나오지만, 실제로 포함되지 않았는데 포함되었다고 잘못 예측하는 경우(=false positive)
하지만 그 반대의 경우, 집합에 실제로 있는건 무조건 있다고 나옴

apple, orange가 추가되고 grape같은 경우 오른쪽 해쉬키는 표시되어있지 않아 포함되어 있지 않다는건 알수 있지만 키위같은 경우에는 false positive 발생
데이터 조회 요청시에 만료된 데이터는 조회 x
데이터가 만료되자마자 삭제하는게 아니라 만료로 표시했다가 백그라운드에서 주기적으로 삭제

TILL 로 유효시간 초단위로 확인
-1이면 설정되지 않았다는뜻, -2면 만료
setex 로 저장과 동시에 만료시간 설정 가능

1.NX
2.XX
-> SET이 동작하지 않은 경우 (nil) 응답



Publisher와 Subscriber가 서로 알지 못해도 통신이 가능하도록 decoupling된 패턴
Publisher는 Subscriber에게 직접 메세지를 보내지 않고, Channel에 Publish
Subscriber는 관심이 있는 Channel을 필요에 따라 Subscribe하며 메세지 수신
Redis Stream은 메세지가 보관되지만, Pub/Sub은 Subscribe하지 않을때 발행된 메세지는 수신불가


다수의 명령어를 한 번에 요청하여 네트워크 성능을 향상 시키는 기술
Round-Trip Times 최소화(= Request/Response 모델에서 발생하는 네트워크 지연 시간)
대부분 레디스 클라이언트 라이브러리에서 지원
다수의 명령을 하나의 트랜잭션으로 처리 -> 원자성 보장
중간에 에러가 나면 롤백
하나의 트랜잭션이 처리되는 동안 다른 클라이언트 요청 x
pipeline 은 네트워크 퍼포먼스 향상을 위해 여러 명렁어 한번에, Transcation은 작업의 원자성 보장을 위해 다수의 명령을 하나처림 처리하는 기술 -> 둘다 동시에 사용 가능









시간에 따라 Window를 이동시켜 동적으로 요청수를 조절하는 기술
fixedWindow는 고정시간이 지나면 초기화
sortedSet에 score대신 unixtime 저장해 구현
위치를 활용하여 지도 상의 가상의 경계 또는 지리적 영역을 정의하는 기술
GEOADD 명령어를 통해 좌표값을 value로 저장해주고 GEORADIUS 명령어로 특정범위 안에 있는 value출력 가능

사용자의 현재 로그인 상태 표시
bitmap 활용

방문자수 제공시, 정확한 횟수말고 대략적인 데이터만 알고자 하는 경우
hyperloglog사용
값을 저장할때 같은 유저 중복을 한번만 카운팅할수도 있고 unixtime 초당요청을 다르게 카운팅 할수도있다.

처음 조회시 bloomfilter에서 찾고 없으면 db조회 후 bloomfilter 체크
조회시 bloomfilter 체크상태이면 false positive 일수도 있기때문에 원본 데이터 소스를 한번 더 조회하고 데이터 처리
Redis는 싱글쓰레드 이기 때문에 오래걸리는 O(N)명령어 수행시 전체적 어플리케이션 성능 저하
KEYS 명령어는 모든키를 조회하기 때문에 성능저하 발생, -> SCAN 명령어를 사용하자
SMEMBERS도 SET의 모든 값들을 반환하기때문에 느림 -> 하나의 set에 만개이상 저장 x 또는 SET 분리
HGETALL 도 hash의 모든 field를 반환하기때문에 느림 -> Hash 분리
SORT 도 정렬해서 반환하기 때문에 주의해야함!

캐쉬가 없어지고 그 요청들이 한번에 DB에 가버리는 문제(캐쉬만료로 인한 문제)
세밀한 캐쉬 조정 필요(크론잡을 통해 캐쉬 데이터 항상 최신화 시켜주기)
레디스 사용시 캐시 관리도 잘 해야함!
