Redis 자료 구조 - String

    개요

    Redis에서 기본적으로 문자열, 숫자를 저장할 때 사용하는 자료구조이다. Key와 Value 모두 최대 길이가 512MB이다. 그렇다고, Key를 표기할 때 과다하게 길이가 길면 메모리 낭비가 발생한다. 프로그램내에서만 사용하는 로컬변수가 아니라, 여러 서비스에서 공통으로 사용하는 공간인 만큼, Key를 부여할 때, 적절한 가시성과 구분자를 섞어서 쓰는 편이 좋을 것이다. (예: "user_service:member:status")


    명령어

    주로 어떤 값을 설정하고, 조회하는 용도가 대부분이다. 특히 숫자형 데이터라면 증/감의 오퍼레이션도 지원된다.


    set

    127.0.0.1:6379> help set
    
      SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
      summary: Set the string value of a key
      since: 1.0.0
      group: string

    set 명령어는 가장 기본형은 set key value를 지정하는 형태이다. 그러나 뒤에 여러 옵션을 지정하여 원하는 유스케이스를 충족시킬 수 있다.

    // 기본형
    127.0.0.1:6379> set hello world
    OK

    옵션들)

    • EX seconds: 만료 TTL을 s로 지정
    // TTL을 10초로 지정
    127.0.0.1:6379> set hello world ex 10
    OK
    
    // 10초 이내
    127.0.0.1:6379> get hello
    "world"
    
    // 10초 이후 (TTL 경과)
    127.0.0.1:6379> get hello
    (nil)
    • PX milliseconds: 만료 TTL을 ms로 지정
    // TTL을 1000ms로 지정
    127.0.0.1:6379> set hello world px 10000
    OK
    
    // 1000ms 이내
    127.0.0.1:6379> get hello
    "world"
    
    // 1000ms 이후 (TTL 경과)
    127.0.0.1:6379> get hello
    (nil)
    • EXAT timestamp-seconds: 만료 TTL을 unix time 기준 s로 지정

    • PXAT timestamp-milliseconds: 만료 TTL을 unix time 기준 ms로 지정

    • NX: 지정한 키가 존재하지 않을 때만 설정 (insert)

    // hello 키가 설정되어 있을 경우
    127.0.0.1:6379> set hello world nx
    (nil)
    
    // hello 키가 설정되어 있지 않을 경우
    127.0.0.1:6379> del hello
    (integer) 1
    127.0.0.1:6379> set hello world nx
    OK
    • XX: 지정한 키가 존재할 때만 설정 (update)
    # hello 키가 설정되어 있지 않을 경우
    127.0.0.1:6379> set hello world xx
    (nil)
    
    # hello 키가 설정되어 있을 경우
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> set hello world2 xx
    OK
    127.0.0.1:6379>
    • KEEPTTL
    • GET
    // 기존 값이 v1이고, 신규 값이 v2면 
    // v2로 변경하여 저장하고, 리턴은 v1으로 한다.
    127.0.0.1:6379> set hello world get
    (nil)
    
    127.0.0.1:6379> get hello
    "world"

    set ~ get 명령은 기존의 getset과 동일하다.


    setnx, setex, getset, psetex

    위의 명령어들은 기존의 set 명령어 옵션으로 대체가 가능하다.

    • setnx = set ~ nx
    • setex = set ~ ex
    • getset = set ~ get
    • psetex = set ~ px

    get

    127.0.0.1:6379> help get
    
      GET key
      summary: Get the value of a key
      since: 1.0.0
      group: string

    get 명령이 우선 단순하므로, get 부터 살펴보면 위와 같이 get 다음에 조회할 키를 지정해 주면 된다.

    // 조회할 키가 설정되지 않은 경우
    127.0.0.1:6379> get hello
    (nil)
    
    // 조회할 키가 설정된 경우
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> get hello
    "world"

    getex

      GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]
      summary: Get the value of a key and optionally set its expiration
      since: 6.2.0
      group: string

    set의 옵션처럼 만료 시점을 지정할 수 있다. 즉, 값을 조회하고 일정 기간 이후 데이터가 expire하도록 설정 가능하다.

    // ttl을 10초로 설정
    127.0.0.1:6379> getex k1 ex 10
    "hello"
    
    // 10초 후
    127.0.0.1:6379> get k1
    (nil)

    append

    127.0.0.1:6379> help append
    
      APPEND key value
      summary: Append a value to a key
      since: 2.0.0
      group: string

    기존에 존재하는 key에 value를 덧붙인다. 만약, key가 존재하지 않으면 신규 설정한다.

    // 일반 string
    127.0.0.1:6379> set k1 "hello world"
    OK
    
    // string으로 선언하고,
    127.0.0.1:6379> set k2 "hello"
    OK
    
    // 선언한 string에 append하기
    127.0.0.1:6379> append k2 " world"
    (integer) 11
    
    // string으로 직접 설정한 것과 append한 것의 메모리 크기 비교 (append를 하면 메모리가 더 많이 소모됨)
    127.0.0.1:6379> memory usage k1
    (integer) 69
    127.0.0.1:6379> memory usage k2
    (integer) 88
    
    // 존재하지 않는 key로 append를 직접하는 경우
    127.0.0.1:6379> append k3 "test"
    (integer) 4

    del

    127.0.0.1:6379> help del
    
      DEL key [key ...]
      summary: Delete a key
      since: 1.0.0
      group: generic

    저장된 키를 삭제한다.


    mset, mget

    만약 여러 개의 값을 읽거나, 쓸 때 이 연산이 atomic 해야 하면 이 명령어를 쓸 수 있다.

    // 여러 데이터를 한 번에 읽을 때
    127.0.0.1:6379> help mget
    
      MGET key [key ...]
      summary: Get the values of all the given keys
      since: 1.0.0
      group: string
    
    // 여러 데이터를 한 번에 쓸 때
    127.0.0.1:6379> help mset
    
      MSET key value [key value ...]
      summary: Set multiple keys to multiple values
      since: 1.0.1
      group: string

    위의 명령어를 사용하여 데이터를 한 번에 저장하고 읽어보면 아래와 같다.

    // 한 번에 여러 개의 값을 지정하기
    127.0.0.1:6379> mset city seoul nation korea weather rainy
    OK
    
    // 하나씩 읽기
    127.0.0.1:6379> get city
    "seoul"
    127.0.0.1:6379> get nation
    "korea"
    127.0.0.1:6379> get weather
    "rainy"
    
    // 한 번에 여러 개의 값을 읽기
    127.0.0.1:6379> mget city nation weather
    1) "seoul"
    2) "korea"
    3) "rainy"

    strlen

    127.0.0.1:6379> help strlen
    
      STRLEN key
      summary: Get the length of the value stored in a key
      since: 2.2.0
      group: string

    key를 파라미터로 받아, key에 해당하는 value의 길이를 리턴한다.

    // 문자열 지정
    127.0.0.1:6379> set k1 "hello world"
    OK
    127.0.0.1:6379> set k2 "hi there"
    OK
    
    // 문자열 길이 확인
    127.0.0.1:6379> strlen k1
    (integer) 11
    127.0.0.1:6379> strlen k2
    (integer) 8

    getrange, setrange

    // substring
    127.0.0.1:6379> help getrange
    
      GETRANGE key start end
      summary: Get a substring of the string stored at a key
      since: 2.4.0
      group: string
    
    // replace
    127.0.0.1:6379> help setrange
    
      SETRANGE key offset value
      summary: Overwrite part of a string at key starting at the specified offset
      since: 2.2.0
      group: string

    스트링 연산에서의 substring 및 replace와 동일한 연산이다.

    127.0.0.1:6379> get hello
    "world2"
    
    // getrange
    127.0.0.1:6379> getrange hello 2 4
    "rld"
    
    // setrange
    127.0.0.1:6379> setrange hello 3 abc
    (integer) 6
    
    127.0.0.1:6379> get hello
    "worabc"

    incr, decr, incrby, decrby, incrbyfloat

    127.0.0.1:6379> help incr
    
      INCR key
      summary: Increment the integer value of a key by one
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> help decr
    
      DECR key
      summary: Decrement the integer value of a key by one
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> help incrby
    
      INCRBY key increment
      summary: Increment the integer value of a key by the given amount
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> help decrby
    
      DECRBY key decrement
      summary: Decrement the integer value of a key by the given number
      since: 1.0.0
      group: string
    
    127.0.0.1:6379> help incrbyfloat
    
      INCRBYFLOAT key increment
      summary: Increment the float value of a key by the given amount
      since: 2.6.0
      group: string  

    숫자를 할당하면, 그 값을 기준으로 증감을 할 수 있다.

    // 기준 값 설정
    127.0.0.1:6379> set k 100
    OK
    
    // 1씩 incr 하고 1씩 decr하기
    127.0.0.1:6379> incr k
    (integer) 101
    127.0.0.1:6379> incr k
    (integer) 102
    127.0.0.1:6379> incr k
    (integer) 103
    127.0.0.1:6379> decr k
    (integer) 102
    127.0.0.1:6379> decr k
    (integer) 101
    127.0.0.1:6379> decr k
    (integer) 100
    
    // 2씩 incr하고, 2씩 decr하기
    127.0.0.1:6379> incrby k 2
    (integer) 102
    127.0.0.1:6379> incrby k 2
    (integer) 104
    127.0.0.1:6379> decrby k 2
    (integer) 102
    127.0.0.1:6379> decrby k 2
    (integer) 100
    
    // 소수 (예: 0.5)로 증감하기
    127.0.0.1:6379> incrbyfloat k 0.5
    "100.5"
    127.0.0.1:6379> incrbyfloat k 0.5
    "101"
    127.0.0.1:6379> incrbyfloat k -0.5
    "100.5"
    127.0.0.1:6379> incrbyfloat k -0.5
    "100"

    정수의 경우 incrby 혹은 decrby 명령어 자체가 더하기나 빼기를 상징한다. 그렇지만, 파라미터로 음수를 부여하면 그 반대 연산도 가능하다. (즉, incrby를 썼지만 -2를 기입하면 decrby와 같은 효과) 그러나, incrbyfloat의 경우는 쌍이 되는 decrbyfloat 명령어가 별도로 존재하지 않는다. 빼기를 하려면 위와 같이 명시적으로 파라미터를 음수로 줘야 한다. 기존 incr/decr 명령어 시리즈는 v1.0.0부터 있었던 반면, incrbyfloat는 2.6.0에서야 추가된 것을 보면, 아마도 뒤에 구현한 사람이 굳이 두 개의 커맨드로 제어를 해야할까 고민하다 명령어 한 개로 합친 듯 하다.

    'Development > Hadoop, NoSQL, BigData' 카테고리의 다른 글

    Redis 자료 구조 - Set  (0) 2021.05.12
    Redis 자료 구조 - List  (0) 2021.05.10
    Redis 자료 구조 - String  (0) 2021.05.06
    Memcached vs. Redis - 특징 비교  (0) 2021.05.03
    Redis 개요  (0) 2021.04.28
    Avro 개요  (0) 2021.04.23

    댓글(0)

    Designed by JB FACTORY