Redis:是否可以直接在 php/laravel 和 python 之间共享日期时间?

Redis : is it possible to share datetimes directly between php/laravel and python?

我正在使用 Redis (phpredis) 在我的 Laravel 和我的 Python 应用程序之间共享数据。

在 Laravel 内,我将我的数组保存在特定频道上:

$data = MyModel::where('start_date','>', "2018-05-02 10:00:00")->get();

// $data = [{'id':1, 'start_date': "2018-05-03 12:00:00", 'name': "}…]

Redis::set("barChannel", json_encode($data));

在 Python 内,我读取了以下数据:

import redis
import json

myredis = redis.Redis()

data = json.loads(myredis.get('barChannel'));
// data = [{'id':1, 'start_date': "2018-05-03 12:00:00", 'name': "}…]

所以基本上数据成功通过,但我的 python 列表中没有直接有一个 datetime 值,我有一个必须转换的 string。在上面的例子中,我可以使用 then datetime.datetime.strptime 但在更复杂的数据结构(嵌套的字典列表)的情况下......转换每个变量非常痛苦。

有没有一种方法可以在 Redis 中存储日期时间,Python 可以本地识别?

不,经过少量研究您会知道,Redis 仅以字符串表示形式存储其值,因此您唯一的选择是存储序列化数据并在需要时反序列化。

从以下内容开始:

  • Unserialize PHP data in python

关于上述问题的更新。两篇关于使用 json 模块的优秀文章解决了我从 Redis 导入深度嵌套日期时间(并将它们导出回来)的问题:

How to convert to a Python datetime object with JSON.loads?(导入)

def date_hook(json_dict):
    for (key, value) in json_dict.items():
        try:
            json_dict[key] = datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
        except:
            pass
    return json_dict

data = json.loads(myredis.get('barChannel'), object_hook=date_hook)

How to overcome "datetime.datetime not JSON serializable"?(导出)

def json_serial(obj):
    """JSON serializer for objects not serializable by default json code"""

    if isinstance(obj, (datetime, date)):
        return obj.strftime('%Y-%m-%d %H:%M:%S')
    raise TypeError ("Type %s not serializable" % type(obj))

json_values = json.dumps(data, default=json_serial, separators=(',', ':'))
myredis.publish('barChannel', json_values);