如何在redis中存储复杂对象(使用redis py)

2024-05-17 19:09:19 发布

您现在位置:Python中文网/ 问答频道 /正文

hmset函数可以设置每个字段的值,但是我发现如果值本身是一个复杂的结构化对象,那么hget返回的值是一个序列化字符串,而不是原始对象

例如

images= [{'type':'big', 'url':'....'},
     {'type':'big', 'url':'....'},
     {'type':'big', 'url':'....'}]   

redis = Redis()
redis.hset('photo:1', 'images', images)

i = redis.hget('photo:1', 'images')
print type(i)

i的类型是一个字符串,而不是一个python对象,除了手动解析每个字段之外,还有什么方法可以解决这个问题吗?


Tags: 对象函数字符串redisurl序列化type结构化
3条回答

JSON示例:

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

Python3:

unpacked_images = json.loads(r.get('images').decode('utf-8'))
images == unpacked_images

不能在Redis中创建嵌套结构,这意味着不能(例如)将本机Redis列表存储在本机Redis散列映射中。

如果您真的需要嵌套结构,您可能只需要存储一个JSON blob(或类似的东西)。另一个选项是将另一个redis对象的id/键存储为映射键的值,但这需要多次调用服务器才能获得完整的对象。

实际上,可以使用内置模块pickle将python对象存储在redis中。

这是一个例子。

import pickle
import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)
obj = ExampleObject()
pickled_object = pickle.dumps(obj)
r.set('some_key', pickled_object)
unpacked_object = pickle.loads(r.get('some_key'))
obj == unpacked_object

相关问题 更多 >