Data Types

이정원·2024년 10월 26일
post-thumbnail

Redis는 Key/Values구조의 저장을 지원하는 NoSQL 데이터베이스이다. Values를 저장하고 관리할 데이터라 하면,Key는 데이터에 접근할수 있는 식별자를 의미한다. Values에 다양한 자료구조로 데이터를 저장할수 있다.

Redis 기본 명령어

TTL: 데이터를 특정 기간 동안만 유지하기 위한 명령어, EXPIRE 명령어를 통해 모든 키의 삭제 시간을 설정할 수 있다.

SET mykey "Hello World"
EXPIRE mykey 10
# 결과: mykey는 10초 후에 자동으로 삭제됨

TTL mykey
# 결과: mykey의 남은 시간을 초 단위로 반환 (예: 7)

DEL: 특정 키를 삭제한다.

DEL mykey

UNLINK: DEL과 비슷하지만 비동기적으로 삭제한다. 삭제해야 할 데이터가 많을 경우, 시간 절약을 위해 메모리의 참조 주소를 지우고 나중에 실제 데이터를 삭제한다.

UNLINK mykey

MEMORY USAGE: 특정 키의 메모리 사용량을 확인할 수 있다.

MEMORY USAGE mykey

Data Types

1.String

대표 기본 타입으로 바이너리,문자 데이터를 저장(maximum 512MB),숫자를 저장할경우 증가 감소에 대한 원자적 연산도 지원한다.

Command

  • SET:주어진 key에 특정 값을 저장한다. 만약 key가 이미 존재하면 기존의 값을 덮어쓴다.
SET key1 "Hello" 
# key1==key values=="Hello"
  • SETNX: key가 존재하지 않을 경우에만 값을 설정한다. key가 이미 존재하면 아무 작업도 수행하지 않는다.
SETNX key1 value
  • GET: 주어진 key의 값을 가져온다. key가 존재하지 않으면 nil을 반환한다.
GET key1
  • MGET: 여러 key에 대해 동시에 값을 가져온다.
MGET key1 key2 key3
  • INCR: 주어진 key의 숫자 값을 1 증가시킨다. key가 존재하지 않으면 0으로 초기화한 후 1로 설정된다. 문자열이 숫자로 변환될 수 없는 경우 오류를 발생시킨다.
INCR key1
  • INCRBY: 주어진 key의 숫자 값을 지정된 수만큼 증가시킨다. key가 존재하지 않으면 0으로 초기화한 후 지정된 수만큼 증가시킨다. 문자열이 숫자로 변환될 수 없는 경우 오류를 발생시킨다.
SET counter 10
INCRBY counter 5

Note: 단순 GET,SET으로 값을 증가시킨다면 공유 변수에 대해 여러 클라이언트의 작업을 처리할때 race condition이 발생할수 있다. 따라서 증가 작업은 원자적 연산을 지원하는 INCR 명령을 사용하도록 한다.
Race condition:두개 이상의 쓰레드가 공유 자원에 접근할때 실행 순서에 따라 최종 결과가 달라질수 있음

  • DEC: 주어진 key의 숫자 값을 1 감소시킨다. key가 존재하지 않으면 0으로 초기화한 후 -1로 설정된다. 문자열이 숫자로 변환될 수 없는 경우 오류를 발생시킨다.
DECR key1

2.Lists

Redis에서 Lists는 String 타입의 Linked List 자료구조이다. 이는 Java의 ArrayList와 유사하게 동작하지만, 실제로는 Linked List 형태로 구현되어 있어 Stack이나 Queue를 쉽게 구현할 수 있다.

Command

  • LPUSH: 리스트의 왼쪽(첫 번째)에 하나 이상의 값을 추가한다. 여러 값을 추가하면 순서대로 추가된다.
LPUSH mylist "value1" "value2"
  • RPUSH:리스트의 오른쪽(마지막)에 하나 이상의 값을 추가한다. 여러 값을 추가하면 순서대로 추가된다.
  • LPOP:리스트의 왼쪽(첫 번째)에서 값을 제거하고 반환한다.
  • RPOP:리스트의 오른쪽(마지막)에서 값을 제거하고 반환한다.
  • LLEN:리스트의 길이(요소 개수)를 반환한다.
  • LRANGE:리스트의 특정 범위 내의 요소를 가져온다. 인덱스는 0부터 시작하며, start와 stop 인덱스를 지정할 수 있다.
LRANGE mylist 0 2

Stack(후입선출)이나 Queue(선입선출)를 만들 때 Lists 명령어를 활용하여 구현한다.

3.Set

Redis의 Set은 정렬되지 않은 String 리스트로, 각 요소는 유일한 값을 가져야 한다. 즉, 중복된 값이 허용되지 않으며, 값이 자동으로 중복되지 않도록 관리된다.

Command

  • SADD: Set에 하나 이상의 값을 추가한다. 이미 존재하는 값은 무시된다.
SADD myset "value1" "value2"
  • SREM: Set에서 특정 값을 제거한다.
SREM myset "value1"
  • SISMEMBER:Set에 특정 값이 존재하는지 확인한다. 존재하면 1을 존재하지 않으면 0을 반환한다.
SISMEMBER myset "value2"
  • SMEMBERS: Set에 있는 모든 값을 반환한다.
SMEMBERS myset
  • SINTER: 두 개 이상의 Set 간의 교집합을 구한다. 여러 Set에 모두 존재하는 요소만 반환한다.
SINTER myset1 myset2
  • SCARD: Set의 요소 개수를 반환한다.
SCARD myset

4.Sorted Set

Redis의 Sorted Set은 일반적인 Set처럼 유니크한 값을 보장하면서도, 각 값에 점수(score)를 부여하여 점수를 기준으로 정렬할 수 있는 자료구조이다. 이 특성 덕분에 특정 기준에 따라 순위를 매기거나 정렬된 데이터를 관리할 때 유용하다. 또한, Rate Limit 기능을 구현할 때도 사용된다.

Command

  • ZADD: Sorted Set에 하나 이상의 값을 점수와 함께 추가한다. 만약 값이 이미 존재하면, 점수를 업데이트한다.
ZADD myzset 10 "value1" 20 "value2"
  • ZREM: Sorted Set에서 특정 값을 제거한다.
ZREM myzset "value1"
  • ZRANGE: Sorted Set에서 지정된 범위에 있는 값을 가져온다. 기본적으로 점수가 낮은 순서로 정렬된 값이 반환된다.
zrange game:scores 0 +inf byscore limit 0 3 withscores

# byscore:점수를 오름 차순으로 가져온다.(rev를 추가하면 내림차순)
# limit: 두 인자 값으로 인덱스의 범위를 조정한다.
# withscores:key 값과 함께 values 값들도 보여준다.
  • ZCARD: Sorted Set의 요소 개수를 반환한다.
ZCARD myzset
  • ZRANK/ZREVRANK: 특정 값의 순위를 반환한다. ZRANK는 점수가 낮은 순서로 순위를 반환하고, ZREVRANK는 점수가 높은 순서로 순위를 반환한다.
ZRANK myzset "value2"
  • ZINCRBY: 특정 값의 점수를 지정한 값만큼 증가시킨다. 값이 존재하지 않으면 추가된다.
ZINCRBY myzset 5 "value1" 
#"value1"의 점수를 5만큼 증가시킴

5.Hashes

Redis의 Hashes는 field-value 쌍으로 데이터를 저장할 수 있는 컬렉션이다. 이는 Java의 HashMap과 유사한 자료구조로, 구조화된 데이터를 그룹화하여 저장하고 관리하는 데 유용하다. 예를 들어, 사용자 정보(이름, 나이, 주소 등)를 저장할 때 하나의 키에 그룹화하여 관리할 수 있다.

Command

  • HSET: 특정 키의 Hashes에 하나 이상의 field-value 쌍을 설정한다. 만약 필드가 이미 존재하면 기존 값을 덮어쓴다.
HSET myhash field1 "value1" field2 "value2"
  • HGET,HMGET: 특정 키의 Hashes에서 지정된 필드의 값을 가져온다.
HGET myhash field1
HMGET myhash field1 field2 
(HGET==하나의 필드의 값,HMGET==여러 필드 값)
  • HGETALL: 특정 키의 Hashes에 있는 모든 field-value 쌍을 가져온다.
HGETALL myhash
  • HDEL: 특정 키의 Hashes에서 하나 이상의 필드를 삭제한다.
HDEL myhash field1
  • HINCRBY: 특정 키의 Hashes에서 지정된 필드의 값을 주어진 수만큼 증가시킨다. 값이 숫자가 아니면 오류가 발생한다. 필드가 존재하지 않으면 0으로 초기화한 후 증가시킨다.
HINCRBY myhash field3 3

6.Geospatial

Redis의 Geospatial은 위치 데이터를 저장하고 검색할 수 있는 기능을 제공한다. 위도와 경도 정보를 기반으로 특정 범위 내의 위치를 찾거나, 두 위치 간의 거리를 계산할 때 유용하다. 이를 통해 지도와 관련된 다양한 기능을 구현할 수 있다.

Command

  • GEOADD: 지정된 위치(위도, 경도)를 기준으로 요소를 추가한다. 특정 키에 저장된 위치 데이터에 위도, 경도, 이름을 할당할 수 있다.
GEOADD places 13.361389 38.115556 "Palermo"
GEOADD places 15.087269 37.502669 "Catania"
  • GEOSEARCH: 지정된 반경 내에 있는 위치를 검색한다. 중심점과 검색 반경을 지정하여 해당 영역에 포함된 위치를 찾아낼 수 있다.
GEOSEARCH places FROMLONLAT 13.361389 38.115556 BYRADIUS 200 km
  • GEODIS: 두 위치 간의 거리를 계산한다. 반환 단위를 m(미터), km(킬로미터), mi(마일), ft(피트)로 지정할 수 있다.
GEODIST places "Palermo" "Catania" km
  • GEOPOS: 특정 위치의 위도와 경도 값을 반환한다.
GEOPOS places "Palermo"

7.Bitmap

Redis의 Bitmap은 데이터를 비트 단위로 저장하고 조작할 수 있는 자료구조이다. 하나의 키를 사용하여 문자열을 비트 배열로 취급하며, 각 비트는 0 또는 1의 값을 가진다. Bitmap은 주로 플래그 관리나 간단한 집계 작업에 사용된다.

Command

  • SETBIT: 특정 오프셋(offset, 위치)의 비트를 0 또는 1로 설정한다. 만약 해당 오프셋이 현재 문자열의 범위를 벗어나면 자동으로 문자열을 확장한다.
SETBIT mybitmap 5 1
  • GETBIT: 특정 오프셋(offset, 위치)의 비트를 가져온다. 해당 위치의 비트가 0인지 1인지를 반환한다.
GETBIT mybitmap 5
  • BITCOUNT: 비트맵에서 값이 1인 비트의 개수를 세어 반환한다. 특정 범위를 지정하면 해당 범위 내의 1의 개수를 세어준다.
BITCOUNT mybitmap

Bitmap은 메모리 효율성이 뛰어나며, 특정 조건에 따른 빠른 집계나 상태 추적에 매우 적합하다. 또한, 단순한 비트 연산을 통해 복잡한 계산을 간단하게 수행할 수 있다.

0개의 댓글