[Redis] Redis의 자료 형식과 기능(Key, String, Counter) - 2.1

해당 글에서는 Redis의 자료 형식이 어떤것이 있는지 살펴보고 명령어를 cli환경을 통해서 실습 해보겠습니다.

 

Redis의 Key

  1. Redis의 모든 자료구조는 Key-Value형식이며, 저장과 조회는 key를 기준으로 합니다.

  2. Key는 binary sequence로 binary-safe합니다. 즉, string이나 어떤 파일을 binary로 변환한 값이나 상관없이 key로 설정할 수 있습니다. (앞에서부터 byte단위로 비교 합니다.)

  3. key 설계와 관련해서 다음과 같은 것을 고려해야합니다.
    • 너무 긴(큰) key값 피하기 (Avoid Long Key)
      • key의 길이(크기)가 크다면, 메모리를 더 많이 차지할 뿐만 아니라, key 비교 연산 등에서도 비용이 많이 듭니다.
      • key의 크기는 1K(1024bytes)가 넘지 않도록 하는 것이 좋습니다.
      • key에 사용되는 데이터가 크다면, hashing을 통해서 key의 unique함을 보장하면서도 특정 길이로 줄이는 방법을 추천합니다.
        - 대표적으로 SHA1(160bit, 20bytes), SHA256(256bits, 32bytes) 등을 추천합니다.
      • key의 최대 사이즈는 512MB입니다. (사실상 이렇게 사용 안함)

    • 짧고, 불명확한 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

 

실습 들어가기 전에 Check

 

1. 설치

본인 운영체제에 맞는 링크를 클릭 후 안내하는대로 따라 설치하시면 됩니다.

2. Commends

실습에서 다루는 commands는 대표적인 commands위주로 소개드리고, 자세한 commands의 리스트와 특징은 아래 링크로 확인할 수 있습니다.

https://redis.io/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형식에 대해 알아보겠습니다.