1.redis 개요

 

레디스(Redis)는 인메모리 데이터 저장소로서 key-value 기반의 NoSQL입니다. 이것은 모든 데이터를 메모리에 저장하고 조회하는 방식으로 작동합니다. 디스크 저장 방식의 데이터베이스가 필요하지 않은 상황에서 사용되며, 매우 빠른 성능을 제공합니다. 레디스는 다양한 자료 구조를 지원하며, 캐싱, 메시지 브로커 등 다양한 용도로 활용됩니다

 

-----------------------------------


2.redis 데이터 타입


2-1. Strings (문자열)
최대 512MB까지의 문자열 값을 저장할 수 있습니다.
이진 데이터나 JPEG 이미지와 같은 바이너리 데이터도 저장 가능합니다.
증감 연산에 적합하며, 문자열 간 매핑도 가능합니다.

 

SET --- 값을 저장하는 명령어
SETNX --- 값이 없는 경우에는 저장하는 명령어
GET --- 데이터 조회를 위한 명령어
MGET --- 여러개의 데이터를 한번에 조회할 수 있는 명령어
INCR --- 원자적 숫자 증가 명령어
DECR --- 원자적 숫자 감소 명령어

 

 

2-1.  Lists (리스트)
순서가 있는 데이터 집합으로, 중복 허용됩니다.
왼쪽 또는 오른쪽에서 요소를 추가하거나 제거할 수 있습니다.

이러한 특성으로 주로 큐(Queue)와 스택(Stack)으로 사용됩니다.

 

LPUSH(LEFT PUSH) -- 모든 값을 리스트의 처음에 넣는 명령어
RPUSH(RIGHT PUSH) -- 모든 값을 리스트의 마지막에 넣는 명령어
LPOP(LEFT POP) -- 리스트의 맨 처음 값을 뽑아내는 명령어
RPOP(RIGHT POP) -- 리스트의 맨 마지막 값을 뽑아내는 명령어
LLEN -- 리스트의 길이를 알아낼 수 있는 명령어
LTRIM -- 특정 인덱스까지 리스트를 잘라내는 명령어
LRANGE -- 특정 인덱스까지 값을 알아내는 명령어
BLPOP( Block Left pop ) -- 리스트에 값이 있을 경우에만 리스트의 LEFT 값을 리턴
BRPOP( Block right pop ) --  리스트에 값이 있을 경우에만 리스트의 RIGHT 값을 리턴
LREM -- 특정 값을 지정한 횟수만큼 제거합니다.
LINDEX -- 특정 인덱스의 값을 조회하거나 변경할 수 있습니다.
LSET -- 특정 인덱스의 값을 변경합니다.

LPOS -- 특정 값의 인덱스를 조회할 수 있습니다;.

 

예를 들어

특정 redis key의 List 형태 value의 "특정 데이터"만 삭제하는 로직을 생각해보자.

 

LREM 'listKey' 0 value1

(모든 'value1' 값을 삭제)

 

 

2-3.  Hashes (해시)
필드와 값으로 구성되며, 하나의 키에 여러 개의 필드를 저장할 수 있습니다.
주로 객체를 표현하는 데 사용됩니다.

(즉, value가 key value 형태로 이루어져 있습니다.)

 

HSET - hash 데이터 저장
HGET - hash 데이터 조회
HGETALL - hash 데이터 key value 모두 가져오기
HMGET - hash 데이터 value들만 가져오기
HDEL - hash 데이터 삭제
HINCRBY - hash 데이터 원자값 증가

 


2-4.  Sets (집합)
중복된 데이터를 허용하지 않는 집합입니다.
여러 개의 값으로 구성되며, 하나의 키에 여러 번 추가해도 중복되지 않습니다.

 

  1. SADD key member [member ...]: 하나 이상의 멤버를 Sets에 추가합니다.
    • 예시: SADD myset 1 2 3 (결과: 3, 중복 제거)
  2. SCARD key: Sets의 멤버 수를 반환합니다.
    • 예시: SCARD myset (결과: 3)
  3. SMEMBERS key: Sets의 모든 멤버를 조회합니다.
    • 예시: SMEMBERS myset (결과: [1, 2, 3])
  4. SISMEMBER key member: 주어진 멤버가 Sets에 속하는지 확인합니다.
    • 예시: SISMEMBER myset 2 (결과: 1, 멤버 존재)
  5. SREM key member [member ...]: Sets에서 멤버를 제거합니다.
    • 예시: SREM myset 3 (결과: 1, 멤버 제거)

 


2-5.  Sorted Sets (정렬된 집합)
Set에 'score’라는 필드가 추가된 데이터 타입입니다.
데이터 값을 score로 정렬하며, score가 같다면 데이터 값으로 정렬됩니다.
정렬된 데이터가 필요한 경우 사용합니다.

 

ZADD - Sorted Set 데이터추가
ZREM - Sorted Set 데이터삭제
ZRANGE - Sorted Set 조회
ZCARD - 해당 key에 몇개의 sorted set이 있는지 리턴
ZRANK / ZREVRANK - 순위 리턴 / 역순 순위 리턴
ZINCRBY - 증가 또는 감소된 score를 리턴

 

 

2-6.  Bitmaps (비트맵)
비트 단위로 데이터를 저장하는 자료구조입니다.
주로 비트 연산을 수행할 때 활용됩니다.

(비트맵 데이터 타입은 메모리를 적게 사용하여 대량의 데이터 저장에 유리합니다.)

 

SETBIT : 비트값 저장
GETBIT : 비트 조회
BITCOUNT : 값이 1인 비트의 개수를 세는 데 사용

 

 

 

2-7. Geospatial

Geospatial 은 2차원 지도상 위.경도 좌표를 의미합니다.

좌표를 저장할때 유용한 데이터타입이고, 이 좌표와 관련된 여려 명령어들을 제공합니다.

 

GEOADD : 좌표 저장
GEOSEARCH : 특정 좌표기준으로 주변에 저장된 좌표가 있는지 조회
GEODIST : 위치간 거리정보 조회기능
GEOPOS : 저장된 좌표 정보 조회

 


2-8.  HyperLogLogs (하이퍼로그로그)
고유한 요소의 개수를 추정하는 자료구조입니다.
중복을 제거하고 고유한 요소의 개수를 추적할 때 사용됩니다.

.

------------------------------------------------------

 

3.참고

https://blog.naver.com/PostView.naver?blogId=wjavmtngkr1&logNo=223333741269&categoryNo=36&parentCategoryNo=0&viewDate=&currentPage=2&postListTopCurrentPage=1&from=postView

 

Redis ) Redis 데이터 타입과 명령어 모음집(Strings,Lists )

Strings 가장 대표적인 타입으로 바이너리 , 문자 데이터를 저장한다. 그냥 우리 프로그래밍 언어 배울 때...

blog.naver.com

https://brunch.co.kr/@springboot/205

 

레디스 List, Sorted Set 자료형

스프링부트 환경에서 레디스 List, Sorted Set 자료형 사용 | 레디스는 다양한 데이터 자료구조를 제공한다. String List Hashes Set Sorted Set 이글에서는 List 와 Sorted Set 에 대해서 소개할 예정인데 레디스

brunch.co.kr

https://blog.naver.com/wjavmtngkr1/223334965551

 

Redis ) Redis 데이터 타입과 명령어 모음집(Hash , Sorted Set )

Hash Hash 는 key , value 쌍으로 데이터를 저장할 수 있는 데이터타입을 의미한다. 아마 이 구조에 대해...

blog.naver.com

https://blog.naver.com/wjavmtngkr1/223336644233

 

Redis ) Redis 데이터 타입과 명령어 모음집( Geospatial , Bitmap )

Geospatial Geospatial 은 2차원 지도상 위.경도 좌표를 의미한다. 좌표를 저장할때 유용한 데이터타입이...

blog.naver.com

 

'개발자 이야기 > 기타' 카테고리의 다른 글

RDB 인덱스  (0) 2024.05.08
Tree 자료구조 종류  (0) 2024.05.08

1.RDBMS 인덱스란?
인덱스 (Index)는 관계형 데이터베이스 관리 시스템 (RDBMS)에서 테이블에 대한 검색 속도를 높여주는 자료 구조입니다. 
이를 통해 특정 테이블의 레코드를 전부 다 확인하는 것이 아니라 인덱싱된 자료 구조를 통해 검색되기 때문에 검색 속도가 빨라집니다.

인덱스에는 여러 가지 유형이 있지만, 가장 많이 사용되는 구조는 B-TREE 구조입니다. 
B-TREE는 데이터베이스에서 메모리에 일정 공간을 사용하여 저장됩니다.

 

 

2.기본 용어 정리

-블록 : 디스크 I/O를 진행하는 최소 단위

-페이지 : 블록이 메모리에 올라온 것

 

 

3.인덱스를 사용하는 이유?

3-1.예시 쿼리

-> SELECT * FROM user WHERE user_name = 'minwoo'

 

3-2.풀스캔의 경우

-> 모든 데이터를 다 읽으므로 단순 생각했을 때 시간복잡도는 O(N)

 

 

3-3.index가 사용되는 경우

-> 보통 인덱스의 자료구조인 B-Tree 기준으로 단순 생각했을 때 시간복잡도는 O(logN)

-> 결국 index는 조건을 만족하는 row를 빠르게 찾기 위해 사용함.



4.단일 인덱스

4-1.예시 쿼리

-인덱스 생성 쿼리 : CREATE INDEX user_PK_idx ON user (PK)

-조회 쿼리 : SELECT * FROM user WHERE PK = '3'

 

4-2.인덱스를 통해 조회 예시

 





5.결합 인덱스 (멀티 컬럼 인덱스)
5-1.예시 쿼리

-인덱스 생성 쿼리 : 

-조회 쿼리 : 

 

5-2.생성된 인덱스 모습

 

 

6.커버링 인덱스

6-1.예시 쿼리

-인덱스 생성 쿼리 : 

-조회 쿼리 : 

 

6-2.내용



6.실무에선 어떻게 활용할 수 있을까?

6-1. 인덱스 생성 여부 파악

가령 "성별"과 같은 컬럼은 "남성" 또는 "여성" 데이터가 약 50%씩 저장 되리라는 것을 예상할 수 있습니다.

그렇다면, "성별" 컬럼의 경우 인덱스를 생성하더라도, 전체 레코드(row) 中 약 절반의 데이터를 조회해야 하므로 이 경우엔 인덱스를 사용하는 것 보다 풀스캔이 나으리라는 것을 예상할 수 있습니다.

이러한 판단을 통해 인덱스를 사용해야할 컬럼에만 인덱스 생성을 잘 적용할 수 있을 것으로 보입니다.

 

※ 참고

옵티마이저는 논클러스터 인덱스를 통해 레코드 1건을 읽는 것이 테이블을 통해 직접 읽는 것 보다 4~5배 정도 비용이 더 많이 드는 것으로 예측한다. (왜냐하면 위의 논클러스터 인덱스 개념처럼 2단계로 나눠서 작업하기 때문)

하지만 DBMS는 우리가 원하는 레코드가 어디있는지 모르므로, 모든 테이블을 뒤져서 레코드를 찾아야한다. 이는 엄청난 디스크 읽기 작업이 필요하므로 상당히 느리다.


하지만 인덱스를 사용한다면 인덱스를 통해 PK를 찾고, PK를 통해 레코드를 저장된 위치에서 바로 가져올 수 있으므로 디스크 읽기가 줄어들게 된다. 그렇기 때문에 레코드를 찾는 속도가 훨씬 빠르며, 이것이 인덱스를 사용하는 이유이다.


반면에 인덱스를 타지 않는 것이 효율적일 수도 있다. 인덱스를 통해 레코드 1건을 읽는 것이 4~5배 정도 비싸기 때문에, 읽어야 할 레코드의 건수가 전체 테이블 레코드의 5~30%를 넘어서면 인덱스를 이용하지 않는 것이 효율적이다. 이런 경우 옵티마이저는 인덱스를 이용하지 않고 테이블 전체를 읽어서 처리한다.

 

 

6-2.멀티 컬럼 인덱스 생성 시

 

6-3.상황에 따른 힌트 적용




 

 

7.참고

https://mangkyu.tistory.com/285

 

[MySQL] 프라이머리 키(PK, Primary Key)에 대해 쉽고 완벽하게 이해하기

이번 내용은 RealMySQL 8.0 책을 보면서 추가적으로 공부하여 정리한 내용입니다. 따라서 MySQL의 InnoDB가 아닌 경우에는 다를 수 있으니 참고 부탁드립니다. 1. 프라이머리 키(PK, Primary Key)와 클러스터

mangkyu.tistory.com

https://mangkyu.tistory.com/286

 

[MySQL] B-Tree로 인덱스(Index)에 대해 쉽고 완벽하게 이해하기

인덱스를 저장하는 방식(또는 알고리즘)에 따라 B-Tree 인덱스, Hash 인덱스, Fractal 인덱스 등으로 나눌 수 있습니다. 일반적으로 B-Tree 구조가 사용되기 때문에 B-Tree 인덱스를 통해 인덱스의 동작

mangkyu.tistory.com

https://mangkyu.tistory.com/96

 

[Database] 인덱스(index)란?

1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내

mangkyu.tistory.com

https://sihyung92.oopy.io/database/mysql-index

 

Mysql 인덱스 - 클러스티드 인덱스와 논클러스티드 인덱스 개념편

인덱스란

sihyung92.oopy.io

https://www.youtube.com/watch?v=IMDH4iAQ6zM

https://www.youtube.com/watch?v=liPSnc6Wzfk

 

'개발자 이야기 > 기타' 카테고리의 다른 글

Redis 개요 및 데이터 타입  (0) 2024.05.08
Tree 자료구조 종류  (0) 2024.05.08

 

1.이진 트리 (Binary Tree)
모든 노드가 최대 2개의 서브 트리를 가지는 트리입니다.
가장 많이 사용되며, 서브 트리도 모두 이진 트리여야 합니다.
이진 트리의 서브 트리는 공집합일 수 있습니다.
예시: 이진 탐색 트리 (Binary Search Tree)  등


2. 포화 이진 트리 (Full Binary Tree)
각 레벨에 노드가 꽉 차 있는 이진 트리입니다.
노드에 레벨 단위로 번호를 붙일 수 있으며, 번호는 항상 일정합니다.


3. 완전 이진 트리 (Complete Binary Tree)
높이가 k일 때, 레벨 1부터 k-1까지는 노드가 채워져 있고, 마지막 레벨 k에서는 왼쪽부터 오른쪽으로 노드가 순서대로 채워진 이진 트리입니다.
마지막 레벨에서는 노드가 꽉 차 있지 않아도 되지만, 중간에 빈 곳이 있으면 안 됩니다.

예시 : java Heap(힙)


4. B-트리 (B-Tree)
데이터베이스와 파일 시스템에서 사용되는 트리 구조입니다.
다양한 차수를 가지며, 데이터를 효율적으로 저장하고 검색하는 데 사용됩니다.

B-Tree는 자식 2개 만을 갖는 이진 트리(Binary Tree)를 확장하여 N개의 자식을 가질 수 있도록 고안된 것입니다. 그리고 좌우 자식 간의 균형이 맞지 않을 경우에는 매우 비효율적이라, 항상 균형을 맞춘다는 의미에서 균형 트리(Balanced Tree)라고 불립니다.

B-Tree는 최상위에 단 하나의 노드 만이 존재하는데, 이를 루트 노드(Root Node)라고 합니다. 그리고 중간 노드를 브랜치 노드(Branch Node), 최하위 노드를 리프 노드(Leaf Node)라고 합니다.


5. B+ 트리 (B+ Tree)
B-트리의 변형으로, 데이터베이스 인덱스에서 주로 사용됩니다.
리프 노드에만 데이터가 저장되며, 리프 노드는 연결 리스트로 연결되어 있습니다.

'개발자 이야기 > 기타' 카테고리의 다른 글

Redis 개요 및 데이터 타입  (0) 2024.05.08
RDB 인덱스  (0) 2024.05.08

+ Recent posts