레디스 편집하기
최신판 | 당신의 편집 | ||
7번째 줄: | 7번째 줄: | ||
레디스는 빠른 오픈 소스인 메모리 키 값 데이터 구조 스토어이다. 레디스는 다양한 인 메모리 데이터 구조 집합을 제공하므로 다양한 사용자 정의 애플리케이션을 손쉽게 생성할 수 있다. 주요 레디스 사용 사례로는 캐싱, 세션 관리, pub/sub 및 순위표를 들 수 있다. 레디스는 현재 가장 인기 있는 키값 스토어로서, [[BSD]] 라이선스가 있고, 최적화된 C 코드로 작성되었으며, 다양한 개발 언어를 지원한다. 레디스는 REmote DIctionary Server의 약어이다. | 레디스는 빠른 오픈 소스인 메모리 키 값 데이터 구조 스토어이다. 레디스는 다양한 인 메모리 데이터 구조 집합을 제공하므로 다양한 사용자 정의 애플리케이션을 손쉽게 생성할 수 있다. 주요 레디스 사용 사례로는 캐싱, 세션 관리, pub/sub 및 순위표를 들 수 있다. 레디스는 현재 가장 인기 있는 키값 스토어로서, [[BSD]] 라이선스가 있고, 최적화된 C 코드로 작성되었으며, 다양한 개발 언어를 지원한다. 레디스는 REmote DIctionary Server의 약어이다. | ||
− | 레디스는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 | + | 레디스는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 IoT 애플리케이션에서 널리 사용되고 있다. [[AWS]]는 레디스용 Amazon ElastiCache라는 최적화된 완전관리형 데이터베이스 서비스를 통해 레디스를 지원하며, 고객은 원하는 경우 AWS EC2에서 자체 관리형 레디스를 실행할 수도 있다.<ref >Redis란 무엇입니까? AWS - https://aws.amazon.com/ko/elasticache/what-is-redis/</ref> |
== 역사 == | == 역사 == | ||
13번째 줄: | 13번째 줄: | ||
== 특징 == | == 특징 == | ||
− | 레디스는 오픈 소스 소프트웨어이며 디스크가 아닌 메모리 기반의 데이터 저장소이다. NoSQL & Cache 솔루션이며 메모리 기반으로 구성된다. 명시적으로 삭제를 설정하지 않으면 데이터는 삭제되지 않는 영구적 보존이다. 여러 대의 서버 구성이 가능하며 데이터베이스로 사용될 수 있고 캐시로도 사용될 수 있는 기술이다. 성능은 서버에 따라 다르나 초당 2만 ~ 10만 회 정도 수행한다. 메모리 위에서 동작하는 레디스는 NoSQL DBMS로 분류되며 동시에 Memcached와 같은 인메모리(In-memory) 솔루션으로 분리된다. [[NoSQL]] 중에서도 레디스가 주목을 받는 이유는 데이터 저장소로 입력/출력이 가장 빠른 메모리를 채택하고 단순한 구조의 데이터 모델을 사용하여 속도가 빠르다. 그리고 캐시 및 데이터 스토어에 유리하고 다양한 [[API]]를 지원한다. 레디스는 대형 서비스 업체들이 사용자들의 대규모 메시지를 실시간으로 처리하기 위해서 사용하고 있다.<ref name="레디스"> | + | 레디스는 오픈 소스 소프트웨어이며 디스크가 아닌 메모리 기반의 데이터 저장소이다. NoSQL & Cache 솔루션이며 메모리 기반으로 구성된다. 명시적으로 삭제를 설정하지 않으면 데이터는 삭제되지 않는 영구적 보존이다. 여러 대의 서버 구성이 가능하며 데이터베이스로 사용될 수 있고 캐시로도 사용될 수 있는 기술이다. 성능은 서버에 따라 다르나 초당 2만 ~ 10만 회 정도 수행한다. 메모리 위에서 동작하는 레디스는 NoSQL DBMS로 분류되며 동시에 Memcached와 같은 인메모리(In-memory) 솔루션으로 분리된다. [[NoSQL]] 중에서도 레디스가 주목을 받는 이유는 데이터 저장소로 입력/출력이 가장 빠른 메모리를 채택하고 단순한 구조의 데이터 모델을 사용하여 속도가 빠르다. 그리고 캐시 및 데이터 스토어에 유리하고 다양한 [[API]]를 지원한다. 레디스는 대형 서비스 업체들이 사용자들의 대규모 메시지를 실시간으로 처리하기 위해서 사용하고 있다.<ref name="레디스">, Redis 개념과 특징 깃허브 - https://goodgid.github.io/Redis/</ref>레디스와 [[멤캐시드]](Memcashed)는 특징이 유사하다.<ref name="레디스란">, 레디스란 무엇인가? 미디엄 - https://medium.com/@jyejye9201/%EB%A0%88%EB%94%94%EC%8A%A4-redis-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-2b7af75fa818</ref> |
===멤캐시드 특징=== | ===멤캐시드 특징=== | ||
− | 데이터가 메모리에만 저장되어 속도가 느린 [[디스크]](Disk)를 거치지 않음으로 처리 속도가 빠르다. 데이터가 메모리에만 저장되어 프로세스가 죽거나 장비가 [[셧다운]](Shutdown) 되면 데이터가 사라진다. 캐시이기 때문에 만료일을 지정하여 만료되면 자동으로 데이터가 사라진다. 만료가 되지 않았더라도 더 이상 데이터를 넣을 메모리가 없으면 [[LRU]](Least recently used) 알고리즘에 의해 데이터가 사라져 저장소 메모리를 재사용한다. 그래서, 보통 대형 포털들에서 검색 결과 등을 캐시 하는 데 많이 사용한다.<ref name="레디스란"></ref> | + | 데이터가 메모리에만 저장되어 속도가 느린 [[디스크]](Disk)를 거치지 않음으로 처리 속도가 빠르다. 데이터가 메모리에만 저장되어 프로세스가 죽거나 장비가 [[셧다운]](Shutdown) 되면 데이터가 사라진다. 캐시이기 때문에 만료일을 지정하여 만료되면 자동으로 데이터가 사라진다. 만료가 되지 않았더라도 더 이상 데이터를 넣을 메모리가 없으면 [[LRU]](Least recently used) 알고리즘에 의해 데이터가 사라져 저장소 메모리를 재사용한다. 그래서, 보통 대형 포털들에서 검색 결과 등을 캐시 하는 데 많이 사용한다.<ref name="레디스란">, 레디스란 무엇인가? 미디엄 - https://medium.com/@jyejye9201/%EB%A0%88%EB%94%94%EC%8A%A4-redis-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-2b7af75fa818</ref> |
===멤캐시드와 레디스 비교=== | ===멤캐시드와 레디스 비교=== | ||
:{|class=wikitable width=750 | :{|class=wikitable width=750 | ||
42번째 줄: | 42번째 줄: | ||
|align=center|문자열만 지원한다. | |align=center|문자열만 지원한다. | ||
|align=center|문자열, Set, Sorted Set, Hash, List 데이터 타입을 지원한다. | |align=center|문자열, Set, Sorted Set, Hash, List 데이터 타입을 지원한다. | ||
− | |}<ref name="레디스란"></ref> | + | |}<ref name="레디스란">, 레디스란 무엇인가? 미디엄 - https://medium.com/@jyejye9201/%EB%A0%88%EB%94%94%EC%8A%A4-redis-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-2b7af75fa818</ref> |
− | == | + | == 활용 == |
− | *데이터 | + | * '''캐싱''' :레디스는 데이터 액세스(Access) 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스와 애플리케이션(Application)의 로드를 줄일 수 있는 가용성이 뛰어난 인 메모리 캐시(In Memory Cache) 구현에 적합하다. 레디스를 사용하면 빈번하게 요청되는 항목을 1밀리초(ms) 미만의 응답 시간으로 지원할 수 있고, 고가의 백 엔드를 추가하지 않고도 손쉽게 확장하여 더 많은 로드를 처리할 수 있다.<ref name="활용">AWS https://aws.amazon.com/ko/redis</ref> |
− | * | + | *'''채팅, 메시징 및 대기열''':레디스는 패턴 매칭과 다양한 데이터 구조옵션으로 게시/구독을 사용할 수 있다. 따라서 레디스에서는 고성능 채팅방, 실시간 코멘트 스트림, 소셜 미디어 피드 및 서버 상호 통신을 지원한다. 레디스 목록 데이터 구조를 사용하면 간단한 대기열을 손쉽게 구현할 수 있다. 목록은 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적합하다.<ref name="활용">AWS https://aws.amazon.com/ko/redis</ref> |
− | *레디스는 | + | *'''다양한 미디어 스트리밍''':레디스는 라이브 스트리밍 사용 사례를 지원할 수 있는 빠른 인 메모리 데이터 스토어를 제공한다. 레디스는 [[CDN]](Contents Delivery Network)이 동시에 수백만 명의 모바일 및 데스크톱 사용자에게 비디오를 스트리밍할 수 있도록 사용자 프로필 및 열람 기록에 대한 메타데이터, 수백만 사용자의 인증 정보/토큰, 매니페스트 파일을 저장하는 데 사용할 수 있다.<ref name="활용">AWS https://aws.amazon.com/ko/redis</ref> |
− | + | *'''지리 공간''':레디스는 대규모의 실시간 지리 공간 데이터를 빠르게 관리할 수 있도록 특별히 구축된 인 메모리 데이터 구조 및 연산자를 제공한다. 지리 공간 데이터를 실시간으로 저장, 처리 및 분석하는 명령을 사용하면 레디스에서 쉽고 빠르게 지리 공간을 처리할 수 있다. 레디스를 사용하여 주행 시간, 주행 거리, 안내 표시와 같은 위치 기반 기능을 애플리케이션에 추가할 수 있다.<ref name="활용">AWS https://aws.amazon.com/ko/redis</ref> | |
− | * | + | *'''실시간 분석''':레디스는 스트리밍 솔루션에 인 메모리 데이터 스토어로 사용하여 1밀리초 미만의 지연 시간으로 실시간 데이터를 수집, 처리 및 분석할 수 있다. 레디스는 소셜 미디어 분석, 광고 [[타게팅]](Targeting), 개인화 및 [[IoT]]와 같은 실시간 분석 사용 사례에 적합하다.<ref name="활용">AWS https://aws.amazon.com/ko/redis</ref> |
− | * | + | ===레디스 활용 사례=== |
− | *[[ | + | *좋아요 처리하기: 좋아요 처리에서 가장 중요한 것은 한 사용자가 하나의 댓글에 좋아요를 한 번씩만 할 수 있다는 것이다. [[RDBMS]](관계형 데이터베이스 관리 시스템, Relational DataBase Management System)에서 유니크 조건을 걸어서 구현할 수 있지만, [[인서트]](insert)와 [[업데이트]](update)가 자주 발생하는 경우 RDBMS 성능 저하가 필연적으로 발생하게 된다. 레디스의 셋을 이용하면 간단하게 구현할 수 있으며, 빠른 시간 안에 처리할 수 있다. 댓글의 번호를 key로 하고, 해당 댓글에 좋아요를 누른 회원 ID를 아이템으로 추가하면 조건을 만족할 수 있다.<ref name="레디스 활용"> 〈[https://happyer16.tistory.com/entry/%EB%A0%88%EB%94%94%EC%8A%A4Redis%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80 레디스(Redis)의 다양한 활용 사례 ]〉, 《티스토리》, 2020-03-17</ref> |
− | *[[ | + | *게임 서비스에서 일일 순 방문자 수 구하기: 순 방문자 수는 서비스에 사용자가 하루에 여러 번 방문했더라도 한 번만 카운팅 되는 값이다. 이를 구현하기 위해서는 구글 [[애널리틱스]](Analytics)와 같은 외부 서비스를 이용하거나 접속 정보를 로그 파일로 작성하여 배치 프로그램을 작성하는 방법들이 있다. 레디스의 비트 연산을 활용하면 간단하게 실시간 순 방문자를 저장하고 조회하는 방법을 구현할 수 있다.<ref name="레디스 활용"> 〈[https://happyer16.tistory.com/entry/%EB%A0%88%EB%94%94%EC%8A%A4Redis%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80 레디스(Redis)의 다양한 활용 사례 ]〉, 《티스토리》, 2020-03-17</ref> |
− | * | + | *출석 이벤트 구현하기: 일일 순 방문자 수 구하기를 이용해 매일 방문자를 구현하였고, 구해놓은 String 간의 비트를 비교하는 BITOP 커맨드를 사용하면 이 서비스를 구현할 수 있다.<ref name="레디스 활용"> 〈[https://happyer16.tistory.com/entry/%EB%A0%88%EB%94%94%EC%8A%A4Redis%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80 레디스(Redis)의 다양한 활용 사례 ]〉, 《티스토리》, 2020-03-17</ref> |
− | |||
− | |||
− | + | ==단점== | |
*[[메모리]]를 2배로 사용한다. | *[[메모리]]를 2배로 사용한다. | ||
*레디스는 싱글 스레드이기 때문에 스냅샷을 뜰 때 자식 프로세스를 하나 만들어낸 후 새로 변경된 메모리 페이지를 복사해서 사용한다. | *레디스는 싱글 스레드이기 때문에 스냅샷을 뜰 때 자식 프로세스를 하나 만들어낸 후 새로 변경된 메모리 페이지를 복사해서 사용한다. | ||
*[[copy-on-write]] 방식을 사용한다. 보통 레디스를 사용할 때는 데이터 변경이 자주 있기 때문에 실제 메모리 크기만큼 자식 프로세스가 복사하게 된다. 그로 인해 실제로 필요한 메모리양보다 더 많은 메모리를 사용하게 된다. | *[[copy-on-write]] 방식을 사용한다. 보통 레디스를 사용할 때는 데이터 변경이 자주 있기 때문에 실제 메모리 크기만큼 자식 프로세스가 복사하게 된다. 그로 인해 실제로 필요한 메모리양보다 더 많은 메모리를 사용하게 된다. | ||
*대규모 트래픽으로 인해 많은 데이터가 업데이트되면 레디스는 Memcached에 비해서 속도가 불안정하다. 이것은 레디스와 Memcached 의 메모리 할당 구조가 다르기 때문에 발생하는 현상이다. | *대규모 트래픽으로 인해 많은 데이터가 업데이트되면 레디스는 Memcached에 비해서 속도가 불안정하다. 이것은 레디스와 Memcached 의 메모리 할당 구조가 다르기 때문에 발생하는 현상이다. | ||
− | *[[jemalloc]]을 사용하기 때문에 매번 malloc과 free를 통해서 메모리 할당이 이루어진다. 반면 Memcached는 slab 할당자를 이용하여 내부적으로는 메모리 재할당을 하지 않고 관리하는 형태를 취한다. 이로 인해 레디스는 [[메모리 파편화]]가 발생하여 이 할당 비용 때문에 응답 속도가 느려진다. 다만 이는 극단적으로 봤을 때 발생하는 일이다. 대규모 서비스에서도 레디스를 많이 도입하는 것을 보면 일반적으로 스타트업 등에서 사용하여도 무방하다 볼 수 있다.<ref name="레디스"></ref> | + | *[[jemalloc]]을 사용하기 때문에 매번 malloc과 free를 통해서 메모리 할당이 이루어진다. 반면 Memcached는 slab 할당자를 이용하여 내부적으로는 메모리 재할당을 하지 않고 관리하는 형태를 취한다. 이로 인해 레디스는 [[메모리 파편화]]가 발생하여 이 할당 비용 때문에 응답 속도가 느려진다. 다만 이는 극단적으로 봤을 때 발생하는 일이다. 대규모 서비스에서도 레디스를 많이 도입하는 것을 보면 일반적으로 스타트업 등에서 사용하여도 무방하다 볼 수 있다.<ref name="레디스">, Redis 개념과 특징 깃허브 - https://goodgid.github.io/Redis/</ref> |
− | + | ===사용시 주의할 점=== | |
레디스는 인메모리 데이터 저장소로서 서버에 장애가 났을 경우 데이터 유실이 발생한다. 따라서 [[스냅샷]](Snapshot)과 [[에이오에프]](AOF) 기능을 통한 복구 시나리오가 제대로 세워져 있어야 데이터 유실에 대비한 사고에 대처할 수 있다. 그리고 캐시 솔루션으로 사용할 시 잘못된 데이터가 캐시 되는 것을 방지, 예방해야 한다. 회사에서 레디스를 운영 중 전 개발자의 실수로 작성된 [[로직]](logic)으로 캐시 데이터가 잘못 [[캐싱]](caching)되어 올바르지 않은 데이터가 꺼내져 한동안 데이터가 꼬이는 일이 있었다. 레디스와 캐싱하고자 하는 데이터 저장소의 데이터가 서로 일치하는지 주기적인 모니터링과 이를 방지하기 위한 사내 솔루션을 개발하는 것이 좋다.<ref>새로비, 〈[https://engkimbs.tistory.com/869 레디스 소개 및 아키텍처, 주의할점 ]〉, 《티스토리》, 2019-06-01</ref> | 레디스는 인메모리 데이터 저장소로서 서버에 장애가 났을 경우 데이터 유실이 발생한다. 따라서 [[스냅샷]](Snapshot)과 [[에이오에프]](AOF) 기능을 통한 복구 시나리오가 제대로 세워져 있어야 데이터 유실에 대비한 사고에 대처할 수 있다. 그리고 캐시 솔루션으로 사용할 시 잘못된 데이터가 캐시 되는 것을 방지, 예방해야 한다. 회사에서 레디스를 운영 중 전 개발자의 실수로 작성된 [[로직]](logic)으로 캐시 데이터가 잘못 [[캐싱]](caching)되어 올바르지 않은 데이터가 꺼내져 한동안 데이터가 꼬이는 일이 있었다. 레디스와 캐싱하고자 하는 데이터 저장소의 데이터가 서로 일치하는지 주기적인 모니터링과 이를 방지하기 위한 사내 솔루션을 개발하는 것이 좋다.<ref>새로비, 〈[https://engkimbs.tistory.com/869 레디스 소개 및 아키텍처, 주의할점 ]〉, 《티스토리》, 2019-06-01</ref> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== 평가 및 전망 == | == 평가 및 전망 == | ||
83번째 줄: | 70번째 줄: | ||
==참고 자료== | ==참고 자료== | ||
− | * | + | *Redis란 무엇입니까? AWS - https://aws.amazon.com/ko/elasticache/what-is-redis/ |
*Redis Wikipedia - https://en.wikipedia.org/wiki/Redis | *Redis Wikipedia - https://en.wikipedia.org/wiki/Redis | ||
− | * | + | *레디스란 무엇인가? 미디엄 - https://medium.com/@jyejye9201/%EB%A0%88%EB%94%94%EC%8A%A4-redis-*%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-2b7af75fa818 |
− | + | *AWS - https://aws.amazon.com/ko/redis | |
− | * | + | *〈[https://happyer16.tistory.com/entry/%EB%A0%88%EB%94%94%EC%8A%A4Redis%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80 레디스(Redis)의 다양한 활용 사례 ]〉, 《티스토리》, 2020-03-17 |
*〈[https://codingmania.tistory.com/18 레디스 개념 및 특징 ]〉, 《티스토리》, 2016-06-10 | *〈[https://codingmania.tistory.com/18 레디스 개념 및 특징 ]〉, 《티스토리》, 2016-06-10 | ||
+ | *깃허브 - https://kimpaper.github.io/2016/07/27/redis-datatype/ | ||
+ | *Redis 개념과 특징 깃허브 - https://goodgid.github.io/Redis/ | ||
*새로비, 〈[https://engkimbs.tistory.com/869 레디스 소개 및 아키텍처, 주의할점 ]〉, 《티스토리》, 2019-06-01 | *새로비, 〈[https://engkimbs.tistory.com/869 레디스 소개 및 아키텍처, 주의할점 ]〉, 《티스토리》, 2019-06-01 | ||
− | |||
− | |||
*Memcached vs Redis it-swarm - https://www.it-swarm.dev/ko/caching/memcached-%EB%8C%80-redis/1067241005/ | *Memcached vs Redis it-swarm - https://www.it-swarm.dev/ko/caching/memcached-%EB%8C%80-redis/1067241005/ | ||