CyberDB,一个基于 Python 字典和列表的内存数据库。
概括
CyberDB 是一个轻量级的 Python 内存数据库。它旨在利用 Python 内置数据结构字典、列表作数据存储,通过 TCP 套接字高效通信,并提供了数据持久化。该数据库的亮点在于它使用了 Pythonic 的方式编程,你可以像使用字典和列表一样使用 CyberDB。
现在我们把 CyberDB 带到能发挥其作用的地方,在生产环境中将 CyberDB 作为 Flask 的内存数据库,使用 Gunicorn 运行,并实现多进程间的通信。
这篇文章通过一个尽可能精简的 Flask 实例讲解,不会涉及复杂的 Web 知识。核心思路为 CyberDB + Gunicorn + Gevent + Flask(多进程 + 协程),启动一个 CyberDB 服务器,使用 Gunicorn 多进程运行 Flask 实例,每个进程的实例通过 Gevent 运行,进程中使用 CyberDB 客户端连接至内存数据库,由此实现对 CyberDB 数据库的高并发访问。
源码解析
文章使用 PyPy 运行,同样适用 CPython。
运行环境: Debian 10, Python 3.8.12, PyPy 7.3.7
此项目的目录结构
1 | . |
我们通过列举每个文件的内容顺序讲解 CyberDB 的核心操作。
文件 requirements.txt
1 | CyberDB>=0.7.1 |
这是此项目的依赖。这篇文章不是 Python 基础教程,如果你不清楚,请查询相关文档创建虚拟环境 venv
目录并安装 requirements.txt
中的依赖。
生成 venv
目录并安装好依赖后,下面所有操作都在激活的虚拟环境中运行。
文件 cyberdb_init.py
功能:初始化 CyberDB 的表结构,只在第一次运行时使用,后续不再使用。
1 | import time |
在项目根目录执行
1 | python cyberdb_init.py |
以完成 CyberDB 数据库表的初始化。
它会在 CyberDB 中创建了一个名为 centre
、类型为 CyberDict
的表;初始化 content
键的值为 Hello CyberDB!
;最后将 CyberDB 数据库保存至硬盘(在项目根目录生成了名为 data.cdb
的文件)。
文件 cyberdb_serve.py
功能:运行 CyberDB 服务端。
1 | import cyberdb |
在项目根目录执行
1 | python cyberdb_serve.py |
以运行 CyberDB 服务端。
此处设置了 encrypt=True
,CyberDB 会将 TCP 通信内容使用 AES-256 算法加密。开启 encrypt=True
后,CyberDB 仅允许白名单中的 IP 通信,默认白名单为 ['127.0.0.1']
(查看白名单 设置方法)。一般,若只需在本地进程间通信,无需开启 encrypt=True
和设置白名单,只有远程通信时需要此操作。
文件 app.py
功能:运行 Flask 实例和 CyberDB 客户端。
1 | import cyberdb |
该模块会在每次请求执行前(before_request()
)使用 client.get_proxy()
获取 proxy
对象,每个获取的 proxy
对象可以绑定一个 TCP 连接,此处使用 proxy.connect()
从连接池获取连接。视图函数 hello_world()
中,由 proxy
获取的对象 centre
,与 proxy
共用同一个连接,proxy
的连接释放后,centre
也会失去连接。在每次请求后(teardown_request()
)使用 proxy.close()
方法释放 proxy
绑定的连接,归还至连接池。
cyberdb.connect
的 time_out
参数表示连接池中每个连接的超时时间,此处每个连接超过 900 秒无操作将被舍弃。若不设置该参数,连接池的每个连接会维持到失效为止。
使用 Gunicorn 运行 Flask 实例
Gunicorn 是一个用于 UNIX 的 Python WSGI HTTP 服务器,通常在生产环境使用,可以利用多核 CPU 。
Gevent 是一个基于协程的 Python 网络库。Gevent 会更改 CyberDB 客户端的底层套接字通信,使之支持协程。
在项目根目录运行
1 | gunicorn -w 4 -b 127.0.0.1:8000 -k gevent app:app |
使用 4 进程、Gevent 启动 Flask 实例。
浏览器访问 127.0.0.1:8000
,得到如下响应:
1 | {"code":1,"content":"Hello CyberDB!"} |
参考信息
CyberDB 源码: https://github.com/Cyberbolt/CyberDB
总结
通过此例,你可以把 CyberDB 部署到更复杂的 Web 环境中,充分享受内存的低延迟特性。CyberDB 的核心是以 Pythonic 的方式编程,你可以在任何 Python 代码中将 CyberDB 作为内存数据库。
作者简介:
Cyberbolt:一个自由的 Python 开发者。
via: https://www.cyberlight.xyz/static/cyberdb-chn/tutorial/flask/
本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出