es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo eliminar un elemento de un conjunto ordenado de Redis basado en un campo JSON.

Estoy usando Redis para diseñar la línea de tiempo de usuario (como en Twitter). Estoy usando un conjunto ordenado para almacenar valores JSON con una marca de tiempo como puntuación.

“`
zrange feed:user:10000001 0 10 WITHSCORES
1) "{
2) "1639073241754"
3) "{
4) "1639073241748"

“`

¿Cómo elimino todas las publicaciones del usuario B de la línea de tiempo del usuario A cuando el usuario A deja de seguir al usuario B?

Dado que la consulta de datos JSON no está admitida en un conjunto ordenado (y en Redis), algunas respuestas en SO sugieren almacenar el valor JSON en un hash utilizando postId como una subclave y almacenando postId como valor en el conjunto ordenado. Pero, ¿dónde debo almacenar userId para buscarlo al eliminar basado en él? ¿Cómo implemento esta función?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la funcionalidad de eliminar todas las publicaciones del usuario B de la línea de tiempo del usuario A cuando el usuario A deja de seguir al usuario B, se puede mantener un conjunto separado para la línea de tiempo de cada usuario. Por ejemplo, se puede crear un conjunto timeline:user:A para almacenar todas las publicaciones en la línea de tiempo del usuario A. De manera similar, se puede crear un conjunto timeline:user:B para almacenar todas las publicaciones en la línea de tiempo del usuario B.

    Cuando el usuario A deja de seguir al usuario B, se puede iterar sobre todas las publicaciones en la línea de tiempo del usuario B (es decir, el conjunto timeline:user:B) y eliminar esas publicaciones de la línea de tiempo del usuario A (es decir, el conjunto timeline:user:A) usando el comando Redis ZREM. Se pueden identificar las publicaciones del usuario B en la línea de tiempo del usuario A verificando el campo userId de cada publicación.

    Para almacenar el postId como subclave en un hash y el postId como valor en un conjunto ordenado, se pueden usar los siguientes comandos:

    # Agregar una publicación al hash del usuario A con postId 10000411
    HSET user:A:posts 10000411 "{\"postId\":10000411,\"userId\":10000001}"
    
    # Agregar el postId 10000411 al conjunto ordenado de la línea de tiempo del usuario A con la marca de tiempo como puntaje
    ZADD timeline:user:A 1639073241754 10000411
    

    Para eliminar todas las publicaciones del usuario B de la línea de tiempo del usuario A, se puede usar el siguiente comando:

    # Iterar sobre todas las publicaciones en la línea de tiempo del usuario B
    ZRANGE timeline:user:B 0 -1 WITHSCORES | while read postId score; do
      # Obtener el userId de la publicación
      HGET user:B:posts $postId | grep -oP '(?<=userId":)[0-9]+' | (
        read userId
        # Si el userId es el id del usuario B, eliminar la publicación de la línea de tiempo del usuario A
        [ "$userId" = 10000002 ] && ZREM timeline:user:A $postId
      )
    done
    

    Ten en cuenta que los comandos anteriores son solo un ejemplo y es posible que debas modificarlos según tus requisitos específicos.

Comments are closed.