使用Redis的Python对象存储

时间:2019-01-20 20:23:01

标签: python redis

刚开始学习Redis。来自EhCache的背景,在Redis中,几乎没有什么让我感到困惑。这是我想要实现的:

import redis


class User:

    def __init__(self, idd, name):
        self.id = idd
        self.name = name


cache = redis.Redis(host='localhost', port=6379, db=0)
#cache = redis.StrictRedis(host="localhost", port=6379, charset="utf-8", decode_responses=True)

user1 = User(1, 'john')
user2 = User(2, 'jack')

users_dict = {}
users_dict['1'] = user1
users_dict['2'] = user2

print(users_dict)

if not cache.exists('users'):
    cache.set('users', users_dict)

users_dict_retrieved = cache.get('users')
print(users_dict_retrieved)

print(users_dict_retrieved.get('1').name)

它应该只打印john作为输出。这是我得到的输出:

{'1': <__main__.User object at 0x103a71710>, '2': <__main__.User object at 0x103a71780>}
b"{'1': <__main__.User object at 0x103a71710>, '2': <__main__.User object at 0x103a71780>}"
Traceback (most recent call last):
  File "/Users/rishi/code/test.py", line 34, in <module>
    print(users_dict_retrieved.get('1').name)
AttributeError: 'bytes' object has no attribute 'get'

但是我得到AttributeError: 'bytes' object has no attribute 'get'。我了解这是因为检索对象时,它是字节形式的。我尝试使用cache = redis.StrictRedis(host="localhost", port=6379, charset="utf-8", decode_responses=True)代替,但是它随后也将对象表示形式转换为字符串。我还对hsethget做了一些实验,但这也出错了。解决这个问题的任何简单方法?还是我必须将对象写入字符串以进行存储,然后在检索后使用字符串作为对象?

1 个答案:

答案 0 :(得分:0)

您应该将dict对象而不是User对象传递到列表中。 示例:

class User:

    def __init__(self, idd, name):
        self.id = idd
        self.name = name

    def to_dict(self):
        return self.__dict__
""" rest of code """

users_dict = {}
users_dict['1'] = user1.to_dict()
users_dict['2'] = user2.to_dict()