data-structures example - ¿Hay una alternativa de Java incrustable a Redis?




cache spring (5)

De acuerdo con este hilo , Jedis es lo mejor para usar si quiero usar Redis de Java.

Sin embargo, me preguntaba si hay bibliotecas / paquetes que proporcionen operaciones de conjunto igualmente eficientes a las que ya existen en Redis, pero que pueden integrarse directamente en una aplicación Java sin la necesidad de configurar servidores separados. (es decir, usando Jetty para el servidor web).

Para ser más precisos, me gustaría poder hacer lo siguiente de manera eficiente:

  1. Hay un gran conjunto de usuarios de M (M no se conoce de antemano).
  2. Hay un gran conjunto de N elementos.
  3. Queremos que los usuarios examinen elementos, un usuario / elemento a la vez, que produce un resultado almacenado (en una base de datos normal).
  4. Cada vez que llega un usuario, queremos asignar a ese usuario el elemento con la menor cantidad de resultados existentes que el usuario no haya visto antes. Esto produce una asignación aproximada de todos los usuarios que llegan, cuando nos preocupamos de que todos los artículos se vean aproximadamente el mismo número de veces.

Lo anterior sucede de forma paralela. Cuando M y N son grandes, Redis logra lo anterior de manera mucho más eficiente que las consultas SQL. ¿Hay alguna forma de hacerlo utilizando una biblioteca embebida de Java que sea un poco más liviana que iniciar un servidor Redis?

Reconozco que es posible escribir un montón de código usando las bibliotecas de concurrencia de Java que se aproximarían a esto (y hasta cierto punto, lo he hecho), pero eso no es exactamente lo que estoy buscando aquí.


Answers

Eche un vistazo a lmdb (Lightning Memory Database), porque necesitaba exactamente lo mismo. Despliego una aplicación dropwizard en un contenedor, y añadir redis u otra dependencia externa es doloroso. Esto parece funcionar bien, tiene buena actividad. fyi, sin embargo, todavía no he usado esto en producción.

https://github.com/lmdbjava/lmdbjava


Eche un vistazo al proyecto voldemort . Es un almacén de clave-valor distribuido creado por Linked-In, y admite la capacidad de ser incrustado.

En la guía de inicio rápido hay un pequeño ejemplo de cómo ejecutar el servidor incrustado frente a independiente.

VoldemortConfig config = VoldemortConfig.loadFromEnvironmentVariable();
VoldemortServer server = new VoldemortServer(config);
server.start();

No sé mucho sobre Redis, por lo que no puedo compararlos entre sí. En el proyecto utilizamos Voldemort, usamos su tienda de respaldo de solo lectura con excelentes resultados. Nos permitió "precompilar" una base de datos bi-diaria en nuestro centro de datos de procesamiento y "enviarla" a centros de datos de extremo a extremo. De esta forma, cada centro de datos de borde tenía una copia local de su conjunto de datos.

EDITAR: Después de volver a leer su pregunta, quería agregar la Tabla de Gauva : esta tabla de estructura de datos también puede ser algo que usted busca y es similar a lo que obtiene con muchas bases de datos sin sql.


La Biblioteca de guayaba de Google proporciona versiones amigables de los mismos (y más) operadores de conjuntos que proporciona redis.

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained

p.ej

    Guava                     Redis
    Sets.intersection(a,b)    sinter a b
    a.count()                 scard a
    Sets.difference(a,b)      sdiff a b
    Sets.union(a,b)           sunion a b

Los multisectos son un proxy razonablemente directo para los conjuntos clasificados de redis también.


Hazelcast proporciona varias implementaciones de estructura de datos distribuidos que se pueden usar como una alternativa pura de Java a los servicios de Redis. A continuación, puede enviar un solo "jar" con todas las dependencias necesarias para ejecutar su aplicación. Puede que tenga que ajustar las primitivas ligeramente diferentes relativas a Redis en su propia aplicación.

Las soluciones comerciales en este espacio incluyen Enterprise Ehcache de Teracotta y Oracle Coherence .


Otra ventaja es que puede ser muy claro cómo se va a comportar memcache en un escenario de almacenamiento en caché, mientras que redis se usa generalmente como un almacén de datos persistente, aunque se puede configurar para que se comporte como memcached, al mismo tiempo que desaloja los elementos usados ​​menos recientemente cuando alcanza el máximo capacidad.

Algunas aplicaciones en las que he trabajado usan ambas para aclarar cómo pretendemos que se comporten los datos: cosas en memcache, escribimos código para manejar los casos en los que no existen, cosas en redis, confiamos en que estén allí .

Aparte de eso, Redis generalmente se considera superior, ya que la mayoría de los casos de uso son más ricos en características y, por lo tanto, flexibles.





java data-structures redis set embed