[Entrevista] Recuerda una pregunta de entrevista en una pequeña y mediana empresa

1. ¿A qué campos presta más atención en el plan de ejecución de explicación en MySQL?

mysql> explain select * from staff;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | staff | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set

tipo (importante)
Este es uno de los campos más importantes y muestra qué tipo se utilizó para la consulta. Los tipos de conexión, de mejor a peor, son:

sistema,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL

2. ¿Cuál es la diferencia entre char, varchar y text?

  • En MySQL, los campos char, varchar y text se pueden usar para almacenar datos de tipo carácter. Tanto char como varchar pueden especificar la longitud máxima de caracteres, pero el texto no.
  • Almacenamiento y recuperación
    El almacenamiento y la recuperación de datos también son diferentes.
  • Según la velocidad de consulta:
    char es el más rápido, seguido de varchar y text es el más lento.
  • Longitud de almacenamiento:
    inserte la descripción de la imagen aquí

3. ¿Cuál es la diferencia entre las consultas int(3) e int(11)?

El 3 o el 11 aquí representa la longitud específica almacenada en la base de datos. Siempre pienso que int(3) solo puede almacenar números de 3 longitudes, e int(11) solo puede almacenar números de 11 longitudes. De hecho, cuando estamos Cuando elige usar el tipo int, ya sea que elija int(3) o int(11), se almacenará en la base de datos con una longitud de 4 bytes.

4. ¿Cuál es la diferencia entre NULL y un valor vacío en un campo?

  • Esencialmente diferente:
    1. Los valores nulos no ocupan espacio
    2. Los valores nulos ocupan espacio

  • En términos sencillos:
    un valor nulo es como una ventosa sin nada, y un valor nulo es una ventosa llena de aire Aunque todos parecen iguales, son fundamentalmente diferentes.

5. ¿Cómo resolver el problema de dependencia circular en primavera?

5.1 Rediseño

Rediseñe la estructura para eliminar las dependencias circulares.

5.2 Usando la anotación @Lazy

Una de las formas más sencillas de eliminar las dependencias circulares es mediante la carga diferida. Al inyectar dependencias, inyecte primero el objeto proxy y luego cree el objeto para completar la inyección cuando se use por primera vez.

@Component
public class CircularDependencyA {
    
    
 
 private CircularDependencyB circB;
 
 @Autowired
 public CircularDependencyA(@Lazy CircularDependencyB circB) {
    
    
  this.circB = circB;
 }
}

Después de usar @Lazy, ejecute el código y verá que la excepción se elimina.

5.3 Uso de Setter/Inyección de campo

Una forma que sugiere la documentación de Spring es usar la inyección de setter. La inyección ocurre cuando finalmente se usan las dependencias. Realice algunos cambios en el código de muestra anterior para observar el efecto de la prueba.

@Component
public class CircularDependencyA {
    
    
 
 private CircularDependencyB circB;
 
 @Autowired
 public void setCircB(CircularDependencyB circB) {
    
    
  this.circB = circB;
 }
 
 public CircularDependencyB getCircB() {
    
    
  return circB;
 }
}
@Component
public class CircularDependencyB {
    
    
 
 private CircularDependencyA circA;
 
 private String message = "Hi!";
 
 @Autowired
 public void setCircA(CircularDependencyA circA) {
    
    
  this.circA = circA;
 }
 
 public String getMessage() {
    
    
  return message;
 }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
    
     TestConfig.class })
public class CircularDependencyTest {
    
    
 
 @Autowired
 ApplicationContext context;
 
 @Bean
 public CircularDependencyA getCircularDependencyA() {
    
    
  return new CircularDependencyA();
 }
 
 @Bean
 public CircularDependencyB getCircularDependencyB() {
    
    
  return new CircularDependencyB();
 }
 
 @Test
 public void givenCircularDependency_whenSetterInjection_thenItWorks() {
    
    
  CircularDependencyA circA = context.getBean(CircularDependencyA.class);

  Assert.assertEquals("Hi!", circA.getCircB().getMessage());
 }
}

5.4 Usando @PostConstruct

@Component
public class CircularDependencyA {
    
    
 
 @Autowired
 private CircularDependencyB circB;
 
 @PostConstruct
 public void init() {
    
    
  circB.setCircA(this);
 }
 
 public CircularDependencyB getCircB() {
    
    
  return circB;
 }
}
@Component
public class CircularDependencyB {
    
    
 
 private CircularDependencyA circA;
  
 private String message = "Hi!";
 
 public void setCircA(CircularDependencyA circA) {
    
    
  this.circA = circA;
 }
  
 public String getMessage() {
    
    
  return message;
 }

5.5 Implementar ApplicationContextAware e InitializingBean

@Component
public class CircularDependencyA implements ApplicationContextAware, InitializingBean {
    
    
 
 private CircularDependencyB circB;
 
 private ApplicationContext context;
 
 public CircularDependencyB getCircB() {
    
    
  return circB;
 }
 
 @Override
 public void afterPropertiesSet() throws Exception {
    
    
  circB = context.getBean(CircularDependencyB.class);
 }
 
 @Override
 public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
    
    
  context = ctx;
 }
}
@Component
public class CircularDependencyB {
    
    
 
 private CircularDependencyA circA;
 
 private String message = "Hi!";
 
 @Autowired
 public void setCircA(CircularDependencyA circA) {
    
    
  this.circA = circA;
 }
 
 public String getMessage() {
    
    
  return message;
 }
}

6. ¿Cuál es la diferencia entre el proxy dinámico jdk y el proxy CGlib?

  • El proxy dinámico jdk usa el interceptor (debe implementar InvocationHandler) y el mecanismo de reflexión para generar una clase anónima de la interfaz del proxy, que se llama antes de llamar al método específico. InvokeHandler para manejar.
  • Utilice el marco ASM para cargar el archivo de clase generado por la clase de objeto proxy y modifique su código de bytes para generar una subclase para el procesamiento.

7. ¿Cuál es la diferencia entre referencias fuertes, referencias blandas, referencias débiles y referencias fantasma?

inserte la descripción de la imagen aquí

8. ¿Implementación de anotaciones personalizadas?

Hay cuatro meta-anotaciones en java: @Retention, @Inherited, @Documented, @Target

9. Pregunta del escenario de Redis: ¿Consultar una determinada clave de prefijo fijo de datos masivos?

En Redis, si desea consultar un dato determinado en una gran cantidad de datos, debe usar Scan. Scan tiene las siguientes características:

  • El escaneo puede realizar la función de coincidencia de las teclas;
  • El escaneo se consulta a través de un cursor y no hará que Redis se congele;
  • Scan proporciona el parámetro de conteo, que puede especificar el número de recorridos;
  • Scan devolverá el cursor al cliente, y el cliente del usuario continuará recorriendo la consulta;
  • Los resultados devueltos por Scan pueden tener datos duplicados, que el cliente debe desduplicar;
  • Se devuelve un valor nulo una vez y el cursor no es 0, lo que indica que el recorrido aún no ha terminado;
  • Scan puede garantizar que los elementos eliminados no serán consultados antes de iniciar la recuperación;
  • Si se modifican algunos elementos durante el proceso de iteración, Scan no garantiza que se puedan consultar los elementos relevantes.

Resumir

Espero que te sea útil, bienvenido a discutir en el área de comentarios.

Supongo que te gusta

Origin blog.csdn.net/u011397981/article/details/130034374
Recomendado
Clasificación