Redis de la entrada al combate real


Prefacio

Hoy, mi padre pagó unos cientos de yuanes más por gastos de manutención, por lo que compró un nuevo nodo de servidor en la nube (el descuento para estudiantes solo puede admitir un servidor y es mucho más caro sin el descuento, por lo que solo la configuración original Comprado por dos semanas), el nuevo nodo se utiliza principalmente para la replicación maestro-esclavo de redis y el equilibrio de carga del clúster. Antecedentes del proyecto: Actualmente es una plataforma de comercio electrónico con una arquitectura única, que incluye usuarios, pedidos, carritos de compra, búsquedas, reseñas, etc. La base de datos usa MySQL, el proyecto se ha implementado en el servidor de la nube y el proxy inverso se ha realizado con nginx. El movimiento está separado. Objetivo: utilizar redis para optimizar la parte del carrito de la compra (especialmente centrarse en la lógica de caché de cookies y redis), crear replicación maestro-esclavo, optimizar la arquitectura de redis, mejorar la confiabilidad de redis, resolver la penetración de caché y prevenir avalanchas de caché.

1. Por qué usar redis

  • Ventajas de Redis
    • alta velocidad. Redis está completamente basado en memoria e implementado en lenguaje C. La capa de red usa epoll para resolver problemas de alta concurrencia El modelo de un solo subproceso evita cambios de contexto innecesarios y condiciones de carrera.
    • Estructura de datos rica. Incluyendo String, Hash, Set, List, etc.
    • Admite persistencia, sincronización maestro-esclavo, conmutación por error y otras funciones
  • Desventajas de Redis
    • Hilo único
    • Núcleo simple
  • Comparación de Memcache y redis
    • Memcache no admite la persistencia
    • Memcache multi-core multi-hilo
    • Memcache tiene menos estructura de datos

Resumen : Redis es adecuado para almacenar datos activos (gran volumen de acceso), admite almacenamiento persistente y proporciona funciones enriquecidas.

Dos, modelo de multiplexación

Como se mencionó anteriormente, redis es de un solo subproceso y un solo núcleo. Imagine la siguiente situación: si hay varias tareas de IO que deben ser completadas por redis, para redis, si se ha bloqueado esperando IO, causará ineficiencia.
Redis adopta un modelo de multiplexación. Cuando llega una solicitud, si desea esperar, el multiplexor procesará otras solicitudes; al procesar la solicitud, el multiplexor no implementa realmente la lógica de procesamiento, sino la tarea Tíralo al procesador de atrás.
Por un lado, un solo hilo evita la conmutación y el bloqueo de la CPU, por otro lado, la multiplexación evita la pérdida de eficiencia del bloqueo en espera. Esto asegura la velocidad de redis.

Tres, operación básica de Redis

1 cuerda

2.Hash

3.Lista

4.Conjunto


En cuarto lugar, la integración del módulo del carrito de la compra redistribuye la optimización en el proyecto

1. Negocio original

Los datos del carrito de compras original no se actualizan en la base de datos, pero el navegador almacena una cookie en caché. Cuando el usuario no ha iniciado sesión, puede enviar el producto al carrito de la compra, pero no puede realizar un pedido. Una vez que el usuario inicia sesión, puede realizar un pedido y actualizarlo en la base de datos.

2. Tarea objetivo

Use redis para almacenar de manera persistente los datos en el carrito de compras, y debe poder integrarse con las cookies

3. Lógica de implementación

1.redis中无数据
	如果cookie中的购物车为空,那么这个时候不做处理
    如果cookie中的购物车不为空,直接覆盖redis
2.redis中有数据
	如果cookie中的购物车为空,那么直接把redis的购物车覆盖本地cookie中
    如果cookie中的购物车不为空,redis中也存在,则以cookie为准,覆盖redis
3.同步到redis中之后,覆盖本地cookie购物车的数据,保证本地购物车的数据是同步的
	/*
     * 注册登录成功后,同步cookie和redis中的购物车数据
     * */
    private void sychShopcartData(String userId, HttpServletRequest request,
                                  HttpServletResponse response) {
    
    
        //1 从redis中获取购物车
        String shopcartJsonRedis = redisOperator.get(FOODIE_SHOPCART + ":" + userId);

        //2 从cookie中获取购物车
        String shopcartStrCookie = CookieUtils.getCookieValue(request, FOODIE_SHOPCART, true);

        if (StringUtils.isBlank(shopcartJsonRedis)) {
    
    
            //redis为空,cookie不为空,把cookie放进redis
            if (StringUtils.isNotBlank(shopcartStrCookie)) {
    
    
                redisOperator.set(FOODIE_SHOPCART + ":" + userId, shopcartStrCookie);
            }
        } else {
    
    
            //redis不为空,cookie不为空,合并cookie和redis中购物车的商品数据(同一商品覆盖redis)
            if (StringUtils.isNotBlank(shopcartStrCookie)) {
    
    
                /*
                 * 1.已经存在的,把cookie中对应的数量,覆盖redis
                 * 2.该项商品标记为待删除,统一放入一个待删除的list
                 * 3.从cookie 中清理所有的待删除list
                 * 4.合并redis和cookie中的数据
                 * 5.更新到redis和cookie中
                 * */
                List<ShopcartBO> shopcartBOListRedis = JsonUtils.jsonToList(shopcartJsonRedis, ShopcartBO.class);
                List<ShopcartBO> shopcartBOListCookie = JsonUtils.jsonToList(shopcartStrCookie, ShopcartBO.class);

                //定义待删除List
                List<ShopcartBO> pendingDeleyeList = new ArrayList<>();

                for (ShopcartBO redisShopcart : shopcartBOListRedis) {
    
    
                    String redisSpecId = redisShopcart.getSpecId();
                    for (ShopcartBO cookieShopcart : shopcartBOListCookie) {
    
    
                        String cookieSpecId = redisShopcart.getSpecId();
                        if (redisSpecId.equals(cookieSpecId)) {
    
    
                            //覆盖购买数量,不累加
                            redisShopcart.setBuyCounts(cookieShopcart.getBuyCounts());
                            //把cookieShopcart放入待删除列表,用于最后的删除合并
                            pendingDeleyeList.add(cookieShopcart);
                        }
                    }
                }
                //从现有cookie中删除对应的覆盖过的商品数据
                shopcartBOListCookie.removeAll(pendingDeleyeList);
                //合并两个list
                shopcartBOListRedis.addAll(shopcartBOListCookie);
                //更新到cookie和redis
                CookieUtils.setCookie(request, response, FOODIE_SHOPCART, JsonUtils.objectToJson(shopcartBOListRedis), true);
                redisOperator.set(FOODIE_SHOPCART + ":" + userId, JsonUtils.objectToJson(shopcartBOListRedis));

            } else {
    
    
                //redis不为空,cookie为空,直接把redis覆盖cookie
                CookieUtils.setCookie(request, response, FOODIE_SHOPCART, shopcartJsonRedis, true);
            }
        }

    }

Cinco, publica y suscríbete

Seis, persistencia de Redis

Después de leer la teoría anterior, algunas personas pueden sentirse confundidas: Redis se basa completamente en la memoria, pero ¿puede ser persistente? ? Cuando la energía está apagada, ¿los datos en la memoria se han ido? ?
Referencia: documento oficial de Redis

Redis proporciona dos soluciones de persistencia: RDB (Base de datos de Redis), AOF (Adjuntar solo archivo)

RDB

A intervalos regulares, los datos en la memoria se escriben en un archivo temporal en el disco como una instantánea, y el archivo de la instantánea se lee en la memoria durante la restauración. Si la máquina se reinicia y los datos en la memoria se pierden, luego de reiniciar Redis, se restaurará

  • ventaja:
    1. Copia de seguridad de vez en cuando, copia de seguridad completa
    2. Recuperación ante desastres sencilla y transmisión remota
    3. Cuando se realiza una copia de seguridad del proceso hijo, el proceso principal no tendrá ninguna operación de E / S (legible) para garantizar la integridad de los datos de la copia de seguridad.
    4. En comparación con AOF, se puede reiniciar y restaurar rápidamente cuando hay archivos más grandes
  • Desventajas:
    1. En caso de falla, se pueden perder los últimos datos de respaldo
    2. La memoria ocupada por el proceso hijo será exactamente la misma que la del proceso padre, lo que provocará una carga en la CPU.
    3. Dado que la copia de seguridad completa programada es una operación pesada, no se puede procesar para una copia de seguridad en tiempo real

Configurar RDB:

  1. Mecanismo de ahorro:
  2. Habilitar el modo de compresión de archivos RDB
    rdbcompression: sí
  3. Verifique el archivo RDB (pero habrá un 10% de pérdida de memoria)
    rdbchecksum: sí

Resumen : RDB es adecuado para la recuperación de grandes cantidades de datos, pero la integridad y consistencia de los datos pueden ser insuficientes. Sin embargo, no importa lo que pierda el RDB. De todos modos, es el caché. Si lo pierde, lo pierde.

AOF

AOF puede garantizar la integridad de los datos.
Características: 1. Registre las operaciones de escritura solicitadas por los usuarios en forma de registros. Las operaciones de lectura no se grabarán.
2. El archivo se agrega en lugar de modificarlo.
3. Redis se restaura a través de AOF, que en realidad es para leer el registro y volver a ejecutar la operación de escritura

  • ventaja:

    1. Se puede realizar una copia de seguridad de AOF en segundos. Si ocurre un problema, solo se perderá el último segundo de los datos, lo que aumentará la fiabilidad e integridad de los datos.
    2. Se adjunta en forma de registro. Si el disco está lleno, se ejecutará la herramienta redis-check-aof
    3. Cuando la cantidad de datos es demasiado grande, redis puede reescribir automáticamente el archivo aof en segundo plano. Cuando redis continúa agregando el registro al archivo antiguo, la reescritura también es muy segura y no afectará las operaciones de lectura y escritura del cliente.
  • Desventaja

    1. Para los mismos datos, el archivo AOF será más grande que el archivo RDB
    2. Para diferentes mecanismos de sincronización, AOF será más lento que RDB, porque AOF realizará una copia de seguridad de las operaciones de escritura cada segundo.

Configurar AOF

¿Utiliza RDB o AOF?

  • Si puede aceptar un período de pérdida de caché, puede usar RDB
  • Si está más preocupado por los datos en tiempo real, use AOF
  • También puede usar RDB y AOF para la persistencia juntos, RDB para copia de seguridad en frío, puede restaurar diferentes versiones en diferentes momentos y AOF para copia de seguridad en caliente para garantizar que los datos solo se pierdan durante 1 segundo. Cuando AOF está dañado y no está disponible, use RDB para restaurarlo. Es decir, Redis primero carga el AOF, y si hay un problema con el AOF, luego carga el RDB.

7. Configure la replicación maestro-esclavo de Redis para realizar la separación de lectura y escritura.

Arquitectura maestro-esclavo


En términos generales, el modo maestro-esclavo usa un maestro y dos esclavos, pero debido a los fondos limitados, solo se usa un nodo esclavo en la siguiente configuración, es decir, un maestro, un esclavo y el

otro modo maestro-esclavo: replicación sin disco, si el servidor El disco en el disco es un disco duro mecánico y la eficiencia de lectura y escritura del disco puede ser relativamente baja. Si el ancho de banda de la red es relativamente bueno, la red se puede utilizar para la transmisión para evitar la interacción del disco.

replicación de información ver el estado actual maestro-esclavo

Modificar la configuración del nodo esclavo


Inserte la descripción de la imagen aquí


En este momento, nuestro esclavo, es decir, el nodo esclavo, ha sido configurado y reiniciado a través de redis_init_script en /etc/init.d

Agregue información sobre el nodo maestro, que se puede ver en el nodo esclavo, pero el nodo esclavo no puede escribir datos


Problemas que pueden surgir en este proceso:¿No puedes conectarte por alguna razón? Se recomienda verificar la réplica de en el archivo redis.conf, puede ser mi ilusión, no sé por qué se cambiará automáticamente a 127.0.0.1Da un poco de miedo. Como puede ver en la captura de pantalla anterior, no es normal.

Esta es la información correcta:

8. Mecanismo de eliminación de memoria y caducidad de la memoria caché de Redis

¿Cómo lidiar con claves caducadas?

  1. Limpieza de sincronización activa: compruebe periódicamente las claves caducadas de forma aleatoria y bórrelas si caducan (frecuencia de configuración HZ).
  2. Eliminación diferida pasiva: cuando el cliente solicita una clave, si la clave caduca, se eliminará.

(Por lo tanto, aunque la clave ha expirado, todavía ocupa memoria mientras no se limpie)

¿Y si la memoria está llena? Mecanismo de eliminación de memoria

Nueve, mecanismo de centinela

En el modo maestro-esclavo, ¿qué debo hacer cuando el nodo maestro deja de funcionar? Hará que la escritura sea imposible y el nodo esclavo no se pueda utilizar.
El mecanismo centinela se puede utilizar para el control. Cuando se mata el nodo principal, se puede utilizar el centinela para establecer el nodo hijo como el nodo principal.

Configurar centinela

Conmutación por falla

Cuando un centinela en el grupo centinela descubre que el maestro está inactivo, no puede decidir si realizar un cambio maestro-esclavo o una conmutación por error. Porque en el entorno de red, puede haber errores de juicio causados ​​por problemas de red. Esto se llama subjetivo fuera de línea
Cuando varios centinelas encuentran que hay un problema con este nodo (objetivo fuera de línea), se realizará la conmutación por error
Convierta el esclavo en el maestro para continuar el servicio. Este proceso lo ejecuta un líder entre muchos centinelas, y el líder debe ser elegido (la minoría obedece a la mayoría).

Cuando un centinela obtiene múltiples votos, se le llama líder, que convierte al esclavo original en maestro, y luego sincroniza la información del nuevo maestro con el esclavo.
Si el maestro anterior se recupera, el maestro anterior volverá a unirse como esclavo.

Acuerdo

  • El centinela tiene al menos tres ganglios, o un número impar de ganglios. (Elecciones fáciles de realizar, la minoría obedece a la mayoría)
  • Los centinelas deben desplegarse en diferentes nodos informáticos. (Si están todos en el mismo nodo, cuando el nodo está inactivo, el centinela también está muerto, no tiene sentido)
  • Un grupo de centinelas solo monitorea a un grupo de amo y esclavo.

10. Clúster de Redis: multimaestro y multiesclavo

Desventajas de un maestro: cuando el maestro antiguo está inactivo, se realiza una conmutación por error maestro-esclavo en este momento. Sin embargo, si se producen nuevas operaciones de escritura en este momento, se perderán. Entonces hay múltiples maestros y múltiples esclavos

Nodo de ranura

Los datos en redis se almacenan en el nodo de la ranura.

Después de aplicar un hash a los datos, se obtiene el módulo para obtener la ubicación de almacenamiento

11. Penetración de caché

¿Qué es la penetración de caché?
Para algunos datos calientes, que existen en redis, el propósito es reducir la cantidad de acceso a la base de datos. Sin embargo, si algunos usuarios ilegales atacan el sistema y pasan algunos valores que no existen en absoluto. Según la lógica anterior, primero irán a redis para encontrarlos. Si no los encuentran, irán a la base de datos para verificar. Si no se procesan, la base de datos se dañará. El número de visitas aumentó y finalmente bajó. ¿Cómo bloquear este acceso ilegal?

1. Almacenar el valor nulo obtenido de la información solicitada por usuarios ilegales en redis para blindar ataques a la base de datos

List<CategoryVO> list = new ArrayList<>();
        String subCatsStr = redisOperator.get("subCat:"+rootCatId);
        if (StringUtils.isBlank(subCatsStr)) {
    
    
            list = categoryService.getSubCatList(rootCatId);

            if (list!=null && list.size()>0){
    
    
                redisOperator.set("subCat:"+rootCatId, JsonUtils.objectToJson(list));
            }else {
    
    
                /*
                * 若被非法用户攻击(疯狂访问数据库,使数据库宕机)
                * 即缓存穿透
                * 解决方法:将用户非法的请求得到的空数据也缓存在redis中,避免直接访问数据库
                * */
                redisOperator.set("subCat:"+rootCatId, JsonUtils.objectToJson(list),5*60);
            }
        } else {
    
    
            list = JsonUtils.jsonToList(subCatsStr, CategoryVO.class);
        }
        return IMOOCJSONResult.ok(list);

2. Filtro de floración


Para cada tecla, después de una operación determinada, guárdelo en una posición determinada en la matriz
y configúrelo en 1. Cuando aparece un valor ilegal, no puede coincidir con 1, e incluso redis no entrará (obviamente, habrá errores) Frase)

Desventajas del filtro Bloom:

  1. No se pueden eliminar los datos (existen varios datos en la misma ubicación)
  2. Juicio erróneo
  3. Cuanto menor sea la tasa de error, mayor será el espacio ocupado
  4. Para mantener una colección e interactuar con redis

12. Avalancha de caché

El caché en Redis falló en un área grande en un momento determinado, y ocurrió una gran cantidad de solicitudes en este momento, lo que resultó en un tiempo de inactividad de la base de datos.

Trece, consulta por lotes de Redis


Se puede establecer una canalización para completar varias consultas clave a la vez

Supongo que te gusta

Origin blog.csdn.net/qq_44357371/article/details/109367400
Recomendado
Clasificación