쿠팡에서 레디스DB라는 문제가 발생했다고한적이있다. 왜 이런일이발생했을가?

32비트 CPU에서 최댓값은 Integer.MAX값 왜 이게 나오냐 key값이 너무 많아지면 문제가생긴것이쿠팡이다.

그래서 레디스 패치내용에서는 long으로 바꿨다

 

What is Redis

외부에있는 Dictionary(Hash map : key-value)를 사용하는 데이터베이스(Server)

= 메모리상에 저장하는 데이터를 저장하는 서버(In Memory Data Strucete store)

 

Cache란?

나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것 (예상되는 요청결과값을 저장해두었다가 전달하는거)

 

어디에? 저장하는게 빠를가?

바로 이걸알기위해선 메모리 계층을 알아야합니다

메모리 계층구조

위로갈수록 빠르고 비싸고 아래로는 크고 저렴한 저장소입니다.

그래서 메인메모리에 저장하면 더 빠르니까 어떨까 하고나온것이 레디스(In-memory Database Cache)

Database보다 더 빠른 Memory에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자

 

Redis vs Memcached (인메모리 데이터베이스는 무엇이있을가 대표적인 2가지)

가장큰 차이점은 컬렉션 자료구조이다

Memcached에 비해 Redis는 기본적으로 String, Bitmap, Hash, List, set, Sorted Set을 제공합니다.

추가적으로 정렬 가능합니다

즉 Collections을 잘 이용하는 것만으로 시간 단축과, 생각하지 못한 여러가지 문제를 줄여줄수있기때문에

비즈니스 로직에 집중할수있는 장점이 있다고 생각해 Redis가 주로사용되는것같습니다.

 

💡추가적으로 RDB가있는데 레디스를 사용하는것은 속도뿐만아니라 RDB에서는 Set이라는 자료구조가 없지만 Redis는 더빠르고 Set이라는 자료구조가있기때문에 사용하는 것이기도 하다.

RDB로 좋아요를 한번만누를수있도록한다면 INSERT를한후 찾을떄 WHERE를 통해서 찾을텐데 이렇게 WHERE문을통해 전체 다 찾는 행위보다 Redis를 사용하면 Set자료구조를 이용하기떄문이다. (Set 자료구조의 key값 탐색과정을 공부해보자) 

Set자료구조는 Tree-set을 제외한 모두 시간복잡도가 O(1)입니다. 그래서 RDB의 WHERE문 탐색인 O(n)보다 빠릅니다

 

 

Java - Redis

그렇다면 자바도  HashMap자료구조를 지원하는데 왜 레디스를 사용할가?

바로 하나의 서버에서만 돌아가기떄문에 다른 서버에서는 공유하지못하기떄문입니다.

그래서 세션문제를 위해 외부저장소를 사용하기도 합니다. + race condition상태가 날수도있기때문이다.

그렇다면 ConcurrentHashMap은 Race Condition문제가 없지만 다른서버에서 공유를 못하기떄문이다.

 

Redis의 Race Condition 해결

- Redis는 기본적으로 Single Thread이다

- Redis자료구조는 Atomic성질을 가진다 그래서 Critical Section에 대한 동기화를 제공합니다.

- 서로 다른 여러 Transaction Read/Write 원치 않는 결과를 막아주도록 동기화를 제공합니다

 

임계 구역이란?

파일, 입출력, 공유 데이터 등 원자적으로 실행할 필요가 있는 명령문 또는 코드의 일부 영역이다. 

 

Redis는 어디에 사용할가요?

여러서버에서 같은 데이터를 공유할때

Atomic자료구조 나 캐시를 사용할때 !!! 

 

Redis사용시 주의해야할점(더 잘 활용하려면)

Single Thread이기 때문에 시간 복잡도를 고려해야 한다. (싱글쓰레드라서 빨리빨리처리해야한다 그래서 시간복잡도를 고려해야한다 나머지요청이 안받아지기때문에)

In-memory 특성상 메모리 파편화, 가상메모리 이해 필요합니다.

 

자바에서 사용하려면 Jedis vs Letuce?

Lettuce는 TPS/CPU/Connection 개수/응답속도 등 전 분야에서 우위에 있습니다.

Lettuce를 사용합시다.

 

https://jojoldu.tistory.com/418

 

Jedis 보다 Lettuce 를 쓰자

Java의 Redis Client는 크게 2가지가 있습니다. Jedis Lettuce 둘 모두 몇천개의 Star를 가질만큼 유명한 오픈소스입니다. 이번 시간에는 둘 중 어떤것을 사용해야할지에 대해 성능 테스트 결과를 공유하

jojoldu.tistory.com

https://velog.io/@mu1616/%EB%A0%88%EB%94%94%EC%8A%A4-Redis%EC%9D%98-%EA%B0%9C%EB%85%90-%ED%8A%B9%EC%A7%95

 

레디스 (Redis)의 개념, 특징

레디스는 Remote Dictionary Server의 약자로서, 키-값 구조의 데이터를 메모리에 저장하고 관리하기 위한 데이터베이스 관리 시스템이다.서버가 1대라면 HashMap을 사용하면 간단하지만, 서버가 여러대

velog.io

https://zangzangs.tistory.com/72

 

인메모리 데이터 저장소 Redis, 왜 사용할까? #Redis 파헤치기

인메모리 데이터 저장소 Redis 개발을 하다보면 트랜잭션이 많이 발생하는 화면에서 느껴지는 느림(?) 같은 것을 느끼곤 했다. 자주사용되는 하지만 세션에 담고 있기에는 뭔가 모호한 것들을 조

zangzangs.tistory.com

https://www.youtube.com/watch?v=Gimv7hroM8A&t=620s 

 

'DataBase' 카테고리의 다른 글

[DataBase] 인덱스(index)  (0) 2022.08.25

+ Recent posts