Inventario de preguntas y respuestas de la entrevista de Didi Autumn Recruitment C ++ en 2020 (Parte 1)

1. C ++ realiza el modo singleton seguro para subprocesos

Modo más holgazán:

class singleton
{
    
    
protected:
 singleton()
 {
    
    
 pthread_mutex_init(&mutex);
 }
private:
 static singleton* p;
public:
 static pthread_mutex_t mutex;
 static singleton* initance();
};
 
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
    
    
 if (p == NULL)
 {
    
    
 pthread_mutex_lock(&mutex);
 if (p == NULL)
 p = new singleton();
 pthread_mutex_unlock(&mutex);
 }
 return p;
}

2. El número de 1-2n se almacena en una matriz con espacio n, y se encuentra el número que aparece dos veces. La complejidad del tiempo es O (n) y la complejidad del espacio es O (1)

/*
奇数零次 偶数零次 0
奇数 一次 偶数 零次 -1
奇数 两次 偶数 零次 -2
奇数 零次 偶数 一次-3
奇数 一次 偶数 一次-4
奇数 两次 偶数 一次-5
奇数 零次 偶数 两次-6
奇数一次 偶数 两次-7
奇数两次 偶数两次-8
*/ 
public class Main {
    
    
 public static void main(String[] args) {
    
    
 int[] nums = {
    
    1, 3, 5, 15, 7, 8, 5, 3, 6, 15};
 findNumber(nums, nums.length);
 print(nums);
 }
 
 public static void findNumber(int[] nums, int length) {
    
    
 for (int i = 0; i < length; ) {
    
    
 if (nums[i] <= 0){
    
    
 i++;
 continue;
 }
 int index = nums[i] / 2;
 boolean isOdd = (nums[i] % 2 == 0) ? false : true;
 switch (nums[index]) {
    
    
 case 0:
 if (isOdd == true) {
    
    
 nums[index] = -1;
 } else {
    
    
 nums[index] = -3;
 }
 break;
 case -1:
 if (isOdd == true) {
    
    
 nums[index] = -2;
 } else {
    
    
 nums[index] = -4;
 }
 break;
 case -2:
 nums[index] = -3;
 break;
 case -3:
 if (isOdd == true) {
    
    
 nums[index] = -4;
 } else {
    
    
 nums[index] = -6;
 }
 break;
 case -4:
 if (isOdd == true) {
    
    
 nums[index] = -5;
 } else {
    
    
 nums[index] = -7;
 }
 break;
 case -5:
 nums[index] = -6;
 break;
 case -6:
  nums[index] = -7;
 break;
 case -7:
 nums[index] = -8;
 break;
 default:
 swap(nums, i, index);
 if (isOdd) {
    
    
 nums[index] = -1;
 } else {
    
    
 nums[index] = -3;
 }
 continue;
 }
 nums[i++]=0;
 }
 }
 public static void swap(int[] nums, int i, int j){
    
    
 int temp =nums[i];
 nums[i]=nums[j];
 nums[j]=temp;
 }
 
 public static void print(int[] nums) {
    
    
 for (int i = 0; i < nums.length; i++) {
    
    
 if (nums[i] == -2) {
    
    
 System.out.println(i * 2 + 1);
 } else if (nums[i] == -6) {
    
    
 System.out.println(i * 2);
 } else if (nums[i] == -8) {
    
    
 System.out.println(i * 2);
 System.out.println(i * 2 + 1);
 }
 }
 }
}

Las empresas de Internet de primera línea completan las preguntas de la entrevista y las respuestas siguen la cuenta oficial de Zero Sound Academy para recibirlas de forma gratuita.
Inserte la descripción de la imagen aquí

3. ¿Cómo funciona la partición en Kafka?

Análisis de asignación automática predeterminada de replicación de partición de clúster de Kafka

El siguiente es un ejemplo de 4 agentes en un clúster de Kafka. La creación de un tema contiene 4 particiones y 2 réplicas; el flujo del productor de datos se muestra en la figura:

Cuando se agregan 2 nodos al clúster y la partición aumenta a 6, la distribución es la siguiente:

Las reglas lógicas para la asignación de copias son las siguientes:

En un clúster de Kafka, cada Broker tiene la misma oportunidad de asignar líderes de partición.

En la partición del corredor de la figura anterior, la flecha apunta a la copia. Tome la Partición 0 como ejemplo: la partición 0 en el corredor1 es el líder y la partición 0 en el corredor2 es la copia.

En el diagrama anterior, cada Broker (ordenado por BrokerId) asigna la Partición principal a su vez, y el siguiente Broker es la copia, de esta manera, asigna iterativamente y múltiples copias siguen esta regla.

El algoritmo de asignación de copias es el siguiente:

Ordene todos los N Brokers y las particiones i que se asignarán.

Asigne la i-ésima partición al (i mod n) -ésimo corredor.

Asigne la j-ésima copia de la i-ésima partición al ((i + j) mod n) Broker.

4. La secuencia de comandos de Shell cuenta la cantidad de palabras en el archivo.

método uno:

(1) archivo cat | sed 's /[,.:;/!?]/ / g' | awk '{for (i = 1; i <= NF; i ++) array [$ i] ++;}

END {para (i en matriz) imprimir i, matriz [i]} '

#File es el archivo que se va a operar, y hay un espacio entre // en sed.

(2) sed 's /[,.:;/!?]/ / g' file | awk '{for (i = 1; i <= NF; i ++) array [$ i] ++;}

END {para (i en matriz) imprimir i, matriz [i]} '

# (1) y (2) tienen el mismo efecto.

Método dos:

(1) awk 'BEGIN {RS = "[,.:; / !?]"} {para (i = 1; i <= NF; i ++) matriz [$ i] ++;}

END {para (i en matriz) imprimir i, matriz [i]} 'archivo

5. ¿Qué son las IPC bajo linux?

①Tubería anónima (PIPE) y tubería famosa (FIFO): la más simple

②Señal (SIGNAL): el sistema tiene la menor sobrecarga

③Área de mapeo compartido (MMAP): puede comunicarse entre procesos no relacionados

④Enchufe local (SOCKET): el más estable (pero más complicado)

  1. ¿Cuáles son los patrones arquitectónicos de Redis?
    Uno, modo independiente de Redis

Características: Simple, simplemente ejecute redis-server redis.conf directamente (preste atención a la ubicación de su archivo redis-server y el archivo redis.conf).

Desventajas: 1. Capacidad de memoria limitada 2. Potencia de procesamiento limitada 3. Sin alta disponibilidad.

Dos, modo de replicación maestro-esclavo de Redis

La función de replicación de Redis permite a los usuarios crear cualquier número de réplicas del servidor basado en un servidor Redis. El servidor replicado es el servidor maestro y la réplica del servidor creada por la replicación es el servidor esclavo ( esclavo). Siempre que la conexión de red entre los servidores maestro y esclavo sea normal, los servidores maestro y esclavo tendrán los mismos datos, y el servidor maestro siempre sincronizará las actualizaciones de datos que le sucedan al servidor esclavo, para asegurar que los datos de los servidores maestro y esclavo sean los mismos.

caracteristicas:

1. El papel de maestro / esclavo

2. Los datos maestro / esclavo son los mismos

3. Reducir la presión de la lectura maestra mientras se transfiere a la biblioteca esclava

Desventajas:

1. No se puede garantizar una alta disponibilidad

2. No resolvió la presión de la escritura maestra

Tres, modo Centinela de Redis (Centinela)

3.1 Descripción general del modo Sentinel

Redis sentinel es un sistema distribuido que monitorea los servidores maestro y esclavo de redis, y falla automáticamente cuando el servidor maestro se desconecta.

Tres de las características:

Monitoreo: Sentinel verificará constantemente si su servidor maestro y el servidor esclavo funcionan normalmente.

Notificación: cuando un servidor Redis supervisado tiene un problema, Sentinel puede enviar notificaciones a los administradores u otras aplicaciones a través de la API.

Conmutación por error automática: cuando un servidor primario no funciona normalmente, Sentinel iniciará una operación de conmutación por error automática.

caracteristicas:

1. Garantice una alta disponibilidad

2. Supervisar cada nodo

3. Migración automática de fallas

Desventajas:

Modo maestro-esclavo, el cambio lleva tiempo para perder datos

No resolvió la presión de la escritura maestra

4. Modo de clúster (tipo de proxy)

Twem proxy es un servidor proxy rápido y ligero para redis y memcache de código abierto de Twitter; Twemproxy es un programa proxy rápido de un solo subproceso que admite el protocolo Memcached ASCII y el protocolo redis.

caracteristicas:

1. Múltiples algoritmos hash: MD5, CRC16, CRC32, CRC32a, hsieh, murmur, Jenkins

2. Admite la eliminación automática de nodos fallidos

3. La lógica de fragmentación de fragmentación de back-end es transparente para la empresa, y los métodos de lectura y escritura de la parte empresarial son coherentes con el funcionamiento de un solo Redis

Desventajas:

1. Se agrega un nuevo proxy y se debe mantener su alta disponibilidad

2. La lógica de conmutación por error debe implementarse por sí misma y no puede admitir la transferencia automática de fallas. La escalabilidad es deficiente y se requiere intervención manual para expandir y contraer

5. Modo de clúster (conexión directa)

Las versiones posteriores a redis 3.0 admiten clústeres redis-cluster. Redis-Cluster adopta una estructura no centralizada. Cada nodo guarda datos y el estado completo del clúster, y cada nodo está en armonía

Todos los demás nodos están conectados.

caracteristicas:

1. No hay arquitectura central (ningún nodo afecta el cuello de botella del rendimiento) y falta la capa de proxy.

2. Los datos se almacenan en varios nodos de acuerdo con la ranura, y los datos se comparten entre nodos, y la distribución de datos se puede ajustar dinámicamente.

3. Escalabilidad, expansión lineal a 1000 nodos, los nodos se pueden agregar o eliminar dinámicamente.

4. Alta disponibilidad: cuando algunos nodos no están disponibles, el clúster sigue estando disponible. Haga una copia de seguridad de los datos agregando esclavo

5. Realice la conmutación por error automática de fallas, intercambie información de estado entre nodos a través del protocolo de chismes y use el mecanismo de votación para completar la actualización de roles de esclavo a maestro.

Desventajas:

1. El aislamiento de recursos es deficiente y es probable que se produzca una influencia mutua.

2. Los datos se replican de forma asincrónica y no se garantiza una coherencia sólida de los datos.

Supongo que te gusta

Origin blog.csdn.net/lingshengxueyuan/article/details/108295857
Recomendado
Clasificación