Saltar al contenido

Cassandra evitando duplicados

Este team de especialistas luego de muchos días de investigación y de juntar de información, dimos con los datos necesarios, queremos que resulte de gran utilidad en tu plan.

Solución:

Déjame entender — si la pareja (userId, placeId) debe ser único (lo que significa que no tiene que poner dos filas con este par de datos) ¿cuál es el timeVisit útil para en la primaria key? ¿Por qué realizarías una consulta usando order by visitTime desc si esto tendrá sólo una fila?

Si lo que necesitas es evitar duplicidades tienes 2 formas.

1 – Transacción ligera — esto, usando IF NOT EXISTS hará lo que quieras. Pero como expliqué aquí, las transacciones ligeras son realmente lentas debido a un manejo particular por parte de Cassandra.

2 – USING TIMESTAMP Cumplimiento del tiempo de escritura – (¡cuidado con eso!***) El ‘truco‘ es forzar una disminución TIMESTAMP

Déjame dar un ejemplo:

INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 1000, 'PLEASE DO NOT OVERWRITE ME') using TIMESTAMP 100;

Esto produce esta salida

select * from users;

 uid | placeid | otherstuffs                | visittime
-----+---------+----------------------------+-----------
   1 |       2 | PLEASE DO NOT OVERWRITE ME |      1000

Ahora disminuyamos el timestamp

INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 2000, 'I WANT OVERWRITE YOU') using TIMESTAMP 90;

Ahora los datos de la tabla no se han actualizado.ya que existe una operación TS mayor (100) para la pareja (uid, placeid) — de hecho aquí la salida no ha cambiado

select * from users;

 uid | placeid | otherstuffs                | visittime
-----+---------+----------------------------+-----------
   1 |       2 | PLEASE DO NOT OVERWRITE ME |      1000

Si el rendimiento importa, use la solución 2, si el rendimiento no importa, use la solución 1. Para la solución 2, puede calcular una marca de tiempo decreciente para cada escritura usando un número fijo menos el tiempo del sistema en milisegundos.

p.ej:

Long decreasingTimestamp = 2_000_000_000_000L - System.currentTimeMillis();

*** esta solución puede provocar un comportamiento inesperado si, por ejemplo, desea eliminar y luego volver a insertar datos. Es importante saber que una vez que elimine los datos, podrá volver a escribirlos solo si la operación de escritura tendrá una marca de tiempo superior a la de eliminación (si no se especifica, la marca de tiempo utilizada es la de la máquina)

HH,
carlo

Si te gustó nuestro trabajo, tienes la habilidad dejar un post acerca de qué te ha parecido este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *