Code前端首页关于Code前端联系我们

Python 内存数据库 Cyber​​DB 使用开发示例

terry 2年前 (2023-09-25) 阅读数 54 #后端开发

Python 内存数据库 CyberDB 使用开发实例
总结

Cyber​​DB 是一个轻量级的 Python 内存数据库。它旨在使用Python的内置数据结构目录、列表等。该数据库的亮点在于它以Pythonic方式编程,您可以像使用目录和列表一样使用Cyber​​DB。

现在我们将Cyber​​DB带到了一个可以发挥其作用的地方。在生产环境中,Cyber​​DB作为Flask的内存数据库,与Gunicorn一起运行,实现多进程之间的通信。

本文通过一个尽可能精简的Flask示例进行讲解,不涉及复杂的Web知识。核心思想是Cyber​​DB + Gunicorn + Gevent + Flask(多进程+协程)。启动 Cyber​​DB 服务器并使用 Gunicorn 多进程来运行 Flask 实例。每个进程的实例都是按事件运行的。过程中使用Cyber​​DB客户端连接内存数据库。 ,从而实现对Cyber​​DB数据库的高并发访问。

源码分析

文章使用PyPy运行,CPython也适用。

运行环境:Debian 10、Python 3.8.12、PyPy 7.3.7

本项目的目录结构

.├── app.py├──b_server cyber.py├──_ cyber. py├──requirements.txt└──venv

我们将通过按顺序列出每个文件的内容来解释Cyber​​DB的核心操作。

文件requirements.txt Cyber​​DB>=0.7.1Flask==2.1.1gevent==21.12.0gunicorn==20.1.0

这是该项目的依赖项。本文不是 Python 基础教程。如果不清楚的话请看为虚拟环境 venv 目录创建适当的文档,并在 requirements.txt 中安装依赖项。

生成venv目录并安装依赖后,以下所有操作均在激活的虚拟环境中进行。

文件cyberdb_init.py

功能:初始化Cyber​​DB的表结构,仅在第一次运行时使用,以后不再使用。

import timeimport cyberdbdb = cyberdb.Server# 配置Cyber​​DB服务器的地址、端口和密码。 db.start(host='127.0.0.1', port=9980,password='123456')#服务器启动后,连接Cyber​​DB服务器。 time.sleep(3)client = cyberdb.connect(host='127.0.0.1', port=9980,password='123456')# 生成代理对象。 with client.get_proxy as proxy: # 创建一个Cyber​​Dict类型的表中心并初始化内容。 proxy.create_cyberdict('centre') center = proxy.get_cyberdict('centre') center['content'] = 'Hello Cyber​​DB!' # 将 Cyber​​DB 保存到 data.cdb。 db.save_db('data.cdb')

在项目根目录下执行

python cyberdb_init.py

,完成Cyber​​DB数据库表的初始化。 ? 你好 Cyber​​DB!;最后将Cyber​​DB数据库保存到硬盘中(在项目根目录下会生成一个名为data.cdb的文件)。

文件cyberdb_serve.py

功能:运行Cyber​​DB服务器。

import cyberdbdef main: # 后台运行Cyber​​DB服务器并设置相关信息。 db = cyberdb.Server # 将data.cdb从硬盘读取到Cyber​​DB。 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

在根目录运行

python cyberdb_serve.py 运行网络数据库服务器。

如果此处设置加密=True,Cyber​​DB将使用AES-256算法对TCP通信内容进行加密。启用encrypt=True后,Cyber​​DB仅允许白名单中的IP通信。默认白名单为['127.0.0.1'](参见白名单设置方法)。一般来说,如果只需要本地进程间通信,则无需禁用encrypt=True并设置白名单。仅当远程通信时才需要此操作。

文件app.py

功能:在Cyber​​DB客户端中运行Flask实例。

import Cyber​​db fromflask import Flask, g# 连接到 Cyber​​DB 并生成客户端实例。 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中,对象Centerproxy接收到与相同的连接 ,代理 之后连接释放后,Center也失去连接。每次请求后(teardown_request()),使用proxy.close方法关闭连接,即通过

绑定返回池中,参数

cyberdb.connecttime_out表示连接池中每个连接的超时时间,这里每个连接为超过900秒无操作则丢弃。如果不设置该参数,则连接池中的每个连接都会被保留,直到过期。

使用 Gunicorn 运行 Flask 实例

Gunicorn 是一个适用于 UNIX 的 Python WSGI HTTP 服务器,常用于生产环境,可以利用多核 CPU。

Gevent 是一个基于协程的 Python 网络库。Gevent 更改了 Cyber​​DB 客户端的底层套接字通信以支持协程。

运行

gunicorn -w 4 -b 127.0.0.1:8000 -k gevent app:app

使用4个进程,Gevent启动项目根目录下的Flask实例。

浏览器访问127.0.0.1:8000,得到如下响应:

{"code":1,"content":"Hello Cyber​​DB❀! Cyber​​DB 源代码: https:// / github.com/Cyber​​bolt/Cyber​​DB

总结

通过此示例,您可以在更复杂的Web环境中部署Cyber​​DB,并充分享受内存的低延迟特性。Cyber​​DB的核心采用Pythonic方式编程,您可以在任何 Python 代码中将 Cyber​​DB 作为内存数据库运行。

关于作者:

Cyber​​bolt:一名自由 Python 开发人员。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门