파란하늘의 지식창고
Published 2021. 6. 4. 14:02
redis Data types Study/ETC
반응형

아래의 글을 번역하였다.

https://redis.io/topics/data-types

 

Data types – Redis

*Data types *Strings Strings are the most basic kind of Redis value. Redis Strings are binary safe, this means that a Redis string can contain any kind of data, for instance a JPEG image or a serialized Ruby object. A String value can be at max 512 Megabyt

redis.io

Strings

String은 redis value의 가장 기본적인 종류이다.
Redis String은 binary safe 하다. 이는 Redis string이 JPEG image 또는 serialized Ruby object 같은 모든 종류의 data를 포함할 수 있다는 것을 의미한다.

String value는 최대 512 Megabate의 길이를 가질 수 있다.

redis에서는 string을 사용하여 다음과 같은 것들을 할 수 있다.

  • INCR 계열 (INCR, DECR, INCRBY) 명령을 사용하여 atomic counter로 사용
  • APPEND command로 string을 추가
  • GETRANGE 및 SETRANGE로 문자열을 임의 access vector로 사용
  • 적은 공간에서 많은 data를 encoding 하거나 GETBIT 및 SETBIT를 사용하여 redis 지원 bloom filter를 생성

Lists

redis list는 단순히 삽입 순서로 정렬된 string list이다.
새로운 요소를 list의 앞 또는 뒤에 추가할 수 있다.

LPUSH command는 새 요소를 head 앞에 추가하고 RPUSH는 뒤에 추가한다.
만약 empty key에 수행되는 경우 new list가 생성되어 추가된다.

list operation과 resulting list에 대한 몇 가지 예는 다음과 같다:

LPUSH mylist a   # now the list is "a"
LPUSH mylist b   # now the list is "b","a"
RPUSH mylist c   # now the list is "b","a","c" (RPUSH was used this time)

list의 최대 length는 2^32 - 1 element이다. (4294967295, 약 40억 개 이상)

redis list의 주요 기능은 수백만 개의 항목이 삽입된 경우에도 head와 tail 근처에 있는 요소의 지속적인 time insertion 및 deletion을 지원하는 것이다.
element에 access 하는 것은 list의 양 극단 근처에서 매우 빠르지만 O(N) operation 이므로 매우 큰 목록의 중간에 access 하려고 하면 느리다.

redis list는 많은 흥미로운 작업을 수행할 수 있다.
예를 들면 다음과 같다.

  • user time line에 새 element를 추가하기 위해 LPUSH를 사용하고 최근에 삽입된 몇 가지 항목을 검색하기 위해 LRANGE를 사용하여 social network에서 timeline을 모델링함
  • LPUSH를 LTRIM과 함께 사용하여 주어진 elements 수를 초과하지 않고 최신 N 요소만 기억하는 list를 생성할 수 있음
  • list는 message 전달 기본 요소로 사용할 수 있음. 예를 들어 background job을 생성하기 위해 잘 알려진 resque ruby library를 참조
  • list로 더 많은 작업을 수행할 수 있으며 이 data type은 BLPOP와 같은 차단 blocking command를 포함하여 여러 명령을 지원함

Sets

redis set은 정렬되지 않은 String collection이다.
O(1)에서 member 존재 여부를 add, remove 및 test 할 수 있다. (set 안에 포함된 element의 수에 관계없이 일정함)

redis set은 repeate member를 허용하지 않는다.
같은 element를 여러 번 추가해도 하나의 element만 가진다.
이는 element를 추가할 때 존재 여부를 확인한 다음 추가할 필요가 없음을 의미한다.

redis set에 대한 매우 흥미로운 점은 기존 set에서 시작하여 set을 계산하는 여러 server side command를 지원하므로 매우 짧은 시간에 set의 union, intersection, difference를 수행할 수 있다.

set의 최대 member 수는 2^32 - 1이다. (4294967295, 약 40억 개 이상)

redis set을 사용하여 많은 흥미로운 작업을 수행할 수 있다.
예를 들면 다음과 같다.

  • redis set을 사용하여 고유한 것을 추적할 수 있다. 특정 blog 게시물을 방문하는 모든 고유 ip address를 알고 싶으면 페이지 보기를 처리할 때마다 SADD를 사용하면 된다. 반복되는 IP는 삽입되지 않는다.
  • redis set은 관계를 나타내는 데 좋다.
    모든 tag를 나타내는 set을 사용하여 redis로 tag 지정 시스템을 만들 수 있다.
    그런 다음 SADD 명령을 사용하여 특정 태그를 나타내는 set에 지정된 태그가 있는 모든 개체의 모든 ID를 추가할 수 있다.
    동시에 세 개의 다른 tag를 갖는 모든 개체의 모든 ID를 원한다면 SINTER를 사용하면 된다.
  • set을 사용하여 SPOP 또는 SRANDMEMBER command를 사용하여 임의로 element를 추출할 수 있다.

Hashes

redis hash는 string field와 sring value 간 map이다.
따라서 object를 표현하기 위한 완벽한 data type이다.
(예를 들면 name, surname, age 등등의 다수의 field를 가진 user)

HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000

몇 개의 field가 있는 hash는 공간을 거의 차지하지 않는 방식으로 저장되므로 작은 redis instance에 수백만 개의 개체를 저장할 수 있다.

hash는 주로 object를 나타내는 데 사용되지만 많은 요소를 저장할 수 있으므로 다른 많은 작업에도 hash를 사용할 수 있다.

모든 hash는 최대 2^32 - 1 개의 field-value 쌍(약 40억 개 이상)을 저장할 수 있다.

Sorted sets

redis sorted set은 redis set과 유사한 반복되지 않는 string의 집합이다.
차이점은 정렬된 집합의 모든 구성원이 가장 작은 score에서 가장 큰 score로 정렬된 집합을 정렬하는 데 사용되는 score와 연관되어 있다는 것이다.
member는 고유하지만 score는 반복될 수 있다.

sorted set을 사용하면 매우 빠르게 element를 add, remove 또는 update 할 수 있다. (element의 log에 비례하는 시간에)
element는 순서대로 선택되고 나중에 정렬되지 않기 때문에 score 또는 rank (position) 별로 범위를 매우 빠르게 얻을 수 있다.
sorted set의 중간에 access 하는 것도 매우 빠르므로 필요한 모든 항목에 빠르게 access 할 수 있는 반복되지 않는 element의 smart list로 sorted set을 사용할 수 있다. element in order , 빠른 existence test, 중간 element에 대한 빠른 access!

간단히 말해 sorted set을 사용하면 다른 종류의 database에서 모델링하기 정말 어려운 뛰어난 성능으로 많은 작업을 수행할 수 있다.

sorted set을 사용하여 다음을 수행할 수 있다

  • 새로운 score가 제출될 때마다 ZADD를 사용하여 update 하는 대규모 온라인 게임에서 leaderboard를 가져온다.
    ZRANGE를 사용하여 상위 사용자를 쉽게 가져올 수 있으며, 사용자 이름이 주어지면 ZRANK를 사용하여 목록에 순위를 반환할 수 있다.
    ZRANK와 ZRANGE를 함께 사용하면 주어진 사용자와 유사한 점수를 가진 사용자를 매우 빠르게 표시할 수 있다.
  • sorted set은 redis 내부에 저장된 데이터를 indexing 하기 위해 자주 사용된다.
    예를 들어 사용자를 나타내는 hash가 많은 경우 사용자의 연령을 점수로, 사용자의 ID를 값으로 갖는 요소가 포함된 sorted set을 사용할 수 있다.
    따라서 ZRANGEBYSCORE를 사용하면 주어진 연령 간격으로 모든 사용자를 검색하는 것이 간단하고 빠르다.

Bitmaps and HyperLogLogs

redis는 또한 실제로 String base type을 기반으로 하지만 자체 의미를 갖는 data type인 Bitmap 및 HyperLogLogs를 지원한다.

반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요