8. Aplicaciones avanzadas [Serie] Redis Redis - limitar la corriente sencilla

Original: 8. [] serie Redis Redis de aplicaciones avanzadas - actual sencilla limitantes

Limitante en un sistema distribuido es un tema mencionado con frecuencia, si la capacidad actual del sistema, no es suficiente para sostener una gran cantidad de tiempo para la visita, a continuación, vamos a dejar de solicitudes de entrada al sistema para mantener la presión

límite de corriente sencilla

En primer lugar nos fijamos en un simple política común limitante, un sistema para limitar cada comportamiento de los usuarios en un tiempo determinado única operación N veces, cómo es la estructura de datos para lograr este ReDiS limitarla.

soluciones

Esta demanda existe una ventana de tiempo deslizante limitante, el valor de la puntuación pensar estructura de datos zConfigurar no es para ser rodeado por la puntuación de ventana de tiempo. Y sólo tenemos que mantener fuera de los datos de esta ventana de tiempo, la ventana puede ser cortada. El valor que este relleno zConfigurar lo que es mejor? Sólo se necesita la singularidad de garantía, utilizará uuid más desperdicio de espacio, a continuación, utilizar marca de tiempo de milisegundos ella.


image.png

Como se muestra, la historia comportamiento de grabación del usuario zConfigurar una estructura, cada uno de un comportamiento se guardará como el zConfigurar clave. Un usuario con el mismo tipo de comportamiento con un registro zConfigurar.

Para ahorrar memoria, sólo tenemos que el comportamiento de retención de registros en la ventana de tiempo, y si el usuario es un comportamiento del usuario en el frío, la ventana de tiempo deslizante es registro vacío, entonces este zConfigurar se puede quitar de la memoria, no ocupan espacio.

Se pueden extraer mediante la comparación del comportamiento actual está permitido por el número de comportamiento dentro de la ventana deslizante de umbral MAX_COUNT estadística. Expresada por los siguientes códigos:

public class SimpleRateLimiter {

  private Jedis jedis;

  public SimpleRateLimiter(Jedis jedis) {
    this.jedis = jedis;
  }

  public boolean isActionAllowed(String userId, String actionKey, int period, int maxCount) {
    String key = String.format("hist:%s:%s", userId, actionKey);
    long nowTs = System.currentTimeMillis();
    Pipeline pipe = jedis.pipelined();
    pipe.multi();
    pipe.zadd(key, nowTs, "" + nowTs);
    pipe.zremrangeByScore(key, 0, nowTs - period * 1000);
    Response<Long> count = pipe.zcard(key);
    pipe.expire(key, period + 1);
    pipe.exec();
    pipe.close();
    return count.get() <= maxCount;
  }

  public static void main(String[] args) {
    Jedis jedis = new Jedis();
    SimpleRateLimiter limiter = new SimpleRateLimiter(jedis);
    for(int i=0;i<20;i++) {
      System.out.println(limiter.isActionAllowed("laoqian", "reply", 60, 5));
    }
  }

}

Este código es un tanto complejo, que requiere al lector a pasar algún tiempo para masticar correctamente en. Es la idea es la siguiente: cuando cada acto pronto, mantiene una ventana de tiempo. El registro fuera de la ventana todo el tiempo para limpiar, dejando sólo los registros en la ventana. zConfigurar colección única anotación valores son muy importantes, el valor de valor de ningún significado especial, sólo asegúrese de que es único en él.

Dado que estas operaciones son para Redis sucesivas con una clave, el uso de la tubería Redis puede mejorar significativamente la eficacia del acceso. Sin embargo, esta solución tiene sus inconvenientes, ya que actúa para registrar todos los registros dentro de la ventana de tiempo, si la cantidad es grande, estas operaciones no podrá superar el límite de los 60 100w veces este argumento, no es apropiado para hacerlo limitante, porque consumirá una gran cantidad de espacio de almacenamiento.

Supongo que te gusta

Origin www.cnblogs.com/lonelyxmas/p/12515050.html
Recomendado
Clasificación