Redis
Redis 사용
Redis 설치, 설정, 접속, 자료구조 활용, 키 관리 정리
1) 설치
- public cloud와 같은 곳의 SaaS를 이용
- OS에 설치
- Docker나 K8s와 같은 컨테이너를 이용
2) 설정
- 설정파일 위치
- MacOS:
opt/homebrew/etc/redis.conf - Linux:
/etc/redis/redis.conf
- MacOS:
- bind: redis에 접근할 수 있는 IP 바인딩 설정
- 127.0.0.1 → Localhost
- 0.0.0.0 → AnyWhere
- port: 애플리케이션을 구분하기 위한 번호
- 기본 ‘6379’
- 내부 통신을 위해 16379 사용
- protected-mode: pw를 설정해야만 redis에 접근할 수 있도록함
- 기본 ‘yes’
-
requirepass / masterauth: 패스워드
- daemonize: 프로세스를 deamon으로 실행시키고자 할 때 사용함
- 기본 ‘no’
- dir: 작업 디렉토리
- 기본 ‘./’
- tcp-backlog: 초당 client 연결 개수
- 기본 ‘511’
- timeout: client에서 서버 접속 시 timeout 값
- 기본 ‘0’
- maxclient: 최대 접속 가능 client 수
- 기본 ‘10000’
- tcp-keepalive: 클라이언트가 반응을 보이지 않을 때 서버가 접속을 제거하는 시간
- 기본 ‘300’
- 설정을 변경하면 Server를 리부팅 해야 함
3) 접속
- redis-cli라는 접속 도구 제공
-
실행하면 로컬에 있는 redis 서버 접속
- 원격 접속 시
redis-cli -h <IP> -p <port> -a <password>- IP 생략 시 127.0.0.1, Port 생략 시 6379
4) Redis 자료구조
종류
- String
- Hash
- List → Linked List
- Set
- Sorted Set
- Bitmap → 비트 연산에 사용
- Hyperloglog → 집합의 item 개수를 추정할 수 있는 알고리즘이자 자료구조
- Geospatial Index → 지점과 위도 및 경도를 사용할 수 있음
- 위도와 경도를 계산하여 두 지점 간 거리를 구할 수 있는 명령어 제공
- Stream → Event Log를 저장
- 메시지 서비스 제공
String
- 가장 간단하게 데이터를 저장할 수 있음
- 최대 512MB
- Key-Value가 직접 연결 되는 유일한 자료구조
- 숫자도 저장 가능
- 증감 연산 가능
- INCR / INCRBY
- 증감 연산 가능
- 저장 시
SET <key> <value
- 조회 시
GET <key>
- 옵션
- NX → 키가 없을 때만 저장
- XX → 키가 있을 때만 저장
- 여러 개를 저장하고자 할 때
- MGET / MSET
SET hello world
→ OK
GET hello
→ "world"
SET hello newvalue NX
→ (nil)
GET hello
→ "world"
SET hello newvalue XX
→ OK
GET hello
→ "newvalue"
SET cnt 0
→ (integer) 1
INCRBY cnt 50
→ (integer) 51
MSET name adam age 50 weight 77
→ OK
MGET name age weight
→ 1) "adam"
1) "50"
2) "77"
List
- 하나의 키에 여러 개의 데이터를 저장하는 자료구조
- 하나의 list에는 43억 개의 데이터를 저장할 수 있음
- idx를 이용해서 데이터에 직접 접근하는 것이 가능
- 큐와 스택의 용도로 사용 가능
-
맨 앞과 맨 뒤에서 데이터를 삽입하고 꺼내는 것도 가능 → 이중 연결 리스트
- 삽입
- LPUSH / RPUSH
LPUSH mylist adam
→ (integer) 1
RPUSH mylist hunt
→ (integer) 2
LPUSH mylist jessica julia
→ (integer) 4
- 범위 내 조회
LRANGE key start stop- 맨 끝에서부터 조회할 때는 -1, -2 형태의 음수를 사용
LRANGE mylist 0 2
→ 1) "julia"
1) "adam"
2) "hunt"
LRANGE mylist 0 1
→ 1) "julia"
3) "hessica"
- 맨 끝의 데이터를 삭제하며 조회
- LPOP / RPOP
- 횟수 설정 가능
LPOP mylist
→ 1) "jessica"
1) "adam"
2) "hunt"
- 범위를 제외하고 전부 삭제
- LTRIM
- 적절히 활용 시 고정된 길이의 Queue를 쉽게 유지 가능
- 특정 개수의 로그 데이터를 유지하고자 하는 경우
LPUSH logdata <DATA>LTRIM 0 99→ 항상 100개의 최신 로그 유지
- 중간 데이터 삽입 가능
- LINSERT
LINSERT <LISTNAME> BEFORE / AFTER <DATA1> <DATA2>
LINSERT mylist BEFORE adam mark
→ (integer) 4
- 데이터 수정
- LSET
LSET <KEY> <IDX> <VALUE>LSET mylist 2 dsfsdf → OK LRANGE mylist 0 -1 → 1) "jessica" 1) "mark" 2) "\xbe\xc6\xb4\xe3" 3) "hunt"
- 특정 인덱스 데이터 조회
- LINDEX
LINDEX <IDX>LINDEX mylit 2 → "\xbe\xc6\xb4\xe3"
- 특정 데이터 삭제
- LREM
LREM <KEY> <횟수> <값>- 데이터 개수 →
LLEN <key>
SET
- 중복 없이 데이터 저장
- 집합 관련 기능을 제공
- 삽입: SADD <키> <데이터 나열="">
데이터>키>
SADD myset A A A B B → (integer) 2 - 데이터 조회
- SMEMBERS
- 특정 값이 있는지 조회
- SISMEMBER
- 무작위 추출
- SRANDMEMBER
- 삭제
- SREM
- 마지막 데이터 삭제
- SPOP
- SINTER
- SUNION
- SDIFF
HASH
- 하나의 키에 여러 개의 필드와 값을 가질 수 있는 자료구조
- Java의 HashMap과 유사
-
필드는 해시 내에서는 유일해야 함
- 생성 및 필드 추가 및 수정
- HSET
- 특정 필드의 값 가져오기
- HGET
- 여러 개의 필드의 값 가져오기
- HMGET
- 모든 필드 가져오기
- HGETALL
- 모든 키 가져오기
- HKEYS
- 모든 값 가져오기
- HVALS
- 특정 키 삭제
- HDEL
HSET myhash name adam
→ (integer) 1
HSET myhash age 30
→ (integer) 1
HSET myhash album genesis
→ (integer) 1
HSET myhash age 29
→ (integer) 0
HGET myhash age
→ "29"
HMGET myhash name age
→ 1) "adam"
2) "29"
HGETALL myhash
→ 1) "adam"
2) "29"
3) "genesis"
Sorted Set(ZSet)
- score 값에 따라 정렬되는 고유한 문자열의 집합
- 모든 아이템은 score와 값 쌍을 가지며 저장될 때부터 score 값으로 정렬돼 저장
-
score가 동일하면 데이터의 사전 순서대로 정렬
- list와 sortedset 모두 순서를 갖는 자료구조
- index를 이용해 item에 접근 가능
- 인덱스를 이용한 접근 속도는 sortedset이 빠름
- list는 Linked List이므로 접근 속도가 O(n)
- SortedSet은 Hash로 idx를 저장하므로 접근 속도가 O(log n)
- 저장 시
ZADD 키 스코어 값 스코어 값 • • • - Options
- XX
- NX
- LT → 업데이트 하고자 하는 스코어가 기존 아이템의 스코어보다 작을 때만 업데이트, 없으면 추가
- GT → 업데이트 하고자 하는 스코어가 기존 아이템의 스코어보다 클 때만 업데이트, 없으면 추가
ZADD myzset 100 user:B
ZADD myzset 150 user:C 150 user:A 200 user:D
- Item 조회
- idx로 조회
ZRANGE 이름 start end WITHSCORES [REV]ZRANGE myzset 1 3 WITHSCORES
- idx로 조회
- 점수로 조회
- `ZRANGE 이름 start end BYSCORE WITHSCORES [REV]
- BYSCORE 앞에 “ ( “ 를 추가하면 start 값은 제외
Bitmap
- String에 비트연산을 수행할 수 있도록 확장된 형태
Hyperloglog
- 집합의 원소 개수인 카디널리티를 추정할 수 있는 자료구조
- 대량의 데이터에서 중복되지 않는 고유한 값을 집계할 때 유용함
-
set과 같은 데이터 구조에서는 중복을 피하기 위해 저장된 데이터를 전부 기억함 → 저장되는 데이터가 많아지면 메모리를 많이 사용하게 됨
- 입력되는 데이터 자체를 저장하지 않고 자체적인 방법으로 데이터를 변경해 처리함
- 데이터 개수에 상관 없이 일정한 메모리 유지
- 중복되지 않는 유일한 원소의 개수를 계산 가능
- 오차는 어느정도 발생
- 추가
- PFADD
- 데이터 개수
- PFCOUNT
Geospatial
- 데이터를 위도 및 경도 쌍의 집합으로 젖아
-
내부적으로는 SortedSet
- 삽입
- GEOADD
- 조회
- GEOPOS
- 데이터 사이의 거리
- GEODIST
GEOADD travel 14.2323 23.23232 prague
GEOADD travel 123.2131 231.2131 seoul 1231.21313 123.3231 SanFrancisco
GEOPOS travel prague
GEODIST travel seoul prague
- 특정 위치를 기준으로 원하는 거리 내 아이템 검색
- GEOSEARCH travel 이름 거리 옵션
- BYRADIUS 옵션을 이용하면 반경, BYBOX는 직사각형 거리
5) 키 관리
- 키는 존재하지 않을 때 아이템을 넣으면 자동으로 생성
- 모든 아이템을 삭제하면 키도 자동으로 삭제
- 키 삭제: DEL키
- 키의 존재여부: EXISTS 키
- 특정 패턴 이용해서 키의 존재여부 확인: KEYS pattern(정규표현식)
- 이름 변경: RENAME key 새로운이름
- 복제: COPY 기존키 새로운키
- 모든 키 삭제:
FLUSHALL [ ASYNC | SYNC ] - UNLINK 키: 키의 데이터를 백그라운드에서 다른 스레드에 의해 처리
- 데이터의 유효기간 설정
EXPIRE key 유지시간(sec) [ NX | XX | GT | NT ]EXPIREAT key {TIMESTAMP} [ NX | XX | GT | NT ]
댓글