pubsub lpush hkeys exist commands python redis

python - lpush - redis hkeys



Redis: Cómo analizar un resultado de lista (4)

Estoy almacenando una lista en Redis así:

redis.lpush(''foo'', [1,2,3,4,5,6,7,8,9])

Y luego recupero la lista de esta manera:

redis.lrange(''foo'', 0, -1)

y me sale algo como esto:

[b''[1, 2, 3, 4, 5, 6, 7, 8, 9]'']

¿Cómo puedo convertir esto a la lista real de Python?

Además, no veo nada definido en RESPONSE_CALLBACKS que pueda ayudar? ¿Me estoy perdiendo de algo?

Una posible solución (que en mi opinión apesta) puede ser:

result = redis.lrange(''foo'',0, -1)[0].decode() result = result.strip(''[]'') result = result.split('', '') # lastly, if you know all your items in the list are integers result = [int(x) for x in result]

ACTUALIZAR

Ok, así que tengo la solución.

En realidad, la función lpush espera que todos los elementos de la lista se pasen como argumentos y NO como una sola lista. La firma de la función de la fuente redis-py deja en claro ...

def lpush(self, name, *values): "Push ``values`` onto the head of the list ``name``" return self.execute_command(''LPUSH'', name, *values)

Lo que estoy haciendo arriba es enviar una lista única como un argumento, que luego se envía a redis como un elemento ÚNICO.

Debería estar desempaquetando la lista como se sugiere en la respuesta:

redis.lpush(''foo'', *[1,2,3,4,5,6,7,8,9])

que devuelve el resultado que espero ...

redis.lrange(''foo'', 0, -1) [b''9'', b''8'', b''7'', b''6'', b''5'', b''4'', b''3'', b''2'', b''1'']


Creo que te encuentras con una semántica que es similar a la distinción entre list.append () y list.extend () . Sé que esto funciona para mí:

myredis.lpush(''foo'', *[1,2,3,4])

... note el operador * (map-over) prefijando la lista!



Otra forma: puedes usar la biblioteca de RedisWorks .

pip install redisworks

>>> from redisworks import Root >>> root = Root() >>> root.foo = [1,2,3,4,5,6,7,8,9] # saves it to Redis as a list ... >>> print(root.foo) # loads it from Redis later

Convierte tipos de python a tipos redis y viceversa. Así que incluso si hubiera anidado la lista, habría funcionado:

>>> root.sides = [10, [1, 2]] # saves it as list in Redis. >>> print(root.sides) # loads it from Redis [10, [1, 2]] >>> type(root.sides[1]) <class ''list''>

Descargo de responsabilidad: escribí la biblioteca. Aquí está el código: https://github.com/seperman/redisworks


import json r = [b''[1, 2, 3, 4, 5, 6, 7, 8, 9]''] rstr = r[0] res_list = json.loads(rstr)