Python 内存数据库 CyberDB 使用实例
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 |
|
这是此项目的依赖。这篇文章不是 Python 基础教程,如果你不清楚,请查询相关文档创建虚拟环境 venv
目录并安装 requirements.txt
中的依赖。
生成 venv
目录并安装好依赖后,下面所有操作都在激活的虚拟环境中运行。
文件 cyberdb_init.py
功能:初始化 CyberDB 的表结构,只在第一次运行时使用,后续不再使用。
1 |
|
在项目根目录执行
1 |
|
以完成 CyberDB 数据库表的初始化。
它会在 CyberDB 中创建了一个名为 centre
、类型为 CyberDict
的表;初始化 content
键的值为 Hello CyberDB!
;最后将 CyberDB 数据库保存至硬盘(在项目根目录生成了名为 data.cdb
的文件)。
文件 cyberdb_serve.py
功能:运行 CyberDB 服务端。
1 |
|
在项目根目录执行
1 |
|
以运行 CyberDB 服务端。
此处设置了 encrypt=True
,CyberDB 会将 TCP 通信内容使用 AES-256 算法加密。开启 encrypt=True
后,CyberDB 仅允许白名单中的 IP 通信,默认白名单为 ['127.0.0.1']
(查看白名单 设置方法)。一般,若只需在本地进程间通信,无需开启 encrypt=True
和设置白名单,只有远程通信时需要此操作。
文件 app.py
功能:运行 Flask 实例和 CyberDB 客户端。
1 |
|
该模块会在每次请求执行前(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 |
|
使用 4 进程、Gevent 启动 Flask 实例。
浏览器访问 127.0.0.1:8000
,得到如下响应:
1 |
|
参考信息
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中国 荣誉推出