해당 글에서는 Redis의 자료 형식이 어떤것이 있는지 살펴보고 명령어를 cli환경을 통해서 실습 해보겠습니다.
Redis의 Key
- Redis의 모든 자료구조는 Key-Value형식이며, 저장과 조회는 key를 기준으로 합니다.
- Key는 binary sequence로 binary-safe합니다. 즉, string이나 어떤 파일을 binary로 변환한 값이나 상관없이 key로 설정할 수 있습니다. (앞에서부터 byte단위로 비교 합니다.)
- key 설계와 관련해서 다음과 같은 것을 고려해야합니다.
- 너무 긴(큰) key값 피하기 (Avoid Long Key)
- key의 길이(크기)가 크다면, 메모리를 더 많이 차지할 뿐만 아니라, key 비교 연산 등에서도 비용이 많이 듭니다.
- key의 크기는 1K(1024bytes)가 넘지 않도록 하는 것이 좋습니다.
- key에 사용되는 데이터가 크다면, hashing을 통해서 key의 unique함을 보장하면서도 특정 길이로 줄이는 방법을 추천합니다.
- 대표적으로 SHA1(160bit, 20bytes), SHA256(256bits, 32bytes) 등을 추천합니다. - key의 최대 사이즈는 512MB입니다. (사실상 이렇게 사용 안함)
- key의 길이(크기)가 크다면, 메모리를 더 많이 차지할 뿐만 아니라, key 비교 연산 등에서도 비용이 많이 듭니다.
- 짧고, 불명확한 Key값 피하기 (Avoid too short key)
- example: user:1000:followers(user id 1000 사용자의 follower를 저장하는 자료구조)를 표현하기 위해서 u1000fw와 같은식으로 줄이는 경우
위와 같은 경우 메모리를 조금이라도 더 적게 사용하기 때문에 좋은 선택같아 보입니다.
하지만 크게 차이가 없고, 비교연산 등에서도 큰 차이가 없습니다.
이렇게 줄인 key의 의미를 파악할 수 없는 경우 개발, 운영 과정에서 버그나 문제를 야기할 수 있습니다. 이것은 성능보다 더 큰 문제를 야기할 수 있습니다.
또한 의미를 알아보기 힘든 축약어로 한 자료구조의 키를 설계하면, Redis클러스터를 이용하는 경우 key의 분산을 위해서 다른 키도 이와같이 설계해야 합니다. 그렇지 않으면 데이터의 분산이 골고루 이루어 지지 않고, 클라이언트의 요청이 한 노드에 몰려서 부하가 분산이 되지 않기 때문입니다.
여러 종류의 키를 이런식으로 설계하면 결국에는 어떤 키가 어떤 읨인지 따로 문서 등이 없다면 알아보기 힘들게 되고, 이것은 심각한 버그나 문제를 야기할 수 있습니다. 따라서 Key가 사이즈가 크지도 않은데 일부러 축약어 등으로 과도하게 줄이는 것은 바람직하지 않습니다. - key값에 스케마 정보를 포함시키기 (Try to stick with schema)
키안에 포함되어 있는 정보가 의미가 있다면, schema를 가지는 것은 좋은 방법입니다.
- 예시 (해당 방법은 키의 내용과 의미가 일치하고, 비교연산에서도 같은 자리를 비교하게 되므로 비용 효율적입니다.)
- object-type:id
- user:1000
- dash(-), dot(.)으로 구분한 multi word
- comment:4321:reply.to
- comment:4321:reply-to
- object-type:id
- 예시 (해당 방법은 키의 내용과 의미가 일치하고, 비교연산에서도 같은 자리를 비교하게 되므로 비용 효율적입니다.)
- 너무 긴(큰) key값 피하기 (Avoid Long Key)
실습 들어가기 전에 Check
1. 설치
본인 운영체제에 맞는 링크를 클릭 후 안내하는대로 따라 설치하시면 됩니다.
- Windows: https://redis.io/docs/getting-started/installation/install-redis-on-windows/
- MacOS: https://redis.io/docs/getting-started/installation/install-redis-on-mac-os/
- Linux: https://redis.io/docs/getting-started/installation/install-redis-on-linux/
2. Commends
실습에서 다루는 commands는 대표적인 commands위주로 소개드리고, 자세한 commands의 리스트와 특징은 아래 링크로 확인할 수 있습니다.
3. 실습환경 셋팅 (mac기준)
- redis 설치 완료 후 2개의 터미널을 띄웁니다.
- 아래의 명령어를 통해 redis server를 실행시킵니다.
redis-server
- 다음과 같은 화면이 출력되면 됩니다.
- 다른 터미널에서 redis cli환경을 실행시킵니다.
redis-cli
- 다음과 같이 cli환경에 접속되었다면 셋팅 완료!
Redis의 String 실습
1. String의 특징
Redis의 String은 bytes를 그대로 저장합니다. 즉, text뿐만 아니라 어떤 object나 binary를 bytes로 serialized한 형태로 저장합니다. (유의할 점: 하나의 String은 512MB를 넘을 수 없다.)
2. Commands
- SET :지정한 key에 원하는 value 를 저장한다. 아래는 함께 쓰일 수 있는 옵션들
- EX seconds -- 지정한 시간(초, seconds)만큼 지난 뒤에 expire
- PX milliseconds -- 지정한 시간(밀리초, milliseconds)만큼 지난 뒤에 expire
- EXAT timestamp-seconds -- 지정한 시간(unix timestamp seconds)에 expire
- PXAT timestamp-milliseconds -- 지정한 시간(unix timestamp milliseconds)에 expire
- XX -- Key가 존재하면 Set. (새로운 value값 덮어쓰기)
- KEEPTTL -- Key가 존재하는 시간. EX, PX 류와 동시사용 불가.
- GET -- Set하기 이전의 string을 리턴. 이전에 존재하지 않았으면 nil을 리턴. SET 이전에 존재하던 값(value)이 String이 아니면 Set을 취소하고 error를 리턴
- SETNX 지정한 key가 존재하지 않으면, key와 value를 저장한다.
- *lock을 구현할 때 유용하다.
- 분산 환경에서 deduplication(중복제거) 을 적은 비용으로 구현할 수 있다.
- GET 지정한 key에 저장된 value를 가져온다.
- MGET 여러개의 key에 저장된 값을 한 번에 가져온다.
* SETNX를 활용한 lock구현: app server가 여러개 있다고 할 때 첫번째로 SETNX를 날린 app server가 있을 경우 해당 key를 점유할 수 있다. 다른 server에서 SETNX명령을 보내면 이미 key에 value가 저장되어 있으므로 0을 반환하게 된다. 그래서 다른 app server에서는 해당 key의 value가 삭제될 때 까지 동작을 못하게함으로써 lock기능을 구현할 수 있다.
2.1 실습
- key-value설정
SET mykey myvalue
- 지정된 key값의 value 가져오기
GET mykey
- key-value 여러개 set, get
MSET key1 value1 key2 value2
MGET key1 key2
- key-value 저장 후 10초 뒤 expire
SET mykey myvalue EX
10초 뒤...
- 해당 key가 존재하지 않으면 저장 후 1 반환 / 존재 시 아무동작 하지 않으며 0 반환
SETNX key99 value99
이 외에 기타 명령어는 직접 해보면서 체험해 보세요!
3. Counter commands
지정된 key에 대해서 숫자를 atomic하게 증가/감소 시키고 그 결과를 응답합니다. 분산환경에서 덧셈 뺄셈 연산을 lock free로 구현할 때 많이 쓰입니다.
Strings의 SET command로 초기 숫자를 세팅하고 시작합니다.
- INCR 지정한 key의 value를 1씩 증가.
- counter 를 lock free로 구현할 때 유용
- rate limiter를 구현할 때도 쓸 수 있음 (요청이 왔을 때 어느정도 request만 허용할지 count)
- INCRBY 지정한 key의 value로 정수형 숫자를 가지고, 그 숫자를 atomic하게 숫자를 증가/감소
- INCRBYFLOAT 지정한 key의 value로 소숫점 숫자를 가지고, 그 숫자를 atomic하게 숫자를 증가/감소
3.1 실습
- value 정수형 숫자 저장
SET mykey 0
- value값 증가시키기
INCR mykey
- 특정 숫자만큼 증가
INCRBY mykey 3
- 소수점 숫자를 증가/ 감소 (부동소수점때문에 0.299999... 값이 더해짐)
INCRBYFLOAT mykey 0.3
INCRBYFLOAT mykey -0.3
다음 글에서는 Redis의 List와 Set형식에 대해 알아보겠습니다.
'Data Engineering > Redis' 카테고리의 다른 글
[Redis] Redis의 자료 형식과 기능(Sorted Set) - 2.3 (1) | 2024.01.04 |
---|---|
[Redis] Redis의 자료 형식과 기능(List, Set) - 2.2 (1) | 2023.11.08 |
[Redis] CacheDB 이해하기 - 1 (0) | 2023.11.07 |