쿠팡에서 레디스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
레디스 (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