Sorted Set

Sorted Set은 관련 점수에 따라 정렬된 고유 문자열(구성원) 모음으로 둘 이상의 문자열에 동일한 점수가 있는 경우 문자열은 사전순으로 정렬됩니다. 
  • 리더보드 정렬된 세트를 사용하면 대규모 온라인 게임에서 가장 높은 점수를 순서대로 나열한 목록을 합계로 유지할 수 있다.
  • 속도 제한기, 특히 과도한 API 요청을 방지하기 위해 정렬된 세트를 사용하여 슬라이딩 윈도우 속도 제한기를 구축할 수 있다.

Sorted Set를 Sets을 Hash의 혼합으로 생각할 수 있다. 집합과 마찬가지로 정렬된 집합은 고유하고 반복되지 않는 문자열 요소를 구성되므로 어떤 의미에서는 정렬된 집합도 집합입니다.

Set은 내부 요소는 순서가 지정되지 않지만 Sorted Se의 모든 요소는 score라는 부동 소수점 값과 연결된다.

 

또한 Sorted Set의 요소는 순서대로 가져온다.

  • B와 A가 score가 다른 두 요소인 경우 A score가 B score보다 크면 A > B이다.
  • B와 A의 점수가 정확히 같은 경우 A 문자열이 B 문자열보다 사전순으로 크면 A > B이다. 정렬된 세트는 고유한 요소만 있으므로 B 및 A 문자열은 동일할 수 없습니다.

대부분 정렬 집합의 연산은 O(log(n))이다. 여기서 n은 멤버 수

 

127.0.0.1:6379> zadd points 10 TeamA 10 TeamB 50 TeamC
(integer) 0
127.0.0.1:6379> zrange points 0 -1
1) "TeamA"
2) "TeamB"
3) "TeamC"
127.0.0.1:6379> zrange points 0 -1 rev withscores
1) "TeamC"
2) "50"
3) "TeamB"
4) "10"
5) "TeamA"
6) "10"

 

'DB > Redis' 카테고리의 다른 글

[Redis] Sets & Hashes  (1) 2023.12.19
[Redis] Strings, Lists  (0) 2023.12.19
Redis 알아보기  (0) 2023.12.19
본 게시물은 인프런 강의를 수강하고 작성된 게시물입니다.

 

Sets

Unique String 을 저장하는 정렬되지 않은 집합
Set Operation 사용 가능( ex. intersection, union, difference)

 

SADD, SMEMBERS

127.0.0.1:6379> sadd user:1:fruits apple banana orange orange
(integer) 3
127.0.0.1:6379> smembers user:1:fruits
1) "apple"
2) "banana"
3) "orange"
  • set은 집합 개념이기 때문에 중복되는 값은 들어가지 않는다.
  • sadd [멤버이름:멤버번호:key] value1, value2, value3.....
    • 시간복잡도 : 추가된 요소에 대해 O(1)을 가지며 여러 인수로 호출될때 N 요소를 추가하려면 O(N)
  • smembers 멤버이름:멤번호:키

 

SCARD

127.0.0.1:6379> scard user:1:fruits
(integer) 3
  • scard key(member:memberid:key)
    • 고유한 아이템의 수 : 현재 user:1:fruits에는 apple, banana, orange가 들어있으므로 총 3개

 

SISMEMBER

127.0.0.1:6379> sismember user:1:fruits banana
(integer) 1
127.0.0.1:6379> sismember user:1:fruits apple
(integer) 1
127.0.0.1:6379> sismember user:1:fruits lemon
(integer) 0
  • sismember set이름 : 특정 아이템이 해당 set에 포함되어있는지 알 수 있음.

 

SINTER

127.0.0.1:6379> sadd user:2:fruits apple lemon
(integer) 2
127.0.0.1:6379> smembers user:2:fruits
1) "apple"
2) "lemon"
127.0.0.1:6379> smembers user:1:fruits
1) "apple"
2) "banana"
3) "orange"
127.0.0.1:6379> sinter user:1:fruits user:2:fruits
1) "apple"
  • sinter : 두 Set의 교집합을 의미한다.

 

SDIFF

127.0.0.1:6379> sdiff user:1:fruits user:2:fruits
1) "banana"
2) "orange"
  •  sdiff : 두 set의 차집합을 의미한다. 즉 user:1:fruits 만 가지고 있는 value만 조회한다. 
    • user:1:fruits (A) user:2:fruits (B) 라고 할때 A-B 를 의미

 

SUNION

127.0.0.1:6379> sunion user:1:fruits user:2:fruits
1) "apple"
2) "banana"
3) "orange"
4) "lemon"
  • sunion : 두 set의 합집합을 의미한다.

Hashes

field-value 구조를 갖는 데이터 타입
다양한 속성을 갖는 객체의 데이터 타입을 저장할 때 유용
해시를 사용하면 무엇보다도 기본 개체를 나타내고 카운터 그룹을 지정할 수 있다.

 

해시 명령은 O(1)을 가진다.

127.0.0.1:6379> hset lecture name inflearn-redis price 100 language ko
(integer) 3
127.0.0.1:6379> hget lecture name
"inflearn-redis"
127.0.0.1:6379> hmget lecture price language invalid
1) "100"
2) "ko"
3) (nil)
127.0.0.1:6379> hincrby lecture price 10
(integer) 110
  • hset hashes 이름 field value / field value / field value : hashes 설정
  • hget : field로 value 조회
  • hmget : 여러 필드로 조회 없으면 (nil)
  • hincry : hashes에 있는 field에 해당하는 value을 특정 수만큼 증가 시킨다.

HVALS

127.0.0.1:6379> hset myhash field1 "hello"
(integer) 1
127.0.0.1:6379> hset myhash field2 "World"
(integer) 1
127.0.0.1:6379> hvals myhash
1) "hello"
2) "World"
  • HVALS key : 지정된 해시의 모든 값을 반환합니다.
  • 시간 복잡도 : O(N) N은 해시 크기

 

HSETNX

127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 1
127.0.0.1:6379> hsetnx myhash field "World"
(integer) 0
127.0.0.1:6379> hget myhash field
"Hello"
  • HSETNX key filed value : 아직 존재하지 않는 경우에만 field에 저장된 해시를 설정한다. 존재하지 않는 경우 해시가 포함된 새 키가 생성된다.
  • 시간복잡도: O(1)

 

Reference


https://redis.io/commands/sadd/

'DB > Redis' 카테고리의 다른 글

[Redis] Sorted Sets  (0) 2023.12.23
[Redis] Strings, Lists  (0) 2023.12.19
Redis 알아보기  (0) 2023.12.19
본 강의는 인프런에서 수강한 내용을 바탕을 작성된 게시글입니다.

 

 

Strings 

문자열, 숫자, serialized object(JSON string) 등 저장
대부분의 문자열 연산은 O(1)이다. 
  • set : 문자열의 값을 저장합니다.
  • setnx : 키가 아직 존재하지 않는 경우에만 문자열 값을 저장합니다. 잠금을 구현하는데 유용
  • get : 문자열 값을 검색합니다.
  • mget : 단일 작업으로 여러 문자열 값을 검색합니다.

 

SET, GET

127.0.0.1:6379> set lecture inflearn-redis
OK
127.0.0.1:6379> get lecture
"inflearn-redis"

127.0.0.1:6379> set object '{"lecture" : "inflearn-redis", "language":"en"}'
OK
127.0.0.1:6379> get object
"{\"lecture\" : \"inflearn-redis\", \"language\":\"en\"}"

127.0.0.1:6379> set inflearn-redis:ko:price 200
OK
127.0.0.1:6379> get inflearn-redis:ko:price
"200"

 

 

jedis.set("lecture", "inflearn-redis");
System.out.println(jedis.get("lecture"));

jedis.set("object", "{'lecture' : 'inflearn-redis', 'language':'en'}");
System.out.println(jedis.get("object"));

jedis.set("inflearn-redis:ko:price", "200");
System.out.println(jedis.get("inflearn-redis:ko:price"));
  • set key value
    • value로는 숫자, 문자열, object 등 저장가능
    • json은 다시 파싱해서 사용해주어야 한다.
  • get key
  • set inflearn-redis:ko:price 200
    • 강좌가 어떤 언어로 만들어져있고 가격이 얼마인지 저장하고 싶을때 다음과 같이 정의
    • 필수 규칙사항은 아니다.

 

    > SET bike:1 Deimos
    OK
    > GET bike:1
    "Deimos"

 


// Strings
String res1 = jedis.set("bike:1", "Deimos");
System.out.println("res1 = " + res1);

System.out.println("jedis.get(bike:1) = " + jedis.get("bike:1"));

 

MSET, MGET 

127.0.0.1:6379> MSET price 100 language ko
OK
127.0.0.1:6379> get price
"100"
127.0.0.1:6379> get language
"ko"
127.0.0.1:6379> MGET price language
1) "100"
2) "ko"
jedis.mset("price", "100", "language", "ko");
System.out.println(jedis.get("price"));
System.out.println(jedis.get("language"));
System.out.println(jedis.mget("price", "language"));
  • MSET key1 value2 key2 value2 ...
    • 다수의 String 타입을 한 번에 저장하는 명령어
  • MGET key1 key2 key3 ...
    • 다수의 키의 값을 한 번에 반환하는 명령어

INCR

스트링 값을 1올릴때 사용

127.0.0.1:6379> incr price
(integer) 101
127.0.0.1:6379> incrby price 20
(integer) 121

 

jedis.incr("price");
System.out.println(jedis.get("price"));
jedis.incrBy("price", 20);
System.out.println(jedis.get("price"));
  • incr key
    • Strings 값을 1올릴때 사용
  • incrby key [올릴 값]
    • Strings 값에 특정 값을 더할 때 사용

 


Lists

String을 Linked List로 저장 -> push / pop에 최적화 O(1)
Queue(FIFO) / Stack(FILO) 구현에 사용

 

  • LPUSH : 헤드에 새 요소를 추가한다.
  • RPUSH : 꼬리에 새 요소를 추가한다.
  • LLEN : 길이를 반환한다.
  • LMOVE : 한 목록에서 다른 목록으로 원자적으로 이동
  • LTRIM : 목록을 지정된 요소 범위로 줄인다.

LPUSH, RPOP, LPOP

127.0.0.1:6379> lpush queue job1 job2 job3
(integer) 3
127.0.0.1:6379> rpop queue
"job1
jedis.lpush("queue", "job1", "job2", "job3");
System.out.println(jedis.rpop("queue"));
  • lpush key [value1, value2, value3]
    • 다음과 같이 job1, job2, job3 로 데이터가 들어간다면 다음과 같이 들어가게 된다.
    • 여기서 rpop을 하게 되면 가장 오른쪽에 있는 job1이 출력되고 데이터는 삭제된다.
job3 job2 job1

 

127.0.0.1:6379> lpush stack job1 job2 job3
(integer) 3
127.0.0.1:6379> lpop stack
"job3"
  • lpush 한 후 lpop를 하는 경우 stack로 사용될 수 있다.

LRANGE

127.0.0.1:6379> lpush queue job4 job5
(integer) 4
127.0.0.1:6379> lrange queue 0 -1
jedis.lpush("queue", "job4", "job5");
System.out.println(jedis.lrange("queue", 0, -1));
left  job5 job4 job3 job2 right

 0(-5)           1(-4)         2(-3)          3(-2)       4 (-1)

  • lrange queue 0 -1

lrange은 왼쪽부터 0이며 오른쪽은 -1부터 시작한다.

127.0.0.1:6379> lrange queue 0 -1
1) "job5"
2) "job4"
3) "job3"
4) "job2"

 

127.0.0.1:6379> lrange queue -2 -1
1) "job3"
2) "job2"
127.0.0.1:6379> lrange queue 2 3
1) "job3"
2) "job2"

 


LTRIM

지정된 영역만 남길 수 있다.
127.0.0.1:6379> ltrim queue 0 1
OK
127.0.0.1:6379> lrange queue 0 -1
1) "job5"
2) "job4"
System.out.println(jedis.ltrim("queue", 0, 1));
System.out.println(jedis.lrange("queue", 0, -1));

 

 

Reference


https://linuxhint.com/redis-lset/

'DB > Redis' 카테고리의 다른 글

[Redis] Sorted Sets  (0) 2023.12.23
[Redis] Sets & Hashes  (1) 2023.12.19
Redis 알아보기  (0) 2023.12.19
본 게시글은 인프런에서 학습한 내용을 정리한 글입니다.

 

 

Redis 소개

 

Remote Dictionary Server

 

  • 다수의 서버를 사용하는 분산 환경의 서버가 공통으로 사용할 수 있는 해시테이블
  • Remote : Redis는 각각의 서버에 로컬하게 존재하지 않고 다수의 서버가 공통적으로 사용할 수 있도록 원격에 존재
    • -> 다수가 서버와 공유하는 해시테이블
  • Dictionary : 해시맵과 같이 키 밸류 형태로 상수 시간 복잡도로 사용이 가능 

 

Redis 특징

특징 설명
In-Memory 백업과 스냅샷에 디스크를 일부 사용하긴 하지만 필수는 아니다.
실제로 레디스가 활용하는 데이터는 모두 RAM에 저장
싱글 스레드(단일스레드) 기반으로 동작
Single Threaded 단일 thread에서 모든 task 처리
Cluster Mode 다중 노드에 데이터를 분산 저장 -> 안정성 & 고가용성 제공
Persistence RDB(Redis Database) + AOF(Append only File) 통해 영속성 옵션 제공
Pub/Sub Pub/Sub 패턴을 지원하여 손쉬운 어플리케이션 개발

 

 

Redis 장점

  • 높은 성능
    • 모든 데이터를 메모리에 저장하기 때문에 매우 빠른 읽기/쓰기 속도 보장
  • Data Type 지원
    • Redis에서 지원하는 Data Type을 잘 활용하여 다양한 기능 구현
  • 클라이언트 라이브러리
    • Python, Java, JavaScript 등 다양한 언어로 작성된 클라이언트 라이브러리 지원
  • 다양한 사례 / 강한 커뮤니티
    • Redis를 활용하여 비슷한 문제를 해결한 사례가 많고, 커뮤니티 도움 받기 쉬움

 

Persistence

Persistence(영속성) Redis는 주로 캐시로 사용되지만 데이터 영속성을 위한 옵션 제공
SSD와 같은 영구적인 저장 장치에 데이터를 저장
RDS(Redis Database) 장애발생 시 특정지점(Point in time Snapshot) 빠르게 캐시로 되돌려 동일한 데이터를 복제
스냅샵 특성상 새로운 스냅샷이 생성되기 이전에 일부 데이터 유실이 있을 수 있음
스냅샷 생성 중 클라이언트 요청 지연 발생
AOF(Append Only File) Redis에 적용되는 Write 작업은 모두 log에 저장
데이터 유실의 위험이 적지만, 재난 복구시 Write 작업을 다시 적용하기 때문에 RDS보다 느림
RDS + AOP  함께 적용하는 옵션 제공

 

 

캐싱(Caching)

 

데이터를 빠르게 읽고 처리하기 위해 임시로 저장하는 기술

계산된 값을 임시로 저장해두고, 동일한 계산/ 요청 발생시 다시 계산하지 않고 저장된 값 바로 사용

 

  • 주요 사례
    • CPU 캐시 : CPU와 RAM의 속도 차이로 발생하는 지연을 줄이기 위해 L1, L2, L3 캐시 사용
    • 웹 브라우저 캐싱 : 웹 페이지 데이터를 로컬 저장소에 저장하여 해당 페이지 재방문시 사용
    • DNS 캐싱 : 이전에 조회한 도메인 이름과 해당하는 IP 주소를 저장하고 재요청시 사용
    • 데이터베이스 캐싱 : MySQL과 같은 데이터베이스 버퍼풀이라는 곳에 자주사용되는 데이터와 메모리에 미리 올려놓고 사용 데이터베이스 조회나 계산 결과를 저장하여 재요청시 사용
    • CDN : 원본 서버의 컨텐츠를 PoP 서버에 저장하여 사용자가 가까운 서버에서 요청 처리
    • 어플리케이션 캐시 : 어플리케이션에서 데이터나 계산 결과를 캐싱하여 반복적 작업

 

Cache Hit / Miss

Cache Hit

Redis와 같은 캐시 서버에 특정 키를 가진 캐시를 요청했을때 정상적으로 응답이 오는 경우 (= 캐시 데이터가 존재하는 경우)

 

Cache Miss

키가 잘못되었거나 해당 데이터가 이미 만료되어 데이터를 응답하지 못해 DB원본 스토리지 조회, 데이터 캐싱하는 경우

 

 

'DB > Redis' 카테고리의 다른 글

[Redis] Sorted Sets  (0) 2023.12.23
[Redis] Sets & Hashes  (1) 2023.12.19
[Redis] Strings, Lists  (0) 2023.12.19

+ Recent posts