1.Redis는 메모리 최적화를 어떻게 수행하나요?
가능한 한 해시를 사용하세요. 해시 테이블(해시 테이블에 저장되는 숫자가 작다는 의미)은 매우 작은 메모리를 사용하므로 데이터 모델을 최대한 해시 테이블로 추상화해야 합니다.
예를 들어 웹 시스템에 사용자 개체가 있는 경우 사용자의 이름, 성, 이메일, 비밀번호에 대해 별도의 키를 설정하지 말고 대신 모든 사용자 정보를 해시 테이블에 저장하세요.
2. Redis에서 파이프라인의 용도는 무엇입니까?
요청/응답 서버는 이전 요청이 아직 응답되지 않은 경우에도 새 요청을 처리할 수 있습니다. 이를 통해 응답을 기다리지 않고 서버에 여러 명령을 보내고 마지막으로 한 단계로 응답을 읽을 수 있습니다.
이것은 수십년 동안 널리 사용되어 온 기술인 파이프라이닝입니다. 예를 들어, 많은 POP3 프로토콜은 이 기능에 대한 지원을 구현하여 서버에서 새 이메일을 다운로드하는 프로세스 속도를 크게 높입니다.
3. Redis와 Redisson은 어떤 관계인가요?
Redisson은 사용자가 분산 환경, Queue, BlockingQueue에서 일부 Java 객체(Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap)를 쉽게 구현할 수 있도록 도와주는 고급 분산 조정 Redis 클라이언트입니다. , Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, 게시/구독, HyperLogLog).
4. Redis에 적합한 시나리오는 무엇입니까?
(1) 세션 캐시
Redis 사용에 가장 일반적으로 사용되는 시나리오 중 하나는 세션 캐시입니다. Redis를 사용하여 다른 스토리지(예: Memcached)보다 세션을 캐시할 때의 이점은 Redis가 지속성을 제공한다는 것입니다. 엄격하게 일관성을 요구하지 않는 캐시를 유지 관리할 때 대부분의 사람들은 사용자의 장바구니 정보가 모두 손실되면 불만을 품게 됩니다. 그래도 여전히 그럴까요?
다행히 Redis가 수년에 걸쳐 개선됨에 따라 Redis를 올바르게 사용하여 세션 문서를 캐시하는 방법을 쉽게 알아낼 수 있습니다. 잘 알려진 상용 플랫폼인 Magento도 Redis 플러그인을 제공합니다.
(2) 전체 페이지 캐시(FPC)
기본 세션 토큰 외에도 Redis는 매우 간단한 FPC 플랫폼도 제공합니다. 일관성 문제로 돌아가서, Redis 인스턴스가 다시 시작되더라도 사용자는 디스크 지속성으로 인해 페이지 로딩 속도가 감소하는 것을 볼 수 없습니다. 이는 PHP 로컬 FPC와 유사하게 크게 개선되었습니다.
Magento를 다시 예로 들면, Magento는 Redis를 전체 페이지 캐시 백엔드로 사용할 수 있는 플러그인을 제공합니다.
또한 WordPress 사용자를 위해 Pantheon에는 검색한 페이지를 최대한 빨리 로드하는 데 도움이 되는 매우 유용한 플러그인 wp-redis가 있습니다.
(3) Queue
메모리 저장 엔진 분야에서 Redis의 가장 큰 장점 중 하나는 Redis가 좋은 메시지 대기열 플랫폼으로 사용될 수 있도록 목록 및 설정 작업을 제공한다는 것입니다. Redis가 대기열로 사용하는 작업은 로컬 프로그래밍 언어(예: Python)에서 목록의 푸시/팝 작업과 유사합니다.
Google에서 "Redis 대기열"을 빠르게 검색하면 수많은 오픈 소스 프로젝트를 즉시 찾을 수 있습니다. 이러한 프로젝트의 목적은 Redis를 사용하여 다양한 대기열 요구 사항을 충족하는 매우 좋은 백엔드 도구를 만드는 것입니다. 예를 들어 Celery에는 Redis를 브로커로 사용하는 백엔드가 있습니다. 여기에서 볼 수 있습니다.
(4) 순위/카운터
Redis는 메모리에서 숫자를 늘리거나 줄이는 연산을 매우 잘 구현합니다. 세트와 정렬 세트도 이러한 작업을 수행하는 것을 매우 간단하게 해줍니다. Redis는 이 두 가지 데이터 구조를 제공합니다.
그래서 우리는 정렬된 세트에서 상위 10명의 사용자를 얻고 싶습니다. 이를 "user_scores"라고 부르겠습니다. 다음과 같이 하면 됩니다. 물론 이는 사용자 점수가 정렬되어 있다고 가정합니다. 오름차순. 사용자와 사용자의 점수를 반환하려면 다음과 같이 실행해야 합니다.
ZRANGE user_scores 0 10 WITHSCORES
Agora Games는 Ruby로 구현된 좋은 예이며 순위는 Redis를 사용하여 데이터를 저장합니다. 여기에서 볼 수 있습니다.
(5) 게시/구독
마지막(그러나 가장 중요한 것은) Redis의 게시/구독 기능입니다. 게시/구독에는 실제로 많은 사용 사례가 있습니다. 사람들이 소셜 네트워크 연결에서 이를 게시/구독 기반 스크립트의 트리거로 사용하고 심지어 Redis의 게시/구독 기능을 사용하여 채팅 시스템을 구축하는 것을 보았습니다!
5. MySQL에는 2천만 개의 데이터가 있지만 Redis에는 20만 개의 데이터만 저장됩니다. Redis의 데이터가 핫 데이터인지 확인하는 방법은 무엇입니까?
redis 메모리 데이터 세트의 크기가 특정 크기로 증가하면 데이터 제거 전략이 구현됩니다.
실제로 인터뷰 중 Redis를 검토하는 것 외에도 많은 기업이 동시성 및 고가용성 기술을 중요하게 생각합니다. 특히 일선 인터넷 기업에서는 분산,
JVM, 스프링 소스 코드 분석, 마이크로서비스는 필수 면접 질문이 되었습니다.
6. Redis 클러스터 솔루션은 어떤 상황에서 전체 클러스터를 사용할 수 없게 됩니까?
복제 모델이 없는 세 개의 노드 A, B, C가 있는 클러스터에서 노드 B에 장애가 발생하면 전체 클러스터는 5501~11000 범위의 슬롯이 부족하여 사용할 수 없게 된다고 생각합니다.
7. Redis 클러스터 솔루션으로 무엇을 해야 합니까? 계획은 무엇입니까?
codis
현재 가장 일반적으로 사용되는 클러스터 솔루션으로 기본적으로 twemproxy와 동일한 효과를 가지지만, 노드 수가 변경되면 오래된 노드 데이터를 새로운 해시 노드로 복구하는 기능을 지원합니다.
redis 클러스터
3.0에는 클러스터가 포함되어 있으며 분산 알고리즘이 일관된 해싱이 아닌 해시 슬롯 개념이며 노드 설정 슬레이브 노드를 지원하는 것이 특징입니다. 자세한 내용은 공식 문서를 참조하세요. 비즈니스 코드 계층에서 구현되면 관련되지 않은 여러 Redis 인스턴스가 생성됩니다. 코드 계층에서는 키에 대해 해시 계산이 수행된 다음 해당 Redis 인스턴스를 사용하여 데이터를 작동합니다. 이 방법은 해시 계층 코드에 대한 요구 사항이 상대적으로 높습니다. 고려 사항에는 노드 오류 후 대체 알고리즘 솔루션, 데이터 충격 후 자동 스크립트 복구, 인스턴스 모니터링 등이 포함됩니다.
8.Redis 문자열의 내부 인코딩은 무엇입니까?
int, embstr, raw
10000 미만의 정수는 캐시의 int 상수를 사용합니다.
44바이트 이하의 길이: embstr 인코딩
44바이트보다 큰 길이: 원시 인코딩
9. Redis를 지연 대기열로 사용하는 방법은 무엇입니까?
Zset을 사용하여 구현할 수 있습니다. Member는 작업 설명이고, Score는 실행 시간이며 타이머를 사용하여 정기적으로 스캔합니다. 실행 시간이 현재 시간보다 작거나 같은 작업이 있으면 즉시 실행됩니다.
10. Redis는 클러스터에서 키를 검색할 때 어떻게 특정 노드를 찾나요?
crc16 알고리즘을 사용하여 키를 해시하고 해시 값 모듈로 16384를 가져와 노드와 슬롯을 기반으로 특정 슬롯 매핑 정보를 얻습니다. (클러스터와 연결을 설정한 후 클라이언트는 슬롯 매핑 정보를 얻을 수 있습니다) 특정 슬롯을 찾기 위해 노드 주소는 키를 찾기 위해 특정 노드로 이동합니다. 키가 이 노드에 없으면 redis 클러스터는 이동된 명령을 반환하고 동시에 클라이언트에 새 노드 주소를 추가합니다. , 클라이언트는 로컬 노드 슬롯 매핑 관계를 새로 고칩니다. 마이그레이션 중에 Redis 클러스터는 클라이언트에 요청 지침을 반환합니다. 이는 클라이언트가 로컬 노드 슬롯 매핑 관계를 새로 고치지 않습니다.
11 . Redis의 지속성을 이해하셨나요?
Redis 지속성에는 RDB와 AOF의 두 가지 방법이 있습니다.
RDB: 데이터베이스 스냅샷을 바이너리 형식으로 디스크에 저장합니다.
AOF: 데이터베이스에 작성된 모든 명령과 매개변수를 프로토콜 텍스트 형식으로 AOF 파일에 기록하여 데이터베이스 상태를 기록합니다.
12. Redis는 어떤 상황에서 키 재활용을 실행하나요?
두 가지 상황: 1. 정기적(샘플링) 청소 2. 명령을 실행할 때 메모리가 maxmemory를 초과하는지 확인합니다.
13. Redis 키의 제거 전략은 무엇입니까?
8가지 유형: noeviction, 휘발성-lru, 휘발성-lfu, 휘발성-ttl, 휘발성-random, allkeylru, allkeys-lfu, allkeys-random
14. Redis 트랜잭션 메커니즘을 이해하셨나요?
Redis 트랜잭션의 개념:
Redis 트랜잭션의 본질은 명령 집합입니다. 트랜잭션은 한 번에 여러 명령 실행을 지원하며 트랜잭션의 모든 명령은 직렬화됩니다. 트랜잭션 실행 과정에서 큐에 있는 명령은 순서대로 순차적으로 실행되며, 다른 클라이언트가 제출한 명령 요청은 트랜잭션 실행 명령 시퀀스에 삽입되지 않습니다.
Redis 트랜잭션은 대기열에 있는 일련의 명령을 순차적으로 단독으로 일회적으로 실행하는 것입니다.
Redis 트랜잭션에는 격리 수준 개념이 없습니다.
일괄 작업은 EXEC 명령을 보내기 전에 대기열 캐시에 저장되며 실제로 실행되지 않습니다. 따라서 트랜잭션 내에서 업데이트를 확인하기 위한 쿼리가 없습니다. 트랜잭션 외부에서 쿼리를 볼 수 없습니다.
Redis는 원자성을 보장하지 않습니다.
Redis에서는 단일 명령이 원자적으로 실행되지만 트랜잭션은 원자성을 보장하지 않으며 롤백도 없습니다. 트랜잭션의 명령 중 하나라도 실행이 실패하더라도 나머지 명령은 계속 실행됩니다.
Redis 트랜잭션의 3단계:
트랜잭션 시작
명령어 대기열
트랜잭션 실행
Redis 트랜잭션 관련 명령:
watch key1 key2 ... : 트랜잭션이 실행되기 전에 하나 이상의 키를 모니터링합니다. 모니터링되는 키가 다른 명령에 의해 변경되면 트랜잭션이 중단됩니다(낙관적 잠금과 유사)
multi: 트랜잭션 블록의 시작 표시(대기열)
exec: 모든 트랜잭션 블록의 명령 실행(exec가 실행되면) , before 추가된 모니터링 잠금이 취소됩니다.)
discard: 트랜잭션을 취소하고 트랜잭션 블록의 모든 명령을 취소합니다.
unwatch: 모든 키에 대한 watch의 모니터링을 취소합니다.
15. Redis를 사용하여 트랜잭션을 계산할 때 수행해야 할 작업은 무엇입니까? 웹사이트의 UV?
UV는 PV와 다르므로 UV는 중복 제거가 필요합니다. 일반적으로 두 가지 솔루션이 있습니다:
1. BitMap을 사용하세요. 저장되는 것은 사용자의 uid입니다. UV를 계산할 때 비트 카운트만 수행하면 됩니다.
2. 블룸 필터를 사용하세요. 각 방문의 사용자 UID를 블룸 필터에 넣습니다. 메모리를 절약할 수 있다는 장점이 있지만, 정확한 UV를 얻을 수 없다는 단점이 있습니다. 하지만 특정 UV를 정확하게 알 필요는 없고 대략적인 크기만 필요한 장면에는 좋은 선택입니다.
16. Redis에서 큰 키를 처리하는 방법은 무엇입니까?
큰 키는 특히 큰 값을 갖는 키를 말합니다. 예를 들어 매우 긴 문자열이나 큰 세트 등이 있습니다. 큰 키는 두 가지 문제를 야기합니다:
1. 데이터 왜곡, 예를 들어 일부 노드의 메모리 사용량이 너무 높습니다.
2. 큰 키가 삭제되거나 큰 키가 자동으로 만료되면 Redis는 단일 스레드이므로 QPS가 갑자기 저하됩니다.
해결 방법: 큰 키는 조각화될 수 있습니다. 예를 들어 큰 세트는 여러 개의 작은 세트로 나눌 수 있습니다.
17. Redis에서 단축키를 처리하는 방법은 무엇입니까?
1. 단축키를 배포합니다. 예를 들어 키에 서로 다른 접미사를 추가하고 여러 키를 캐시하여 각 키가 서로 다른 노드에 배포되도록 합니다.
2. 다단계 캐싱을 사용하세요.
18. 캐시가 잘못되었나요? 캐시 침투? 캐시 눈사태? 캐시 동시성?
캐시 무효화 캐시 무효화란 다수의 캐시가 동시에 실패하여 순간적으로 DB에 대한 부담이 치솟는다는 의미입니다. 이러한 현상이 나타나는 이유는 키의 만료 시간이 동일한 값으로 설정되어 있기 때문입니다. 해결책은 키의 만료 시간에 5분 + 임의의 초와 같은 임의의 요소를 도입하는 것입니다.
캐시 침투 캐시 침투는 데이터베이스에도 캐시에도 없는 데이터 조각을 쿼리하는 것을 의미하며 데이터베이스에 대한 액세스 압력이 증가합니다. 캐시 침투에는 두 가지 솔루션이 있습니다. 빈 객체: 코드 유지 관리가 더 간단하지만 효과는 좋지 않습니다. 블룸 필터: 복잡한 코드 유지 관리, 좋은 효과.
캐시 눈사태 캐시 눈사태는 특정 기간 동안 중앙 집중식으로 캐시가 만료되는 것을 의미합니다. 현재 수많은 요청이 캐시를 우회하여 직접 데이터베이스에 요청하고 있습니다. 캐시 사태가 발생하는 데는 두 가지 이유가 있습니다. 리드 다운타임입니다. 대부분의 데이터가 유효하지 않습니다.
눈사태를 캐시하는 솔루션에는 두 가지가 있습니다.
고가용성 클러스터를 구축하여 단일 시스템 Redis의 가동 중지 시간을 방지합니다.
동의 기간 내에 다수의 키가 무효화되는 것을 방지하기 위해 만료 시간을 다르게 설정하세요.
캐시 동시성 가끔 웹 사이트의 동시 접속률이 높은 경우, 캐시에 장애가 발생하면 여러 프로세스가 동시에 DB에 쿼리하여 동시에 캐시를 설정할 수도 있습니다. 동시성이 너무 크면 이로 인해 과도 현상이 발생할 수도 있습니다. DB 및 캐시에 대한 부담이 잦습니다. 일반적인 해결 방법은 DB를 확인할 때 KEY가 없으면 잠근 다음 DB를 확인하여 캐시에 넣은 다음 다른 프로세스에서 잠금이 있음을 발견하면 잠금을 해제하는 것입니다. 그런 다음 캐시를 확인하거나 DB를 입력하기 전에 잠금이 해제될 때까지 기다립니다.
19. Redis 클러스터용 데이터베이스를 선택하는 방법은 무엇입니까?
Redis 클러스터는 현재 데이터베이스를 선택할 수 없으며 기본값은 데이터베이스 0입니다.
20. Redis에서 비밀번호를 설정하고 확인하는 방법은 무엇인가요?
비밀번호 설정: config set requirepass 123456
인증 비밀번호: auth 123456
21. Redis는 왜 모든 데이터를 메모리에 저장해야 하나요?
Redis는 가장 빠른 읽기 및 쓰기 속도를 달성하기 위해 모든 데이터를 메모리로 읽고 데이터를 비동기적으로 디스크에 씁니다.
그래서 Redis는 빠른 속도와 데이터 지속성의 특성을 가지고 있습니다. 데이터가 메모리에 저장되지 않으면 디스크 I/O 속도가 Redis 성능에 심각한 영향을 미칩니다.
오늘날 메모리가 점점 저렴해지면서 redis는 점점 더 대중화될 것입니다. 최대 메모리 사용량이 설정되면 기존 데이터 레코드 수가 메모리 제한에 도달한 후에는 새 값을 삽입할 수 없습니다.
22.Redis는 왜 Windows 버전을 공식적으로 제공하지 않나요?
현재 Linux 버전은 상당히 안정적이고 사용자 수가 많기 때문에 호환성 및 기타 문제가 발생할 수 있는 Windows 버전을 개발할 필요가 없습니다.
23. Redis는 단일 스레드인가요, 아니면 멀티 스레드인가요?
Redis6.0은 다중 스레드 IO를 사용하지만 명령 실행은 여전히 단일 스레드입니다.
Redis 6.0 이전에는 IO 스레드와 실행 스레드가 모두 단일 스레드였습니다.
24. Redis는 왜 이렇게 빠른가요?
1. 메모리 작업
2. 스레드 전환 및 잠금 경쟁의 오버헤드 제거
3.
25. 문자열형 값이 저장할 수 있는 최대 용량은 얼마인가요?
512M
26. Redis의 정식 이름은 무엇인가요?
원격 사전 서버.
27.Redis는 주로 어떤 물리적 리소스를 소비하나요?
메모리.
28.Redis에는 어떤 데이터 구조가 있나요?
Redis에는 문자열(문자열), 목록(목록), 해시(사전), 집합(집합) 및 zset(순서가 지정된 집합)의 5가지 기본 데이터 구조가 있습니다.
이 5가지가 Redis 관련 지식 중 가장 기본적이고 중요한 부분입니다.
29.Memcached에 비해 Redis의 장점은 무엇인가요?
(1) memcached의 모든 값은 간단한 문자열입니다. 이를 대체하기 위해 redis는 더 풍부한 데이터 유형을 지원합니다.
(2) redis는 memcached보다 훨씬 빠릅니다.
(3) redis는 내구성이 있습니다. 데이터 변환
30. 레디스란 무엇인가요? 장점과 단점을 간략하게 설명해주세요.
Redis는 본질적으로 memcached와 마찬가지로 Key-Value 유형의 인메모리 데이터베이스입니다. 전체 데이터베이스가 메모리에 로드되어 작동되며, 데이터베이스 데이터는 정기적인 간격으로 비동기 작업을 통해 하드 디스크에 플러시되어 저장됩니다.
Redis는 순수 메모리 작업이기 때문에 성능이 뛰어나고 초당 100,000회 이상의 읽기 및 쓰기 작업을 처리할 수 있는 성능이 알려진 가장 빠른 Key-Value DB입니다.
Redis의 우수성은 성능만이 아닙니다. Redis의 가장 큰 매력은 다양한 데이터 구조 저장을 지원한다는 것입니다. 또한, 1MB의 데이터만 저장할 수 있는 memcached와 달리 단일 값의 최대 한도는 1GB입니다. 따라서 Redis를 사용하여 많은 유용한 기능을 구현할 수 있습니다.
예를 들어 그의 List를 사용하여 FIFO 이중 연결 목록을 만들어 가벼운 고성능 메시지 대기열 서비스를 구현하고 Set을 사용하여 고성능 태그 시스템 등을 만듭니다.
또한 Redis는 저장된 Key-Value의 만료 시간을 설정할 수도 있으므로 Memcached의 향상된 버전으로도 사용할 수 있습니다. Redis의 가장 큰 단점은 데이터베이스 용량이 물리적 메모리에 의해 제한되어 대용량 데이터의 고성능 읽기 및 쓰기에 사용할 수 없다는 것입니다. 따라서 Redis에 적합한 시나리오는 주로 고성능 작업 및 적은 양의 계산으로 제한됩니다. 데이터.
추천 학습: "redis 비디오 튜토리얼"
위 내용은 Redis에 관해 자주 묻는 30가지 질문을 요약했습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!