Redis Avanzada - filtro Bloom

Aquí Insertar imagen Descripción


Pre

Nos optimización caché Redis avanzada -Redis hablamos de una solución para evitar la penetración de la caché: vaciar la memoria caché que el valor de una mejor manera de resolver el filtro Bloom, aquí se explica en detalle a continuación.


Bloom puede resolver cuál es el problema?

Por ejemplo: hay cinco mil millones el número de teléfono, ahora 100.000 números de teléfono, la forma de determinar con rapidez y precisión la presencia o ausencia de estos números?

Esquema A: DB? ----> 5 mil millones el número de teléfono, esta eficiencia de la consulta?
Programa B: la memoria? -> Haga clic en un número de teléfono de 8 bytes de 5.000.000.000 de bytes de memoria * 8 = 40 G ...
Programa C: hyperloglog ----> exactitud un poco bajo?

Hay muchos problemas similares, tales como

  • filtrado de spam
  • Procesador de textos (como Word) la detección de errores palabra
  • Web rastreadores de detección de URL duplicado
  • filtro de línea hbase
  • ...

El principio BloomFilter

1970 propuesto por Burton. Bloom, con muy poco espacio para resolver el problema

Un vector largo binario (que se entenderá que es la estructura de datos subyacente de una matriz de super-enorme dura sólo 0 y 1), además de un número de funciones hash

Aquí Insertar imagen Descripción

Tenemos funciones hash K para el cálculo de k-ésimo, el cálculo de los resultados hash para cada conjunto a la posición correspondiente, y luego recupera cuando la función hash Recalculado de nuevo, si no es un 1, es decir el filtro de Bloom no existe el número, son todos solamente 1 estaba presente.

La captación de depósitos y métodos de cálculo deben ser los mismos, de lo contrario Xiecai. . . .


filtro de la construcción de la floración

Aquí Insertar imagen Descripción

Parámetros: m vector binario, n a datos preliminares, las funciones de hash k

filtro de la construcción de la floración: enésimo datos listos para ir de nuevo el procedimiento anterior

La determinación de la presencia o ausencia de elementos: estos datos, el proceso de generación de nuevo para volver a tomar (k-veces la función hash), si ambos 1, indica la presencia, ausencia y viceversa.


La construcción de la tasa de error de Bloom

Para comenzar, utilizando filtros Bloom tiene que aceptar un error, la presencia de posibles errores. Ciertamente hay un error, que se acaba de todos los afectados

Por ejemplo, hay dos valores de hash después de la k, calcula el valor es 1, esta vez, de hecho, el único valor de la matriz subyacente, y Bloom te dice que hay otro valor

Parámetros: m vector binario, n a datos preliminares, las funciones de hash k

: Factores intuitivos en una relación de número de m n, la función / de hash

Supongamos que usted pequeño binario vector m para almacenar una relación de mapeado proporcionan, tales como 1000 ( en Guava un ejemplo, proporcionado únicamente 1000 de almacenamiento 1000 no es decir, un gran número de guayaba cálculo de datos subyacente, la tasa de error en conjunción con su conjunto calcula la longitud de una matriz súper), que n (cantidad de datos) y super multi, tal como 100 millones de dólares, existen tres funciones hash utilizado para calcular.

Esta vez tengo un "artesano" de datos,

Después de la primera operación de la función hash se almacena en la ubicación de la matriz subyacente de cinco elementos
a través de la segunda cálculo de la función de hash se almacena en la ubicación de la matriz subyacente de 100 elementos de
más de un tercio operación de la función de hash se almacena en la matriz subyacente la ubicación de los elementos 1024

Esta vez usted tiene que determinar la presencia o ausencia artesano, sólo es necesario volver a calcular las tres funciones de hash, siempre y cuando los primeros 51,001,024 elementos correspondientes al valor de posición es 1, entonces que existe. Mientras hay un 0, no existe.

Supongo que es otra pieza del xxxx de datos, después de tres cálculo de comprobación aleatoria, si él pasó a tener aterrizó la primera posición 51,001,024 elementos, que Bloom dijo que XXX existen en la realidad? De hecho la primera 51001024 Este valor se calcula a partir del artesano, en lugar de xxx, lo que resultó en datos inexactos, hay que aceptar la posibilidad de error.


m / n es inversamente proporcional a la tasa de error, k es inversamente proporcional a la tasa de error

m / n es inversamente proporcional al error: vector binario m, un N-Ready de datos, que le permite almacenar m matriz binaria más grande, el más pequeño de los datos que necesita para almacenar el n real, entonces m / n es mayor que? Que la tasa de error es correspondientemente baja.

k y la tasa de error es inversamente proporcional: Ye Hao entiende esto, supongamos que tiene sólo una función hash, ¿no se repite la probabilidad es mucho mayor? Así que cuanto mayor sea el k, menor es la tasa de error.


Las proyecciones reales de tasa de error

Parámetros: m vector binario, n a datos preliminares, las funciones de hash k

  • 1) un elemento, una función hash, la probabilidad de cualquier bit 1 es 1 / m, la probabilidad es 0 1- 1 / m

  • 2) funciones k, probabilidad de 0 (1-1 / m) de la k-ésima potencia, n-elementos, todavía probabilidad de 0 (1-1 / m) ésima potencia de nk

  • 3) se establece en 1, la probabilidad es 1 - (1-1 / m) ésima potencia de nk

  • 4) la probabilidad de un nuevo elemento en el conjunto de Aquí Insertar imagen Descripción

valor comúnmente usado función hash de la tasa de errores en:
Aquí Insertar imagen Descripción


filtro Bloom (nivel JVM)

Mapa de bits puede comprender primero los principios y la aplicación de algoritmos especiales Algorithms_ _Bitmap

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;


public class GuavaBloomFilterTest {
    // BloomFilter 容量 (实际上Guava通过计算后开辟的空间远远大于capacity)
    private static final int capacity = 100000;

    // 构建 BloomFilter
    private static BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), capacity);

    // 模拟初始化数据
    static{
        for (int i = 0; i < capacity; i++) {
            bloomFilter.put(i);
        }
    }



    public static void main(String[] args) {

        int testData =  999;
        long startTime = System.nanoTime();

        if (bloomFilter.mightContain(testData)){
            System.out.println(testData + " 包含在布隆过滤器中 ");
        }
        System.out.println("消耗时间: " + (System.nanoTime() - startTime) + " 微秒");

        // 错误率判断
        double errNums = 0;
        for (int i = capacity + 1000000; i < capacity + 2000000; i++) {
            if (bloomFilter.mightContain(i)) {
                ++errNums;
            }
        }

        System.out.println("错误率: " + (errNums/1000000));
    }
}

problema local filtro Bloom

  • la capacidad del recipiente se limita memoria local, tales como la JVM Tomcat
  • Una pluralidad de aplicaciones pluralidad filtros Bloom, constructo complejo de sincronización (la analogía sesión, la comprensión similares)

Aquí Insertar imagen Descripción

  • Reiniciar las necesidades de aplicaciones de contenido almacenado en caché para ser reconstruido

Para los ataques maliciosos, no existe un gran número de peticiones a los datos de la caché del servidor debido a la penetración también puede hacer primero filtrada a través de un filtro Bloom, para filtrar los datos Bloom no existen en general son capaces de filtrar, no deje que la solicitud bajar enviar extremo trasero.

Cuando los rendimientos de filtro Bloom existe un valor, el valor no puede existir; cuando dicen que hay, desde luego, no existe.

Aquí Insertar imagen Descripción

filtro Bloom es un gran número de bits no son el mismo grupo y función hash imparcial.

Imparcial se llama el valor hash del elemento puede ser calculada relativamente uniforme.

Cuando se añade la clave para el filtro de Bloom, serán utilizados para una pluralidad de función hash al valor clave hash se considera entonces como un índice entero para el número de bits de funcionamiento longitud de módulo para obtener una posición, cada uno de las funciones de hash serán consideradas una ubicación diferente. A continuación, la posición de estos bits se establece en un grupo se completa operación de adición.

Cuando se le preguntó si existe la clave para el filtro Bloom, como complemento, también la ubicación de varios de hash se calculan para ver si el número de bits en estos lugares se establece en 1, el tiempo que un bit es 0, entonces eso filtro Bloom en esta clave no existe.

Si usted es uno, esto no significa que debe existir esta clave, pero es más probable porque estos bits se establecen en 1 puede ser debido a la presencia de otra tecla de vencimiento.

Si este grupo poco escaso, esta probabilidad será grande, si este bit grupo lleno de gente, esta probabilidad se reduce.

Este método no es adecuado para el éxito alta de datos, datos relativamente fijos, baja en tiempo real (por lo general mayor conjunto de datos) escenarios de aplicación, el mantenimiento del código más complejo, pero la caché ocupa muy poco espacio .


pseudocódigo

Bolsa de transporte puede guvua filtro de Bloom, la dependencia introducido

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>22.0</version>
</dependency>
import com.google.common.hash.BloomFilter;


//初始化布隆过滤器 

//1000:期望存入的数据个数,0.001:期望的误差率
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf‐8")), 1000, 0.001);


//把所有数据存入布隆过滤器
void init(){
	for (String key: keys) {
       bloomFilter.put(key);
    } 
 }


String get(String key) {
	// 从布隆过滤器这一级缓存判断下key是否存在
	Boolean exist = bloomFilter.mightContain(key);
	if(!exist){
		return "";
	}
	// 从缓存中获取数据
	String cacheValue = cache.get(key);
	// 缓存为空
	if (StringUtils.isBlank(cacheValue)) {
		// 从存储中获取
		String storageValue = storage.get(key);
		cache.set(key, storageValue);
		// 如果存储数据为空, 需要设置一个过期时间(300秒)
		if (storageValue == null) {
		cache.expire(key, 60 * 5);
	 }
	 	return storageValue;
	 } else {
		 // 缓存非空
		 return cacheValue;
	 }
 }




filtro Bloom (distribuido)

Se analizaron existen las deficiencias del filtro local Bloom, una sola aplicación, las dificultades de sincronización filtro Bloom entre múltiples aplicaciones solamente, y una vez que el reinicio de la aplicación, fallos de caché.

Para un entorno distribuido, puede ser utilizada para construir distribuido Bloom filtro Redis

Uso redisson marco

https://github.com/redisson/redisson/wiki/6.-distributed-objects#68-bloom-filter

RBloomFilter<SomeObject> bloomFilter = redisson.getBloomFilter("sample");
// initialize bloom filter with 
// expectedInsertions = 55000000
// falseProbability = 0.03
bloomFilter.tryInit(55000000L, 0.03);

bloomFilter.add(new SomeObject("field1Value", "field2Value"));
bloomFilter.add(new SomeObject("field5Value", "field8Value"));

bloomFilter.contains(new SomeObject("field1Value", "field8Value"));
bloomFilter.count();

filtros Bloom se resuelven Redis penetración caché escena, lo que resulta en un gran número de solicitudes de caer en la DB, DB aplastado.

filtro Bloom debe por lo ReDiS entre el caché y DB.

Bloom le dice que no es no necesariamente existe, no debe existir. Así que cuando usted no ha encontrado el valor de la base de datos, debe colocar esta actualización clave para el filtro de Bloom, la próxima vez que esta tecla, y luego con el tiempo, no hay retorno directo, la necesidad de consultar la base de datos de nuevo.

pseudocódigo

public String getByKey(String key) {
    String value = get(key);
    if (StringUtils.isEmpty(value)) {
        logger.info("Redis 没命中 {}", key);
        if (bloomFilter.mightContain(key)) {
            logger.info("BloomFilter 命中 {}", key);
            return value;
        } else {
            if (mapDB.containsKey(key)) {
                logger.info("更新 Key {} 到 Redis", key);
                String valDB = mapDB.get(key);
                set(key, valDB);
                return valDB;
            } else {
                logger.info("更新 Key {} 到 BloomFilter", key);
                bloomFilter.put(key);
                return value;
            }
        }
    } else {
        logger.info("Redis 命中 {}", key);
        return value;
    }
}

La desventaja de Bloom Filter

filtro de floración a expensas de la precisión del juicio, la comodidad, elimina, sólo para lograr la eficiencia en el tiempo y el espacio es relativamente alta, porque

  • Que una determinación falsa puede encontrarse en los elementos no en el contenedor, pero las posiciones k obtenidos después de los valores de hash son 1. Si el filtro de la floración se almacena en una lista negra, es posible almacenar elementos puede ser un aborto involuntario de la justicia a través del establecimiento de una lista blanca.

  • Borrar datos. Elemento en un recipiente k asignada a posiciones de bit de la matriz es 1, no puede simplemente ser eliminado cuando se fija directamente a 0, puede afectar a la determinación de otros elementos. Contando filtro Bloom se puede considerar

Publicados 831 artículos originales · ganado elogios 2074 · Vistas 4,23 millones +

Supongo que te gusta

Origin blog.csdn.net/yangshangwei/article/details/105107779
Recomendado
Clasificación