aws - Redis: ¿Cómo intersecar un conjunto "normal" con un conjunto ordenado?
redis vs mongodb (1)
Supongamos que tengo un conjunto (o conjunto o lista ordenados si eso sería mejor) A de 100 a 1000 cadenas.
Luego tengo un conjunto ordenado B de muchas más cadenas, digamos un millón.
Ahora C debería ser la intersección de A y B (de las cadenas, por supuesto).
Quiero tener cada tupla (X, SCORE_OF_X_IN_B) donde X está en C.
¿Alguna idea?
Tengo dos ideas:
- Interstore
- almacenar A un conjunto ordenado con cada puntuación siendo 0
- interstore a D
- obtener todos los elementos de D
- borrar D
- Bucle simple en cliente
- bucle sobre A en mi programa cliente
- obtener zscore para cada cadena
Mientras que 1. tiene demasiados gastos generales en el lado redis (tiene que escribir, por ejemplo. La página redis tiene una complejidad de tiempo bastante alta, también http://redis.io/commands/zinterstore ), 2. tendría | A | conexiones de base de datos y no será una buena opción.
Tal vez podría escribir un script redis / lua que funcione como zscore pero con un número arbitrario de cadenas, pero no estoy seguro de si mi proveedor de contenido permite scripts ...
¡Así que solo quería preguntarle a SO, si hay una solución elegante y rápida disponible sin scripting!
Hay una solución simple para su problema: ZINTERSTORE
funcionará con un SET
y un ZSET
. Tratar:
redis> sadd foo a
(integer) 1
redis> zadd bar 1 a
(integer) 1
redis> zadd bar 2 b
(integer) 1
redis> zinterstore baz 2 foo bar AGGREGATE MAX
(integer) 1
redis> zrange baz 0 -1 withscores
1) "a"
2) "1"
Edición: Agregué AGGREGATE AGGREGATE MAX
arriba, ya que redis le dará a cada miembro del conjunto (no clasificado) foo
una puntuación predeterminada de 1
, y SUM
que con cualquier puntaje que tenga en la bar
configuración (ordenada).