Uso de caché 9 errores (rpm)

Si quieres un sitio frecuente o la optimización de aplicaciones, se puede decir que el uso de la memoria caché es el efecto más rápido y más evidente del camino. En general, vamos a poner un poco común, o se necesita una gran cantidad de recursos o el tiempo para producir los datos en caché de manera que su uso posterior con mayor rapidez.

  Si realmente quiere dar más detalles sobre los beneficios del almacenamiento en caché, mucho, pero en aplicaciones prácticas, a menudo utilizando la memoria caché, siempre tan insatisfactoria. En otras palabras, el uso de la caché se ha supuesto que ser tal que el rendimiento es 100 (donde sólo una dosificación de símbolos digitales solamente, sólo para darle una experiencia "cantidad"), pero muchas veces, para mejorar el efecto de sólo el 80, 70, o menos, o incluso conducir a la degradación del rendimiento graves, este fenómeno es particularmente importante en el uso de caché distribuida.

  En este artículo, vamos a decir que más de nueve quid de la cuestión, y da soluciones correspondientes. Tomando como un ejemplo de código .NET demostración de conducta, y otras plataformas tecnológicas ser amigos es también un valor de referencia, siempre y cuando el código de reemplazo correspondiente a la línea!

  Con el fin de hacer que la elaborada tarde más conveniente, pero también hace que el artículo sea más completa, primer vistazo a dos formas de almacenamiento en caché: caché de memoria local, caché distribuida.

  Para la primera memoria caché local, los datos se almacenan en caché en memoria en la máquina, que se muestra en la Figura 1:

  Se puede observar claramente a partir de la figura anterior:

  • datos de la aplicación se almacena en caché en la memoria de la máquina, cuando se necesita para ir directamente a la memoria de la máquina se adquiere.
  • Para aplicaciones .NET, y en el momento de la adquisición de datos en la memoria caché, el objetivo es encontrar datos en la memoria por referencia a un objeto, dijo, si después de recibir el objeto de datos de referencia, modificamos directamente el objeto, de hecho, estamos modificando los objetos reales en la memoria caché.

  Para caché distribuida, esta vez a causa de los datos en caché está en el servidor caché, o que, en este momento las necesidades de la aplicación a proceso de acceso a través del servidor de caché distribuida, que se muestra en la Figura 2:

  Independientemente de donde el servidor de caché, porque se trata de un proceso cruzado, e incluso a través del dominio de acceso a datos de la caché, a continuación, los datos de la caché debe primero ser serializado antes de ser enviado al servidor de caché, y cuándo usar los datos en caché, el servidor de aplicaciones recibe una secuencia de los siguientes datos será la deserialización. proceso de serialización y de-serialización es muy intenso operativo de la CPU, muchos de los problemas aparecidos en el mismo.

  Además, si llegamos a los datos, la aplicación se ha modificado, a continuación, los datos originales en el servidor de caché no se modifica, a menos que otra vez a guardar los datos en el servidor de caché. Nota: Este y el anterior memoria caché local no es la misma.

  Para cada pieza de datos en la memoria caché, para describir aspectos del texto, lo que llamamos "la entrada de caché."

  Después de la popularidad de estos dos conceptos ha terminado, vamos a entrar en el tema de hoy: el uso de la caché de nueve errores comunes:

  1. Demasiado dependiente de .NET mecanismo de serialización por defecto
  2. Caché de objetos grandes
  3. Uso mecanismo de almacenamiento en caché para el intercambio de datos entre los hilos
  4. Después de llamar a la API creen caché, los datos se almacenan en caché de inmediato
  5. Almacenamiento en caché de grandes conjuntos de datos, y en el que una porción de la lectura
  6. estructura de memoria caché de objetos figura que tiene un gran número de memoria de residuos
  7. la información de configuración de la caché para la aplicación
  8. El uso de muchos diferentes puntos clave de entrada a la misma memoria caché
  9. No hay ninguna actualización oportuna, o eliminar otro caché tiene datos caducados o no válidos

  Aquí, nos fijamos en cada punto específico a!

  Demasiado dependiente de .NET mecanismo de serialización por defecto

  Cuando usamos en el almacenamiento en caché de aplicaciones a través de procesos, tales como el almacenamiento en caché distribuido memcached o Microsoft AppFabric, en este momento los datos se almacenan en caché fuera del proceso de aplicación. Cada vez, cuando tenemos que poner algunos datos en caché cuando el API de caché de datos en primer lugar formar en una secuencia de bytes y los envía al servidor de caché de bytes para guardar. Del mismo modo, cuando queremos volver a utilizar los datos en caché en la aplicación, el servidor caché caché de bytes enviados a la aplicación, y la biblioteca cliente entonces en caché recibe serán deserializan estos bytes operación, y tenemos que convertirlo en objetos de datos.

  Además, hay tres cosas a tener en cuenta es que:

  • El mecanismo de serialización y de-serialización se produce en un servidor de aplicaciones y el servidor de caché sólo es responsable de guardarlo.
  • El mecanismo de serialización por defecto utilizado en .NET no es óptima, ya que quiere utilizar la reflexión y la reflexión es muy intensivo de la CPU, especialmente cuando estamos en caché los objetos de datos más complejas de la época.

  Para este problema, tenemos que elegir una buena secuencia de los métodos para reducir el uso de la CPU tanto como sea posible. Comúnmente utilizado es el método para hacer que los objetos que implementan la interfaz ISerializable.

  En primer lugar nos fijamos en el mecanismo de serialización por defecto es una especie de cómo. Figura 3:

  Entonces, para alcanzar nuestra propia interfaz ISerializable, como se muestra en la Figura 4:

  Nuestra propia manera de lograr la máxima diferencia entre el mecanismo de .NET serialización por defecto es: no utilizar la reflexión. De esta manera la velocidad de su propia para lograr puede ser el mecanismo por defecto de un centenar de veces.

  Algunas personas pueden pensar que nada, no es que un poco de secuencia de ello, es necesario alboroto sobre ella?

  En el desarrollo de unas aplicaciones de alto rendimiento (por ejemplo, sitio web), la escritura de la arquitectura al código, así como la parte posterior de la implementación, cada lugar tiene que ser optimizado. Un pequeño problema, por ejemplo, la secuencia del problema, no un problema a primera vista, la cantidad de acceso a nuestro sitio si la aplicación es de millones, millones, o el nivel aún más alto, y estos necesidad de obtener algún tipo de acceso público a los datos almacenados en caché, antes de este llamado pequeño problema no es poco!

  A continuación, nos fijamos en el segundo malentendido.

  Caché de objetos grandes

  A veces, queremos poner un poco de memoria caché de objetos grandes, generando un alto precio debido a objetos de gran tamaño, que necesitamos para generar una vez, utilizar tantas veces como sea posible, con el fin de mejorar la respuesta.

  gran objeto mencionado, aquí es muy necesario para llevar a cabo una mayor introducción en profundidad a. En .NET, el llamado objeto grande, que se refiere a la memoria ocupada por objetos de más de 85K, la siguiente por una comparación de la clara del problema.

  Si ahora tiene una colección de clase Person, definida como List <persona>, cada objeto persona ocupa 1K de memoria, si la colección contiene 100 Persona Persona instancia de objeto, entonces este sistema si se trata de un objeto grande?

  La respuesta es: ¡No!

  El hecho de que el objeto Persona en la colección contiene una referencia al ejemplo de una, es decir, el .NET gestionados montón anteriormente, la persona establecer el tamaño de memoria asignada es 100 en términos de referencia de tamaño.

  Entonces, para el siguiente objeto es un objeto grande: byte [] datos = new byte [87040] (85 * 1024 = 87.040).

  Al hablar aquí, para hablar de ello, ¿por qué: gran productos un gran precio objetivo.

  Debido a que en .NET, objetos de gran tamaño se asignan en gran objeto en el montón administrado anteriormente (que se refiere como "pilas", por supuesto, hay una pila pequeña correspondiente), y esta asignación objetos mecanismo y pequeñas pilas en la parte superior de la pila no los mismos: las pilas en el momento de la distribución, siempre tienen que encontrar el espacio de memoria adecuada, el resultado es causa la fragmentación de memoria, lo que resulta en fuera de la memoria! Se describe el uso de un mapa que se muestra en la Figura 5:

  La figura es evidente, en la Figura 5:

  • Pilas de recolección de basura no serán comprimidos después de la recuperación de objetos (pequeña pila se comprime).
  • Tiempo asignado objetos, es necesario atravesar las pilas, la necesidad de encontrar el espacio adecuado, es pasar el costo de recorrido.
  • Si algo de espacio es menor que 85K, entonces no puede ser asignado, y sólo desperdicia, sino que también conduce a la fragmentación de memoria.

  Después de terminar los, nos ponemos manos a, echar un vistazo a los objetos de gran tamaño de caché.

  Como se mencionó anteriormente, la caché de objeto y el tiempo de lectura es que ser serializado y deserializado, en caché los objetos de mayor tamaño (por ejemplo, con un 1M etc.), todo el proceso consume más CPU.

  Para tales objetos de gran tamaño, dependiendo de si se utiliza muy frecuentemente, si es un objetos de datos comunes, cada usuario debe producida. Porque una vez que almacena en caché (en particular en la memoria caché distribuida), que necesita consumir servidores de caché del servidor de aplicaciones de memoria y CPU. Si no utiliza con frecuencia, yo le aconsejo que genera! Si los datos son públicos, se recomienda que un montón de pruebas: que costará cuando los costos de producción y gran objeto de caché de memoria y CPU consume, selecciona un pequeño coste! Si se va a generar para cada usuario, ver si se puede romper, si no se rompe, entonces la caché, pero la liberación oportuna!

  Uso mecanismo de almacenamiento en caché para el intercambio de datos entre los hilos

  Cuando los datos de la caché cuando varios subprocesos de nuestros programas pueden acceder a las zonas comunes. Cuando varios subprocesos tienen acceso a los datos de la caché, tendrá algo de competencia, que es también a menudo se producen problemas de multi-roscados.

  Aquí estábamos dos aspectos caché introducir la competencia traído de la memoria caché local y distribuida.

  Mira el siguiente fragmento de código:

  Para la memoria caché local, para el código anterior, después de ejecutar los tres hilos en el hilo 1, cuando el valor del número de artículo puede ser 1, 2 puede ser el hilo 2, el hilo 3 puede ser 3. Por supuesto, esto no es necesariamente! Sólo es posible valor en la mayoría de los casos!

  Si se trata de una memoria caché distribuida, por no decir! Debido a que los datos modificados no está ocurrir inmediatamente en la memoria de esta máquina, sino a través de un proceso de cross-proceso.

  Algunos módulo de memoria caché ha alcanzado una forma cerrada para resolver este problema, por ejemplo, AppFabric. Prestar especial atención en la modificación de los datos almacenados en caché cuando este punto.

  Después de llamar a la API creen caché, los datos se almacenan en caché de inmediato

  A veces, cuando llamamos a la API de caché, vamos a pensar: los datos ha sido sustituido, a continuación, puede leer los datos de la caché directamente. A pesar de esta situación muchas veces, pero no absoluta! Muchos de los problemas creados de esta manera!

  Vamos a explicar con un ejemplo.

  Por ejemplo, para una aplicación ASP.NET, si llamamos a la API de caché en el evento Click de un botón, y luego, cuando la página se representa, vaya caché de lectura, de la siguiente manera:

  El código anterior razones que lo es, pero se produce el problema. Después de hacer clic en el botón cuando la página de retorno, y la página se representa datos de visualización, el proceso no es ningún problema. Pero no tienen en cuenta la pregunta: Si la memoria del servidor es apretado, se recupera lo que resulta en la memoria del servidor, es probable que los datos almacenados en caché, no hay es!

  Aquí hay un amigo diría: recolección de basura tan rápido?

  Esto se debe principalmente a ver algunos de nuestra configuración y procesamiento.

  En general, el almacenamiento en caché mecanismo se establece una fecha de caducidad es absoluta diferencia de tiempo de caducidad relativa entre los dos, hay que ser muy claro, no tengo mucho que decir aquí. Para el código anterior, si fijamos la fecha de caducidad absoluta, asumiendo un minuto, si la página se procesa muy lentamente, durante más de 1 minuto, y luego esperar hasta el momento de la presentación, pueden ser datos en la caché no tiene!

  A veces, incluso si los datos almacenados en caché en la primera línea de código, a continuación, tal vez en la tercera línea de código, tenemos que leer la caché de datos cuando se ha ido. Esto puede ser debido a que los datos de la memoria del servidor borran en dirección opuesta a una gran presión, el mecanismo de caché accede menos. O la CPU del servidor ocupado, la red no es buena, porque los datos no se ha guardado en el servidor de caché, incluso si el serializada.

  Además, ASP.NET, si se utiliza una memoria caché local, entonces, sino también a los problemas de configuración de IIS (restricciones a la memoria caché), tenemos una oportunidad especial para compartir este conocimiento para todos.

  Por lo tanto, cada vez que al utilizar los datos en caché para determinar si existe, de lo contrario, habrá una gran cantidad de "objeto no encontrado", que producen algunos consideran como "extraño fenómeno y razonable."

  Almacenamiento en caché de grandes conjuntos de datos, y en el que una porción de la lectura

  En muchos casos, se tiende a almacenar en caché un conjunto de objetos, sin embargo, cuando leemos, pero cada parte de lectura de la misma. Le damos un ejemplo para ilustrar este problema (ejemplo puede no ser apropiado, pero basta).

  En el sitio de compras, operación común es consultar la información de algunos productos, en esta ocasión, si el usuario introduce "TV de 25 pulgadas," y luego buscar otros productos relacionados. Esta vez, en el fondo, se puede consultar la base de datos para encontrar cientos de estos datos, y luego, que reunirá a cientos de caché de datos como una entrada de caché, el código del código de la siguiente manera:

  Al mismo tiempo, se muestra la página para encontrar productos, 10 por impresión. De hecho, cada vez que la página, vamos a obtener datos clave de acuerdo con el búfer, y luego seleccionar los datos próximos 10 y luego se muestra.

  Si está utilizando una memoria caché local, entonces esto puede no ser un problema, si se trata de una memoria caché distribuida, surgió la pregunta. Las siguientes figuras ilustran claramente este proceso, como se muestra:

  Creo que leemos esta tabla, a continuación, antes de la combinación debe ser muy claro sobre el problema: cada vez que obtener todos los datos de la clave de caché, entonces el servidor de aplicaciones donde deserializar todos los datos, pero sólo tienen un 10.

  Aquí de nuevo dividir el conjunto de datos puede dividirse en por ejemplo 25-0-10-productos, 25-11-20-productos tales entrada de caché, como se muestra a continuación:

  Por supuesto, hay muchas formas de consulta y almacenamiento en caché, dividir el camino hay muchos, aquí se le da a algunas preguntas comunes!

  estructura de memoria caché de objetos figura que tiene un gran número de memoria de residuos

  Para ilustrar mejor este problema, vemos por primera vez una de las siguientes diagrama de estructura de clases, como se muestra:

  Si tenemos que poner algunos datos del cliente se almacena en caché, no puede haber dos posibles problemas:

  1. Desde .NET utilizando el mecanismo de serialización por defecto, o añadido sin la debida atributo correspondiente (atributos), de manera que la memoria caché no necesita almacenar en caché algunos de los datos originales.

  2. El almacenamiento en caché del cliente, al mismo tiempo, para un acceso más rápido a la información sobre el pedido del cliente, la información del pedido se almacena en caché en otra entrada de caché, lo que resulta en los mismos datos se almacena en caché en dos ocasiones.

  A continuación, echamos un vistazo a estas dos cuestiones por separado.

  En primer lugar para ver la primera. Si se utiliza un caché distribuido para almacenar en caché cierta información sobre el tiempo del cliente, si no lo hacemos re-cliente propio mecanismo de serialización, pero por defecto, entonces el mecanismo de serialización cuando serializado cliente, se hará referencia a la atención al cliente usando el los objetos también son serializados, entonces la secuencia objeto de otro objeto de referencia es de serie, el resultado final es: el cliente es de serie, información de pedido del cliente es de serie, Orden citado artículo de pedido puede serializar referencias de pedido última Producto se serializada.

  Todo gráfico de todo el objeto se serializa, y si esto es lo que queremos, entonces no hay problema; si no, entonces estamos perdiendo una gran cantidad de recursos, y la solución es doble: en primer lugar, para lograr su propia serialización, el control total de su propia necesidad que los objetos a ser serializada, ya hemos hablado, en segundo lugar, si se utiliza el mecanismo de serialización por defecto, entonces no se necesita serializar objetos anteriormente, más marca [NonSerialized].

  A continuación, vemos a la segunda pregunta. Este problema se debe principalmente a la primera cuestión que se plantea: el Cliente caché del cliente original cuando tiene información adicional, como el orden, producto ha sido almacenado en caché. Sin embargo, muchos de la técnica esto no está claro, y de nuevo la información de pedido del cliente a otras entradas de caché en la memoria caché, que sirve para el uso, por ejemplo, el ID de caché para obtener la información de pedido del cliente de acuerdo con el identificador, como se muestra en el siguiente código:

  La solución a este problema también es más evidente, ver la solución de un problema en él!

  la información de configuración de la caché para la aplicación

  Debido a que el caché es un conjunto de ciclo de detección de fallos de datos (dicho antes, ya sea un tiempo fijo ha caducado o no es válida tiempo relativo), por lo que muchos técnicos como para poner algo de la información almacenada en la memoria caché dinámica para aprovechar el almacenamiento en caché esta característica del mecanismo, en el que el programa de información de almacenamiento en caché de configuración es un ejemplo.

  Debido a que en algunas aplicaciones de configuración, se pueden producir cambios, el más simple es la cadena de conexión de base de datos, el siguiente código:

  Una vez configurado, de vez en cuando después de un fallo de caché, ir a leer el archivo de configuración, esta vez, es posible configurar en este momento y no es lo mismo que antes, y que otros lugares puede ser caché de lectura para realizar actualizaciones, especial es el momento de desplegar el mismo sitio en varios servidores encima, en ocasiones, no tenemos información oportuna para modificar los archivos de configuración del servidor para cada uno de los sitios anteriores interior, esta vez el uso de la información de configuración de caché caché distribuida, siempre y cuando una actualización de sitio archivo de configuración, todos los otros sitios en el feliz personal técnico revisado. OK, esto realmente parece ser una manera buena (si es necesario se puede utilizar), pero no toda la información de configuración debe seguir siendo la misma, sino también considerar cómo una situación: Si el servidor de caché es un problema, el tiempo de inactividad , entonces todos nuestros sitios utilizan esta información de configuración puede ir todo mal.

  La información recomendada para estos perfiles, el uso de mecanismos de supervisión, tales como monitoreo de cambios en los archivos de archivos se produce cada vez, vuelve a cargar la información de configuración.

  El uso de muchos diferentes puntos clave de entrada a la misma memoria caché

  A veces nos encontramos con una situación así: tenemos un objeto en caché es obtener los datos como una llave clave de caché, entonces, tenemos que conseguir a través de estos datos como un índice de clave de caché, como se muestra en el siguiente código:

  La razón por la que escribimos esto, sobre todo porque se lee en varios aspectos de los datos de la caché, por ejemplo, durante el bucle de tiempo a través, que necesita para obtener los datos a través de un índice, como el índice ++, etc., y en algunos casos, es posible que tengamos otra así, por ejemplo, el nombre del producto para obtener información sobre el producto.

  Si se encuentra con una situación de este tipo, entonces se recomienda que una pluralidad de estas teclas se combinan para formar la siguiente forma:

  Otro problema común es: los mismos datos se almacena en caché en diferentes entradas de caché, por ejemplo, si un usuario consulta el tamaño de televisión en color de 36 pulgadas, entonces podría haber un posible No. 100 en productos de la TV en el resultado, en este momento, nos dará como resultado caché. Además, los usuarios a encontrar un fabricante para la televisión TCL, si el número es 100 Producto de la TV aparecido en los resultados, y los resultados que almacenan en caché en otro elemento de la caché. Esta vez, está claro que ha habido una pérdida de memoria.

  Para tal caso una, se emplea el autor antes de que el método para crear un índice de memoria caché en la lista, como se muestra:

  Por supuesto, de los cuales hay muchos detalles y problemas que hay que resolver, no uno por uno para contar, dependiendo de la aplicación respectiva y el caso puede ser! Son muy bienvenidos para ofrecer una mejor manera.

  No hay ninguna actualización oportuna, o eliminar otro caché tiene datos caducados o no válidos

  Esta debe ser la mayoría de los problemas comunes mediante la caché, por ejemplo, si tenemos toda la información no hacer frente a las órdenes de un cliente que está a continuación en caché, un código similar es el siguiente:

  Después de eso, un usuario de que el pedido haya sido procesado, pero el caché no se ha actualizado, así que esta vez, los datos en la memoria caché tiene un problema! Por supuesto, estoy aquí sólo aparece el escenario más simple, podemos pensar en sus propias otras aplicaciones del producto, es probable que no habrá la misma que la memoria caché y los datos reales de la base de datos.

  Ahora, una gran parte del tiempo, tuvimos que tolerar la inconsistencia de tan poco tiempo. De hecho, para este caso, no existe una solución perfecta, si lo hace, lo que toca se puede lograr, por ejemplo, cada vez que un cambio, o los datos de borrado, ir a través de todos los datos en la memoria caché, y luego a operar, pero esto a menudo no vale la pena. Otro enfoque es un compromiso, el período de cambio de los datos se determina, entonces la caché como un poco de tiempo más corto

Supongo que te gusta

Origin www.cnblogs.com/q149072205/p/12530719.html
Recomendado
Clasificación