Estoy empezando a utilizar Redis, y me he encontrado con el siguiente problema.Autoincremento en Redis
Tengo un montón de objetos, digamos Messages
en mi sistema. Cada vez que un nuevo User
conecta, hago lo siguiente:
INCR
alguna variable global, digamosg_message_id
, y guardar el valor de retorno de INCR (el valor actual deg_message_id
).LPUSH
el nuevo mensaje (incluido elid
y el mensaje real) en una lista.
Otros clientes utilizan el valor de g_message_id
para comprobar si hay nuevos mensajes de conseguir.
El problema es que un cliente podría INCR
la g_message_id
, pero no tienen tiempo para LPUSH
el mensaje antes de que otro cliente intenta leerlo, suponiendo que hay un mensaje nuevo.
En otras palabras, estoy buscando una manera de hacer el equivalente a agregar filas en SQL y tener un índice autoincrementado para trabajar.
Notas:
no puedo usar los índices de la lista, ya que a menudo tienen que eliminar partes de la lista, por lo que es válido.
Mi situación en realidad es un poco más compleja, esta es una versión más simple.
solución actual:
La mejor solución que he llegado con y lo que planeo hacer es utilizar WATCH
Transactions
y para tratar de realizar una "incremento automático" a mí mismo.
Pero este es un caso de uso tan común en Redis que me sorprende que no exista una respuesta, así que me preocupa que esté haciendo algo mal.
Interesante. Esto lleva a un problema relacionado: cuando un cliente sondea el servidor con su copia de "g_new_message_flag", ¿cómo recupera el servidor los mensajes de la lista? Simplemente puede extraer una cantidad de mensajes basados en la diferencia entre "g_new_message_flag" y el indicador de los usuarios, pero si se agregan nuevos mensajes entre la operación de resta y el LPOP, aparecerá una cantidad incorrecta de mensajes. –
Veo lo que quiere decir: si se supone que un cliente debe mostrar todos los mensajes disponibles y poner a cero la lista, eso es más complicado. Actualizaré mi respuesta con algunos pensamientos. – samplebias
En realidad, no quiero que el cliente elimine los mensajes, solo obtenga los últimos mensajes. Tengo varios clientes diferentes con (posiblemente) diferentes valores de g_msg_queue, y cada uno necesita leer los últimos mensajes que han llegado. La lista solo se elimina periódicamente mediante un proceso en segundo plano (por ejemplo, una vez al día). –