Я использую redis-py и всякий раз, когда я храню список или dict в кеше, запуск функции get возвращает строку. как мне вернуть исходный тип данных?
cache = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)
cache.set("posts",[["bob","My first post"],["mary","My second post"]])
cache.get("post")
>>>"[["bob","My first post"],["mary","My second post"]]"
Это что-то, что мне нужно сделать вручную?
Список списков - это ваша проблема, так как Redis не любит вложенные структуры.
Попробуйте что-то вроде преобразования в json перед сохранением и конвертированием обратно на доступ.
Ваша проблема очень похожа на то, как хранить сложный объект в redis (используя redis-py)
В 3-м ответе (из CivFan) приведен пример, который будет транслировать довольно напрямую для того, что, по-видимому, вы пытаетесь сделать. Для справки, фрагмент кода, предоставленный в этом вопросе/ответе:
import json
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
images= [
{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'},
{'type':'big', 'url':'....'},
]
json_images = json.dumps(images)
r.set('images', json_images)
unpacked_images = json.loads(r.get('images'))
images == unpacked_images
Есть еще несколько моментов, которые следует учитывать и в связанном вопросе.
Если вы храните стандартные json-данные, вы должны использовать модуль json для сериализации перед тем, как вводить redis.
import json
val = json.dumps([["bob","My first post"],["mary","My second post"]])
redis_cache.set("posts",val)
str_val = redis_cache.get("posts")
obj = json.loads(str_val)
Если вы хотите сохранить любой объект python, используйте pickle для сериализации
import pickle
val = pickle.dumps([["bob","My first post"],["mary","My second post"]])
redis_cache.set("posts",val)
str_val = redis_cache.get("posts")
obj = pickle.loads(str_val)