이 글은 Redis에 대한 관련 지식을 제공하며, 주로 파일 이벤트 및 시간 이벤트와 관련된 문제를 소개합니다. 파일 이벤트는 서버에 의한 소켓 작업의 추상화이고 시간 이벤트는 서버에 의한 이러한 작업의 타이밍입니다. 작업의 추상화는 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: Redis Tutorial
Redis는 6.0 이전에는 단일 스레드였습니다. 6.0 이후에는 구성 파일을 통해 멀티스레딩을 활성화할 수 있습니다. io를 실행하여 I/O 속도를 높입니다.
파일 이벤트 프로세서는 소켓, I/O 멀티플렉서, 파일 이벤트 디스패처, 이벤트 프로세서의 네 부분으로 구성됩니다.
I/O 멀티플렉서는 여러 소켓을 수신하고 이벤트를 생성한 소켓을 파일 이벤트 디스패처로 전송하는 역할을 합니다. 여러 파일 이벤트가 동시에 발생할 수 있지만 단일 I/O 멀티플렉서는 항상 생성된 모든 이벤트 소켓을 대기열에 넣은 다음 이 대기열을 사용하여 순서를 지정하고 동기화합니다. 배달 소켓은 한 번에 한 소켓씩 파일 이벤트로 전달됩니다. 이전 소켓에서 생성된 이벤트가 처리되면(소켓과 관련된 이벤트 처리가 완료됨) I/O 멀티플렉서는 계속해서 다음 소켓을 파일 이벤트 디스패처로 전송합니다. 파일 이벤트 디스패처는 I로부터 소켓을 받습니다. /O 멀티플렉서이며 소켓에서 생성된 이벤트 유형에 따라 해당 이벤트 핸들러를 사용합니다. 서버는 다양한 문자에 대해 서로 다른 소켓 연결을 실행하며, 이러한 핸들러는 이벤트가 발생할 때 서버가 수행해야 하는 작업을 정의합니다.
Redis 다중화 프로그램의 모든 기능은 select, epoll, evport 및 kqueue와 같은 I/O 다중화 함수 라이브러리를 패키징하여 구현됩니다.
AE_READABLE 이벤트
소켓을 읽을 수 있게 되거나(클라이언트가 쓰기 또는 닫기 작업을 수행함) 응답할 수 있는 새 소켓이 나타나면 소켓은 AE_READABLE 이벤트를 생성합니다.
AE_WAITABLE 이벤트
소켓이 쓰기 가능해지면(클라이언트가 읽기 작업을 수행함) AE_WAITABLE 이벤트가 생성됩니다.
I/O 멀티플렉서는 AE_READABLE 이벤트와 AE_WAITABLE 이벤트를 모두 수신합니다. 두 개의 이벤트가 동시에 발생하면 이벤트 디스패처는 AE_READABLE 이벤트의 우선순위를 지정합니다. 즉, 서버가 먼저 소켓을 읽은 다음 소켓을 씁니다.
먼저 Redis 클라이언트가 서버에 대한 연결을 시작한 다음 청취 소켓이 AE_READABEL 이벤트를 생성하여 실행될 연결 응답 프로세서를 트리거하고 프로세서는 클라이언트의 연결에 응답합니다. 요청에 응답한 다음 클라이언트 소켓과 클라이언트 상태를 생성하고 클라이언트 소켓의 AE_REAADABEL 이벤트를 명령 요청 프로세서와 연결하여 클라이언트가 주 서버에 명령 요청을 보낼 수 있도록 합니다.
나중에 클라이언트가 메인 서버에 명령 요청을 보낸다고 가정하면 클라이언트 소켓은 AE_READABEL 이벤트를 생성하여 명령 요청 프로세서가 실행되도록 트리거합니다. 프로세서는 클라이언트의 명령을 읽은 다음 실행을 위해 관련 프로그램에 전달합니다. .
명령을 실행하면 해당 명령 응답이 생성됩니다. 이 명령 응답 줄을 클라이언트에 다시 전송하기 위해 서버는 AE_WAITABLE 이벤트를 명령 응답 프로세서와 연결합니다. 클라이언트가 명령 응답을 읽으려고 하면 클라이언트는 AE_WAITABLE 이벤트를 생성하여 명령 응답 프로세서의 실행을 트리거합니다. 명령 응답 프로세서가 전체 서버의 소켓에 명령 응답을 쓴 후 서버는 클라이언트를 해제합니다. 소켓 AE_WAITABLE 이벤트는 명령 응답 처리기 실행과 연결됩니다.
시간 이벤트가 시간 이벤트인지 주기 이벤트인지는 시간 이벤트 프로세서의 반환 값에 따라 다릅니다. 이벤트 프로세서가 ae.h/AE_NOMORE를 반환하면 이 이벤트는 시간 이벤트이며 이벤트는 다음과 같습니다. 한 번 도착한 후 처리하고 다시는 도착하지 않습니다. 이벤트 핸들러가 AE_NOMORE 이외의 정수 값을 반환하는 경우 이벤트는 주기적 이벤트입니다. 시간 이벤트에 도달하면 서버는 이벤트 핸들러의 반환 값을 기반으로 이벤트의 when 속성을 업데이트합니다. 이벤트는 일정 시간 동안 계속되며, 일정 시간이 지나면 다시 도착하여 이런 식으로 업데이트되어 실행됩니다.
서버는 모든 시간 이벤트를 순서가 지정되지 않은 연결 목록에 넣습니다(Unordered는 id 필드가 아니라 when 필드를 참조하므로 매번 연결 목록 전체를 순회해야 합니다. ). 이벤트 실행기가 실행되면 전체 연결 목록을 순회하여 도착한 모든 이벤트를 찾고 해당 이벤트 핸들러를 호출합니다.
여기서 설명해야 할 점은 비순차 연결 리스트임에도 불구하고 연결 리스트의 길이가 그리 길지 않기 때문에 일반 모드에서는 Redis 서버가 serverCron을 시간 이벤트로만 사용하므로 이곳은 포인터 역할을 하며 벤치마크 모드에서는 서버가 두 개의 시간 이벤트만 사용하므로 전체 순회가 성능에 미치는 영향은 미미합니다.
계속 실행되는 Redis 서버는 서버가 장기간 안정적으로 실행될 수 있도록 자체 리소스와 상태를 정기적으로 확인하고 조정해야 합니다. 이러한 일반적인 작업은 redis.c/serverCron 기능에 의해 수행됩니다. 주요 기능 작업은 다음과 같습니다:
서버에는 파일 이벤트와 시간 이벤트의 두 가지 이벤트 유형이 있으므로 서버는 이 두 이벤트를 예약하고 파일 이벤트를 처리할 시기와 시간을 처리할 시기를 결정해야 합니다. 이벤트, 이를 처리하는 데 소요되는 시간 등
처리 과정의 의사 코드는 다음과 같습니다.
def aeProcessEvents(): # 获取到达时间离当前最近的时间事件 tem_event = aeSearchNearestTimer() # 计算上一步获得到的事件 距离到达还有多少秒 remaind_ms = time_event.when - unix_ts_now() # 如果事件已经到达, 那么remaind_ms的值可能为负数,设置为0 remaind_ms = max(remaind_ms, 0) # 阻塞并等待文件事件产生,最大阻塞时间由timeval结构决定, # 如果remaind_ms的值为0,那么aeAPiPoll调用之后马上返回,不阻塞 aeApiPoll(timeval) # 处理所有已经产生的文件事件 processFileEvents() # 处理所有已经到达的时间事件 proccessTimeEvents()
이벤트 예약 및 실행 규칙:
1) aeApiPoll 함수의 최대 차단 시간은 도착 시간이 현재 시간에 가장 가까운 시간 이벤트에 의해 결정됩니다. 서버가 자주 처리하는 시간 이벤트를 방지할 수 있습니다. 폴링(바쁨 대기)을 통해 aeApiPoll 기능이 너무 오랫동안 차단되지 않도록 할 수도 있습니다.
2) 파일 이벤트는 랜덤하게 나타나기 때문에 파일 이벤트를 기다리고 처리한 후 시간 이벤트가 도착하지 않으면 서버는 파일 이벤트를 기다렸다가 다시 처리합니다. 파일 이벤트가 계속 실행되면서 시간은 시간 이벤트에 설정된 도착 시간에 점차 가까워지고, 마침내 도착 시간에 도달하게 됩니다. 이때 서버는 도착 시간 이벤트 처리를 시작할 수 있습니다.
3) 파일 이벤트 및 시간 이벤트 처리는 동기식, 순차적, 원자적으로 실행됩니다. 따라서 서버는 이벤트 처리를 중간에 중단하거나 이벤트를 선점하지 않습니다. , 프로그램의 차단 시간을 최소화하고 필요한 경우 적극적으로 실행 권한을 포기하여 이벤트 기아 가능성을 줄입니다. 예를 들어 명령 응답 프로세서가 클라이언트 소켓에 명령 응답을 쓸 때 작성된 바이트 수가 미리 설정된 상수를 초과하면 명령 응답 프로세서는 쓰기 루프에서 벗어나기 위해 적극적으로 중단을 사용합니다. 또한 다음 번에 작성되는 시간 이벤트는 실행을 위해 매우 시간이 많이 걸리는 지속성 작업을 하위 스레드 또는 하위 프로세스에 넣습니다.
4) 시간 이벤트는 파일 이벤트 이후에 실행되며, 이벤트 간 선점이 없기 때문에 시간 이벤트의 실제 처리 시간은 일반적으로 시간 이벤트에서 설정한 도착 시간보다 약간 늦습니다.
파일 이벤트와 시간 이벤트 사이에는 협력 관계가 있습니다. 서버는 이 두 이벤트를 차례로 처리하며 이벤트 처리 중에는 선점이 없습니다. 시간 이벤트의 실제 처리 시간은 일반적으로 설정된 도착 시간보다 늦습니다.
추천 학습: Redis 학습 튜토리얼
위 내용은 Redis 파일 이벤트와 시간 이벤트에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!