Análisis del código fuente de Redisgeohash
Por supuesto, hay muchas formas de implementar la limitación actual y Redis tiene una función muy poderosa. He practicado tres métodos de implementación usando Redis y se pueden implementar de manera relativamente simple. Redis no solo puede limitar la corriente, sino también realizar estadísticas de datos, personas cercanas y otras funciones, que pueden escribirse más adelante.
Cuando usamos el bloqueo distribuido de Redis, todos sabemos que se basa en la instrucción setnx. Al operar CAS (comparar e intercambiar), también se establece una convención de invalidación para la clave especificada. Nuestro objetivo principal al limitar la corriente es que solo N solicitudes puedan acceder a mi programa de código por unidad de tiempo. Por lo tanto, esta función se puede implementar fácilmente confiando en setnx.
Por ejemplo, si necesitamos limitar 20 solicitudes en 10 segundos, podemos establecer el tiempo de vencimiento en 10 cuando el número de solicitudes setnx llegue a 20, logrando así el efecto de limitación actual. El código es relativamente simple y no se mostrará.
Por supuesto, este método también tiene muchas deficiencias. Por ejemplo, cuando se cuenta de 1 a 10 segundos, es imposible contar de 2 a 11 segundos. Si necesitamos contar M solicitudes en n segundos, entonces debemos guardar n claves en Redis, y así sucesivamente.
De hecho, lo más importante en la limitación actual es la ventana deslizante. También se mencionó anteriormente cómo 1-10 se convierte en 2-11. De hecho, el valor inicial y el valor final son ambos +1.
Si utilizamos la estructura de datos de lista de Redis, podemos implementar fácilmente esta función.
Podemos poner la solicitud en la matriz zset. A medida que llega cada solicitud, el valor sigue siendo único y puede generarse mediante el UUID, mientras que la puntuación se puede representar mediante la marca de tiempo actual, ya que la puntuación se puede utilizar para contar cuántas solicitudes hay en la marca de tiempo actual. La estructura de datos zset también proporciona un método de rango para que podamos obtener fácilmente cuántas solicitudes hay en dos marcas de tiempo.
El código es el siguiente
A través del código anterior, se puede lograr el efecto de ventana deslizante y se pueden garantizar hasta m solicitudes cada n segundos. La desventaja es que la estructura de datos de zset será cada vez más grande. El método de implementación también es relativamente simple. Las últimas preguntas de la entrevista se han ordenado y se pueden revisar en línea en el subprograma de la Biblioteca de entrevistas de Java.
Cuando se trata de limitación actual, tenemos que mencionar el algoritmo del depósito de tokens.
El algoritmo del depósito de tokens se refiere a la tasa de entrada y la tasa de salida. Cuando la tasa de salida es mayor que la tasa de entrada, se excede el límite de flujo.
En otras palabras, cada vez que accedemos a una solicitud, podemos obtener un token de Redis. Si conseguimos el token no hemos superado el límite, pero si no lo conseguimos ocurre todo lo contrario.
Confíe en el elemento emergente izquierdo de la lista para obtener el token.
Confíe en la tarea programada de Java para enviar el token rightPush a la lista con regularidad. Por supuesto, el token también debe ser único, por lo que sigo usando un UUID para generarlo aquí.
En resumen, la implementación del código no es difícil al principio. Para estos métodos de limitación actuales, podemos agregar el código anterior a AOP o filtrar para limitar la interfaz y, en última instancia, proteger su sitio web.
Redis en realidad tiene muchos otros usos. Su función no es solo el almacenamiento en caché, sino también el bloqueo distribuido. Sus estructuras de datos no son solo String, Hash, List, Set, Zset. Si está interesado, puede aprender sobre su algoritmo GeoHash más adelante; los datos de filtro de mapa de bits, HLL y Bloom (agregados después de Redis 4.0) se pueden instalar directamente con Docker.
Enlace original:/lmx 125254/article/details/90700118.