우수한 소프트웨어와 실용적인 튜토리얼
Linux에 Redis를 설치하여 PHP 접근 속도를 높이세요
Linux에 Redis 설치 PHP 웹사이트 접속 속도가 느리면 어떻게 해야 하나요? 요즘 많은 사람들이 워드프레스를 사용하여 웹사이트를 구축합니다. 워드프레스는 PHP 기반으로 개발된 대규모 블로그 프로그램입니다. 워드프레스 웹사이트의 접속 속도를 개선하려면 어떻게 해야 할까요? 서버 측 캐시 도구인 Redis를 설치해야 합니다. 다음은 Redis가 무엇이고 Linux에 Redis를 설치하는 방법에 대한 자세한 설명입니다.
PHP 캐싱 도구 Redis
Redis가 가장 인기 있어요PHP 캐시 도구1. 웹 애플리케이션 개발 초기에는 관계형 데이터베이스가 널리 주목을 받았는데, 당시 웹사이트의 접속률과 동시성이 낮고 상호작용도 적었기 때문입니다. 이후 트래픽 증가로 관계형 데이터베이스를 사용하는 웹사이트는 성능 병목 현상에 직면하기 시작했는데, 병목 현상의 원인은 주로 디스크 I/O였습니다. 인터넷 기술의 발전으로 다양한 유형의 애플리케이션이 끊임없이 등장하면서 오늘날 클라우드 컴퓨팅과 빅데이터 시대에는 성능 요구 사항이 더욱 높아졌습니다. 이는 주로 다음 네 가지 측면에서 나타납니다.
- 낮은 지연 읽기 및 쓰기 속도: 빠른 애플리케이션 응답으로 사용자 만족도를 크게 향상시킬 수 있습니다.
- 방대한 양의 데이터와 트래픽 지원: 검색과 같은 대규모 애플리케이션의 경우 PB 수준의 데이터를 사용하고 수백만 개의 트래픽을 처리할 수 있어야 합니다.
- 대규모 클러스터 관리: 시스템 관리자는 분산 애플리케이션을 더 쉽게 배포하고 관리할 수 있기를 바랍니다.
- 막대한 운영 비용을 고려하면 IT 부서에서는 하드웨어 비용, 소프트웨어 비용, 인건비를 크게 절감할 수 있기를 바랍니다.
이러한 문제를 해결하기 위해 NoSQL이 등장했습니다. NoSQL은 고성능, 강력한 확장성, 그리고 고가용성이라는 장점을 가지고 있으며, 다양한 개발자와 데이터센터 관리자들에게 선호되고 있습니다.
Redis란 무엇인가요?
Redis는 가장 널리 사용되는 NoSQL 데이터베이스 중 하나입니다. ANSI C로 작성된 오픈 소스 메모리 기반 영구 키-값 쌍 저장 데이터베이스로, 다양한 데이터 구조를 포함하고 네트워크를 지원합니다. 다음과 같은 특징을 가지고 있습니다.
- 메모리 연산을 기반으로 고성능을 제공합니다
- 배포를 지원하며 이론적으로는 무한히 확장 가능합니다.
- 키-값 저장 시스템
- ANSI C로 작성된 오픈 소스로 BSD 프로토콜을 준수하며 네트워크를 지원하고 메모리 또는 영구 로그 유형, 키-값 데이터베이스를 기반으로 하며 여러 언어로 API를 제공합니다.
다른 데이터베이스 유형과 비교했을 때 Redis는 다음과 같은 특징을 가지고 있습니다.
- C/S 커뮤니케이션 모델
- 단일 프로세스 단일 스레드 모델
- 풍부한 데이터 유형
- 작업은 원자적입니다
- 고집
- 높은 동시 읽기 및 쓰기
- lua 스크립트 지원
어떤 대기업들이 Redis를 사용하고 있나요?
Redis의 적용 시나리오는 무엇입니까?
Redis 애플리케이션 시나리오에는 다음이 포함됩니다: 캐싱 시스템(핫 데이터: 고빈도 읽기, 저빈도 쓰기), 카운터, 메시지 큐 시스템, 순위, 소셜 네트워크, 실시간 시스템.
Redis 데이터 유형 및 주요 기능
Redis에서 제공하는 데이터 유형은 크게 5가지 기본 유형과 1가지 사용자 정의 유형으로 나뉩니다. 이 5가지 기본 유형에는 문자열 유형, 해시 유형, 리스트 유형, 집합 유형, 순차 집합 유형이 있습니다.
문자열 유형:
이는 바이너리 안전 문자열로, 문자열뿐만 아니라 사진, 비디오 및 기타 유형의 문자열도 저장할 수 있으며 최대 길이는 512M입니다.
각 데이터 유형에 대해 Redis는 다음과 같은 다양한 작업 명령을 제공합니다.
- GET/MGET
- SET/SETEX/MSET/MSETNX
- 증가/감소
- 겟셋
- 델
해시 유형:
이 유형은 필드와 연관된 값으로 구성된 맵이며, 필드와 값은 모두 문자열 유형입니다.
해시 작업 명령은 다음과 같습니다.
- HGET/HMGET/HGETALL
- HSET/HMSET/HSETNX
- 헥시스트/HLEN
- HKEYS/HDEL
- HVALS
목록 유형:
이 유형은 삽입 순서대로 정렬된 문자열 요소의 컬렉션으로, 이중 연결 리스트를 기반으로 구현되었습니다.
목록 작업 명령은 다음과 같습니다.
- LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
- 린덱스/대범위
- LLEN/LTRIM
컬렉션 유형:
Set 타입은 순서가 없는 컬렉션입니다. List 타입과의 가장 큰 차이점은 Set의 요소들이 순서가 없고 고유하다는 것입니다.
Set 유형의 기본 계층은 해시 테이블을 통해 구현되며, 해당 작업 명령은 다음과 같습니다.
- 슬픔/팝/움직임/무서움
- 소결/SDIFF/SDIFFSTORE/SUNION
Set 유형은 주로 사회적 상황과 같은 특정 상황에서 사용됩니다. 교집합, 합집합, 차집합 연산을 통해 공통 친구, 공통 관심사, 공통 선호도와 같은 사회적 관계를 쉽게 찾을 수 있습니다.
순차적 수집 유형:
ZSet은 순서가 있는 집합 타입입니다. 각 요소는 double 타입의 점수 가중치와 연관되어 있으며, 이는 집합의 구성원들을 작은 값에서 큰 값 순으로 정렬하는 데 사용됩니다. Set 타입과 마찬가지로, ZSet의 기본 구조도 해시 테이블을 통해 구현됩니다.
ZSet 명령:
- ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
- ZINTER/ZDIFF/ZDIFFSTORE/ZUNION
Redis 데이터 구조
Redis의 데이터 구조는 다음 그림과 같습니다.
위 표에 대한 몇 가지 설명:
- 압축 리스트는 리스트 키와 해시 키의 기본 구현 중 하나입니다. 리스트 키에 적은 수의 리스트 항목만 포함되어 있고 각 리스트 항목이 작은 정수 또는 짧은 문자열인 경우, Redis는 압축 리스트를 리스트 키의 기본 구현으로 사용합니다.
- 정수 집합은 집합 키의 기본 구현 중 하나입니다. 집합에 정수 값 요소만 있고 해당 집합의 요소 수가 적은 경우, Redis는 정수 집합을 집합 키의 기본 구현으로 사용합니다.
다음은 Struct 데이터 구조를 정의하는 예입니다.
간단한 동적 문자열 SDS
C 언어의 기존 문자열의 단점을 기반으로 Redis는 다음과 같은 구조를 갖는 SDS라고 하는 단순 동적 문자열이라는 추상 유형을 구축했습니다.
SDS는 Redis의 거의 모든 데이터 구조를 실행하며 널리 사용됩니다.
SDS의 특성
C 문자열과 비교했을 때 SDS는 다음과 같은 특징을 가지고 있습니다.
- 문자열 길이를 구하기 위한 상수 복잡도
Redis에서는 SDS 문자열의 len 속성을 사용하여 저장된 문자열의 길이를 직접 얻을 수 있습니다.
문자열의 길이를 구하는 복잡성은 C 문자열의 O(N)에서 O(1)로 직접 감소합니다.
- 문자열 수정 시 발생하는 메모리 재할당 횟수를 줄입니다.
C 문자열의 특성에서 우리는 N개의 문자를 포함하는 C 문자열의 경우 기본 구현이 항상 N+1개의 문자 길이의 배열(마지막에 추가 널 문자 포함)임을 알 수 있습니다.
이때 문자열을 수정해야 하는 경우 프로그램은 C 문자열 배열의 메모리를 미리 재할당해야 합니다(확장되거나 해제될 수 있음)
메모리 재할당은 시간이 많이 걸리는 작업입니다.
Redis는 C 문자열의 단점을 피하기 위해 SDS를 교묘하게 사용합니다. SDS에서 buf 배열의 길이는 문자열의 문자 수에 1을 더한 값이 아닐 수 있습니다. buf 배열은 사용되지 않는 바이트를 포함할 수 있으며, 이는 free 속성에 기록됩니다.
동시에 SDS는 채택했습니다.공간 사전 할당이 전략을 사용하면 C 문자열이 수정될 때마다 시간이 많이 걸리는 메모리 재할당 작업을 피할 수 있으며, N개의 수정마다 N번씩 메모리 재할당이 필요했던 것을 N개의 수정에 대한 최대 N번으로 줄일 수 있습니다.
Redis에서 SDS를 간단히 정의한 내용은 다음과 같습니다.
Redis 기능 1: 트랜잭션
- 명령 직렬화, 순서대로 실행
- 원자성
- 3단계: 트랜잭션 시작 - 명령 대기열 - 트랜잭션 실행
- 명령: MULTI/EXEC/DISCARD
Redis 기능 2: Pub/Sub
- Pub/Sub은 메시징 모델입니다
- Pub은 메시지를 보내고 Sub은 메시지를 받습니다.
- Redis 클라이언트는 원하는 수의 채널을 구독할 수 있습니다.
- “불타고 잊어버렸다”
- 명령어: 게시/구독/구독 취소/구독 취소
Redis 기능 3: 스트림
- Redis 5.0의 새로운 기능
- 소비를 기다리며
- 소비자 집단(집단 내 경쟁)
- 소비 이력 데이터
- 선입선출(FIFO)
위 내용은 Redis의 기본 개념입니다. 다음으로, 개발 과정에서 발생할 수 있는 "함정"을 소개해 드리겠습니다.
Redis FAQ: 고장
개념: Redis가 키를 검색하면 키가 존재하지 않기 때문에 DB에 요청을 해야 하는데, 이를 "Redis 고장"이라고 합니다.
고장의 원인:
- 첫 방문
- 존재하지 않는 키에 대한 악의적인 액세스
- 키 만료됨
합리적인 해결 방법:
- 서버가 시작되면 미리 작성해주세요
- 미들웨어를 통해 키 명명 및 가로채기 표준화
- 자주 액세스하는 일부 키의 경우 적절한 TTL을 설정하거나 만료되지 않도록 합니다.
Redis FAQ: Avalanche
개념: Redis 캐시 계층이 어떤 이유로든 다운되면 모든 요청이 스토리지 계층으로 전달됩니다. 짧은 시간 내에 동시 요청이 많으면 스토리지 계층이 중단될 수 있는데, 이를 "Redis 애벌랜치(avalanche)"라고 합니다.
합리적인 해결 방법:
- Redis 클러스터 사용
- 전류 제한
제품 개발에 있어서 Redis의 적용 사례
이러한 이유로, 그레이프 시티(Grape City)의 설계자인 짐(Jim)이 2019년 11월 27일 오후 2시에 공개 강좌를 개최한다는 소식을 전해드리게 되어 매우 기쁩니다. 짐은 Redis의 기본 원리를 설명할 뿐만 아니라, 프로젝트팀이 Redis를 사용하면서 겪는 문제와 해결책을 시연할 예정입니다. Redis를 처음 접하는 학생들에게는 참고 및 학습 측면에서 더욱 의미 있고 가치 있는 시간이 될 것입니다. 누구든 참여하실 수 있습니다. 공개 강좌 주소는 다음과 같습니다.https://live.vhall.com/661463644.
- 백엔드는 nodeJS를 사용합니다
- Azure Redis 서비스 사용
- Redis 사용 시나리오
- 토큰 캐시, 토큰 검증에 사용됨
- IP 허용 목록
발생한 문제
- "네트워크 지터" 또는 Redis 서비스 이상으로 인해 Redis 액세스 시간 초과가 발생합니다.
- Redis 클라이언트 드라이버 안정성 문제
- 연결 풀 "끊어진 연결" 문제
- JS Promise로 인한 Redis 재설정 문제
Redis의 고급 지식을 간략하게 살펴보겠습니다.
Redis 프로토콜 고급 소개
Redis 클라이언트 통신 프로토콜: RESP(Redis Serialization Protocol), 특징은 다음과 같습니다.
- 단순한
- 빠른 파싱 속도
- 가독성이 좋다
Redis 클러스터 내부 통신 프로토콜: RECP(Redis Cluster Protocol), 그 특징은 다음과 같습니다.
- 각 노드에는 두 개의 TCP 연결이 있습니다.
- 하나는 클라이언트-서버 통신을 담당합니다(P: 6379)
- 하나는 노드 간 통신을 담당합니다(P: 10000 + 6379)
Redis 프로토콜이 지원하는 데이터 유형:
- 단순 문자(첫 번째 바이트: "+")
"+확인\r\n"
- 오류(첫 번째 바이트: "-")
"-오류 메시지\r\n"
- 숫자(첫 번째 바이트: ":")
“:123\r\n”
- 배치 문자(첫 번째 바이트: "$")
"&안녕\r\n당신은 누구입니까\r\n"
- 배열(첫 번째 바이트: "*")
"*0\r\n"
"*-1\r\n"
Redis 외에 어떤 다른 NoSQL 데이터베이스가 있나요?
시중에는 Redis와 유사한 NoSQL 데이터베이스가 많이 있습니다. 아래 그림과 같이 Redis 외에도 MemCache, Cassadra, Mongo 등이 있습니다. 아래에서 이러한 데이터베이스들을 간략하게 소개해 드리겠습니다.
멤캐시:이것은 Redis와 매우 유사한 데이터베이스이지만, Redis만큼 데이터 유형이 풍부하지는 않습니다. Memcache는 LiveJournal의 Brad Fitzpatrick이 개발했습니다. 분산형 고속 캐시 시스템으로서, 많은 웹사이트에서 웹사이트 접속 속도 향상을 위해 사용되고 있습니다. 데이터베이스에 자주 접속해야 하는 일부 대규모 웹사이트의 접속 속도 향상에 상당한 효과를 발휘합니다.
아파치 카산드라:(커뮤니티에서는 일반적으로 C*라고 함) 오픈 소스 분산형 NoSQL 데이터베이스 시스템입니다. 원래 페이스북에서 받은 편지함과 같은 간단한 형식의 데이터를 저장하기 위해 개발되었습니다.Google BigTable의 데이터 모델 및아마존 Dynamo의 완전 분산 아키텍처입니다. Facebook은 2008년에 Cassandra를 오픈 소스로 공개했습니다. 뛰어난 확장성과 성능 덕분에 Apple, Comcast, Instagram, Spotify 등에서 사용되고 있습니다.이베이, 랙스페이스,넷플릭스, 등의 유명 웹사이트에서 채택되었으며, 인기 있는 분산형 구조화 데이터 저장 솔루션이 되었습니다.
몽고디비: C++로 작성된 분산 파일 저장소 기반의 문서 지향 NoSQL 데이터베이스로, 웹 애플리케이션을 위한 확장 가능하고 고성능의 데이터 저장 솔루션을 제공하는 것을 목표로 합니다. MongoDB는 관계형 데이터베이스와 비관계형 데이터베이스의 중간 제품입니다. 비관계형 데이터베이스 중 가장 풍부한 기능을 갖춘 관계형 데이터베이스입니다. 지원하는 데이터 구조는 JSON과 유사한 BSON 형식으로 매우 느슨합니다.
Linux에 Redis 설치
다음에서는 CentOS 시스템을 예로 들어 Redis를 설치하고 WordPress에 Redis를 적용합니다.
DNF를 사용하여 Redis 설치
dnf 설치 redis
list 명령을 사용하여 설치가 성공했는지 확인하세요.
설치 후 부팅 및 시작 서비스를 설정합니다.
systemctl enable redis systemctl start redis
해당 명령어를 사용하여 Redis의 실행 상태를 확인하세요.
systemctl 상태 redis
DNF를 사용하면 Redis를 편리하고 빠르게 설치할 수 있습니다. 이제 Redis가 설치되었습니다. Redis 설정 파일은 /etc/redis.conf에 있습니다.
워드프레스에 레디스 플러그인 설치하기
WordPress 백그라운드 플러그인에서 redis를 검색하세요
Redis 객체 캐시 설치
플러그인의 전문가 버전이 필요한 경우 PHP 확장 프로그램을 설치해야 합니다.