Python 内存数据库 CyberDB 使用开发示例
总结
CyberDB 是一个轻量级的 Python 内存数据库。它旨在使用Python的内置数据结构目录、列表等。该数据库的亮点在于它以Pythonic方式编程,您可以像使用目录和列表一样使用CyberDB。
现在我们将CyberDB带到了一个可以发挥其作用的地方。在生产环境中,CyberDB作为Flask的内存数据库,与Gunicorn一起运行,实现多进程之间的通信。
本文通过一个尽可能精简的Flask示例进行讲解,不涉及复杂的Web知识。核心思想是CyberDB + Gunicorn + Gevent + Flask(多进程+协程)。启动 CyberDB 服务器并使用 Gunicorn 多进程来运行 Flask 实例。每个进程的实例都是按事件运行的。过程中使用CyberDB客户端连接内存数据库。 ,从而实现对CyberDB数据库的高并发访问。
源码分析
文章使用PyPy运行,CPython也适用。
运行环境:Debian 10、Python 3.8.12、PyPy 7.3.7
本项目的目录结构
.├── app.py├──b_server cyber.py├──_ cyber. py├──requirements.txt└──venv
我们将通过按顺序列出每个文件的内容来解释CyberDB的核心操作。
文件requirements.txt CyberDB>=0.7.1Flask==2.1.1gevent==21.12.0gunicorn==20.1.0
这是该项目的依赖项。本文不是 Python 基础教程。如果不清楚的话请看为虚拟环境 venv
目录创建适当的文档,并在 requirements.txt
中安装依赖项。
生成venv
目录并安装依赖后,以下所有操作均在激活的虚拟环境中进行。
文件cyberdb_init.py
功能:初始化CyberDB的表结构,仅在第一次运行时使用,以后不再使用。
import timeimport cyberdbdb = cyberdb.Server# 配置CyberDB服务器的地址、端口和密码。 db.start(host='127.0.0.1', port=9980,password='123456')#服务器启动后,连接CyberDB服务器。 time.sleep(3)client = cyberdb.connect(host='127.0.0.1', port=9980,password='123456')# 生成代理对象。 with client.get_proxy as proxy: # 创建一个CyberDict类型的表中心并初始化内容。 proxy.create_cyberdict('centre') center = proxy.get_cyberdict('centre') center['content'] = 'Hello CyberDB!' # 将 CyberDB 保存到 data.cdb。 db.save_db('data.cdb')
在项目根目录下执行
python cyberdb_init.py
,完成CyberDB数据库表的初始化。 ? 你好 CyberDB!;最后将CyberDB数据库保存到硬盘中(在项目根目录下会生成一个名为data.cdb
的文件)。
文件cyberdb_serve.py
功能:运行CyberDB服务器。
import cyberdbdef main: # 后台运行CyberDB服务器并设置相关信息。 db = cyberdb.Server # 将data.cdb从硬盘读取到CyberDB。 db.load_db('data.cdb') # 每300秒备份一次数据库。db.set_backup('data.cdb', Cycle=300) db.run(host='127.0.0.1', # TCP运行地址 port=9980, # TCP监听端口 password='hWjYvVdqRC', # 数据库连接密码 max_con= 10000, # 最大加密并发数 = True, # 加密通信 print_log=False # 不打印日志) if __name__ == '__main__': main
在根目录运行
如果此处设置 文件app.py 功能:在CyberDB客户端中运行Flask实例。 此模块在每个请求之前执行 ( 绑定返回池中,参数 使用 Gunicorn 运行 Flask 实例 Gunicorn 是一个适用于 UNIX 的 Python WSGI HTTP 服务器,常用于生产环境,可以利用多核 CPU。 Gevent 是一个基于协程的 Python 网络库。Gevent 更改了 CyberDB 客户端的底层套接字通信以支持协程。 运行 使用4个进程,Gevent启动项目根目录下的Flask实例。 浏览器访问 总结 通过此示例,您可以在更复杂的Web环境中部署CyberDB,并充分享受内存的低延迟特性。CyberDB的核心采用Pythonic方式编程,您可以在任何 Python 代码中将 CyberDB 作为内存数据库运行。 关于作者: Cyberbolt:一名自由 Python 开发人员。python cyberdb_serve.py 运行网络数据库服务器。
获取加密=True
,CyberDB将使用AES-256算法对TCP通信内容进行加密。启用encrypt=True
后,CyberDB仅允许白名单中的IP通信。默认白名单为['127.0.0.1']
(参见白名单设置方法)。一般来说,如果只需要本地进程间通信,则无需禁用encrypt=True
并设置白名单。仅当远程通信时才需要此操作。 import Cyberdb fromflask import Flask, g# 连接到 CyberDB 并生成客户端实例。 client = cyberdb.connect( host='127.0.0.1', port=9980, password='hWjYvVdqRC', # 如果服务器加密,则客户端也必须加密,反之亦然。 encrypt=True, # 如果任何连接超过为 900 如果秒内没有操作,则连接被丢弃 # 连接由连接池智能管理,无需关注细节 time_out=900) # 创建 Flask 实例,请参见到本节 # Flask 文档 https://flask.palletsprojects.com/app = Flask (__name__)@app.before_requestdef before_request: # 在执行每个请求之前生成代理对象。g.proxy = client.get_proxy # 从连接池中获取连接。 g.proxy.connect@app.get("/")def hello_world: # 从数据库中获取中心表。 center = g.proxy.get_cyberdict('centre') return { 'code': 1, 'content': center['content'] }@app.teardown_requestdef destroy_request(error): # 返回每个请求返回的连接执行池。 g.proxy.closeif __name__ == '__main__': app.run(host='127.0.0.1', port=8000)
before_request() 使用 enClient .get_Proxy
Proxy
对象。任何收到的Proxy
对象都可以绑定到TCP连接。这里是Proxy.connect 获取来自连接池的连接。在搜索函数
hello_world
中,对象Center
从proxy接收到与相同的连接 ,
代理
之后连接释放后,Center
也失去连接。每次请求后(teardown_request()
),使用proxy.close
方法关闭连接,即通过cyberdb.connect
time_out
表示连接池中每个连接的超时时间,这里每个连接为超过900秒无操作则丢弃。如果不设置该参数,则连接池中的每个连接都会被保留,直到过期。 gunicorn -w 4 -b 127.0.0.1:8000 -k gevent app:app
127.0.0.1:8000
,得到如下响应: {"code":1,"content":"Hello CyberDB❀! CyberDB 源代码: https:// / github.com/Cyberbolt/CyberDB
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。