JsonDB - python实现的基于JSON格式的轻量级数据库开源项目

JsonDB

jsonDB是一个基于JSON格式的内存数据库.它具有以下特点:

  • 轻量级. 无守护进程,无需任何额外的安装和配置,你只需要import jsonDb即可使用,非常方便.
  • NOSQL. 类似于mongoDb的非关系型数据库.
  • 内存数据库. 所有数据基于内存进行操作和访问,性能相对较高.目前版本的性能测试数据请
    参考reference文档.
  • 任意迁移. 数据库可以完整导出为外部文件,并且可以从外部文件导入.基于此,数据库可以
    进行任意的迁移,而无需做任何修改.
  • 灵活的数据类型. 一个数据集合(collection)中的数据,并不需要相同的格式.比如以下几种数据
    可以同时存在于一个collection中:
    {'key1':1},{'key2':'value','pic':'value'},{'key3':'value'}

JsonDB使用python语言实现,是一个github开源项目,遵循MIT的LICENCE,基本上可以不受限制用于任何用途。

该DB的接口大体模仿了mongoDB的风格,使用起来非常简单和顺手。

概念说明:

  • db: 即数据库. 创建一个jsonDb类的实例,即是创建了一个数据库.可以指定dbname和hash的长度.
  • collection: 数据集合(表). 一个collection可以理解为数据库中的一个表. collection不需要
    单独创建,当insert第一条数据,或者ensureKey时,系统会自动创建.
  • data: 数据. collection中的一条数据,或者是一个数据的list. data必须是dict字典类型,是一个
    key-value键值对.

关键词说明:

以下关键词属于系统保留,不能作为任何字典dict的key名.

$lt 
$lte 
$gt 
$gte 
$ne 
$or 
$or[0-9] 
$jdb 
$jdb_collections 
$jdb_key 
$jdb_hash 
$jdb_coll 
$jdb_hashSize 
$jdb_md5

安装

  1. 从源码安装,首先从github下载源码,jsonDb源码下载地址
python setup.py install
  1. pypi直接安装,注意:本项目后续会上传到pypi,目前仅支持源码安装.
pip install jsonDb

Filter条件过滤器

很多操作会使用到Filter条件过滤器.比如,删除数据\更新数据\查询数据等.通过过滤器,我们可以指定更新一组满足一定条件的数据.
jsonDb提供了相对丰富和灵活的过滤器. 过滤器一般在方法的参数中使用filter来指定.

filter是一个dict,它包括key,value,逻辑表达式,条件表达式 几个部分.

filter={
  '逻辑表达式':{key:{
  '条件表达式':value}}}

逻辑表达式: 支持两种逻辑

  1. 逻辑或: '$or' '$or1' '$or2'…,,如果存在多个逻辑或,需要使用$or[0-9],例如:
filter={
  '$or':{
  'key1':value1, 'key2':value2,...}, '$or1':{
  'key1':value1, 'key2':value2,...}, ...}
  1. 逻辑与: 没有特殊的关键字,没有使用逻辑或关键字的{}内的key之间就是逻辑与的关系,例如:
filter={
  'key1':value1, 'key2':value2,...}

条件表达式: 条件表达式是用来表示key和value之间的关系

  • 等于 {<key>:<value>}
  • 小于 {<key>:{$lt:<value>}}
  • 小于或等于 {<key>:{$lte:<value>}}
  • 大于 {<key>:{$gt:<value>}}
  • 大于或等于 {<key>:{$gte:<value>}}
  • 不等于 {<key>:{$ne:<value>}}

Filter支持任意嵌套,这样使用起来会非常灵活.如下:

filter={
  '$or':{
  'key1':value1, '$or':{
  'key1':value1, '$or1':{
  'key1':value1, 'key2':value2,...},...},...}, 
        '$or1':{
  'key1':value1, 'key2':value2,...}, ...}

功能说明:

创建数据库

实例化一个JSONDB类实例,即创建一个数据库.我们重载了__str__方法,所以可以通过print直接查看数据库的统计信息.

>>> from jsonDb.database import JSONDB
>>> myDb = JSONDB('USER_DB')
>>> print myDb

------ jdb statics ------
db_name: USER_DB
mem_collection: 0 bytes
mem_hash: 0 bytes
collection_num: 0
**** collection statics **** 

删除数据库

jsonDB是内存数据库,一个数据库本质上就是一个类实例.所以数据库随类实例进行删除和释放.你可以通过del方法删除这个类实例,
当然也可以让python自己回收.

插入数据

插入一条数据,则对应的collection自动创建.可以插入一条或多条数据,必须通过list格式组织.单条数据必须是dict格式.

>>> myDb.insert('COL_CUSTOMERS',[{
  'id':1, 'name':'Jeffery', 'sex':'male', 'age':18, 'birth':'1990-01-03'}])
True
>>> print myDb

------ jdb statics ------
db_name: USER_DB
mem_collection: 104 bytes
mem_hash: 0 bytes
collection_num: 1
**** collection statics **** 
 name: COL_CUSTOMERS
 data_num: 0
 key: []
 index: False
 data_mem: 104 bytes
 hash_mem: 0 bytes

>>> 

可以通过find()查看插入结果,为了显示格式更加便于阅读,JSONDB提供了静态格式化打印方法rprint():

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jsonDBjsonDB是一个基于JSON格式的内存数据库.它具有以下特点:轻量级. 无守护进程,无需任何额外的安装和配置,你只需要import jsonDb即可使用,非常方便.NOSQL. 类似于mongoDb的非关系型数据库.内存数据库. 所有数据基于内存进行操作和访问,性能相对较高.目前版本的性能测试数据请 参考reference文档.任意迁移. 数据库可以完整导出为外部文件,并且可以从外部文件导入.基于此,数据库可以 进行任意的迁移,而无需做任何修改.灵活的数据类型. 一个数据集合(collection)中的数据,并不需要相同的格式.比如以下几种数据 可以同时存在于一个collection中: {'key1':1},{'key2':'value','pic':'value'},{'key3':'value'}JsonDB使用Python语言实现,是一个github开源项目,遵循MIT的LICENCE,基本上可以不受限制用于任何用途。该DB的接口大体模仿了mongoDB的风格,使用起来非常简单和顺手。概念说明:db: 即数据库. 创建一个jsonDb类的实例,即是创建了一个数据库.可以指定dbname和hash的长度.collection: 数据集合(表). 一个collection可以理解为数据库中的一个表. collection不需要 单独创建,当insert第一条数据,或者ensureKey时,系统会自动创建.data: 数据. collection中的一条数据,或者是一个数据的list. data必须是dict字典类型,是一个 key-value键值对.安装从源码安装,首先从github下载源码,jsonDb源码下载地址python setup.py install功能说明:创建数据库实例化一个JSONDB类实例,即创建一个数据库.我们重载了__str__方法,所以可以通过print直接查看数据库的统计信息.>>> from jsonDb.database import JSONDB >>> myDb = JSONDB('USER_DB') >>> print myDb ------ jdb statics ------ db_name: USER_DB mem_collection: 0 bytes mem_hash: 0 bytes collection_num: 0 **** collection statics ****更多详细使用说明请参考中文说明文档。 标签:jsonDB
Avro是一个轻量级的数据序列化框架,同时也提供了RPC功能。Avro提供了一个基于JSON的schema定义文件来描述数据结构,使得Avro能够支持动态的数据类型。Avro还提供了一个名为avro-rpc的模块,用于实现基于Avro的RPC。 下面我们来对avro-rpc进行性能测试。我们将使用Python 3.7作为客户端和服务端编程语言,并使用Apache Bench来进行压力测试。 首先,我们需要安装avro和avro-rpc模块: ``` pip install avro pip install avro-rpc ``` 接下来,我们编写一个简单的RPC服务端程序: ```python import avro.protocol import avro.ipc import socket PROTOCOL = avro.protocol.parse(open("test.avpr").read()) class RpcServer(object): def __init__(self, host, port): self.server = avro.ipc.HTTPServer(self.handle_request) self.server.add_listener((host, port)) def handle_request(self, request, protocol): message_name = request.message_name request_params = request.request_params print("Received request: {} {}".format(message_name, request_params)) if message_name == "ping": return "pong" elif message_name == "echo": return request_params else: raise avro.AvroRemoteException("Unknown message: {}".format(message_name)) def serve_forever(self): self.server.start() self.server.join() if __name__ == "__main__": server = RpcServer("localhost", 8080) server.serve_forever() ``` 这个RPC服务端程序会监听localhost的8080端口,并实现了两个RPC方法:ping和echo。当客户端调用ping方法时,服务端会返回字符串“pong”;当客户端调用echo方法时,服务端会返回客户端传递的参数。 接下来,我们编写一个简单的RPC客户端程序: ```python import avro.protocol import avro.ipc import socket PROTOCOL = avro.protocol.parse(open("test.avpr").read()) class RpcClient(object): def __init__(self, host, port): self.transceiver = avro.ipc.HTTPTransceiver((host, port)) self.requestor = avro.ipc.Requestor(PROTOCOL, self.transceiver) def ping(self): return self.requestor.request("ping", []) def echo(self, message): return self.requestor.request("echo", [message]) if __name__ == "__main__": client = RpcClient("localhost", 8080) print(client.ping()) print(client.echo("Hello, world!")) ``` 这个RPC客户端程序会连接到localhost的8080端口,并调用服务端实现的ping和echo方法。 接下来,我们使用Apache Bench来进行压力测试: ``` ab -n 10000 -c 10 http://localhost:8080/ ``` 这个命令会模拟10个并发连接,总共发送10000个请求。我们可以通过修改-n和-c参数来改变测试规模。 测试结果如下: ``` Server Software: Server Hostname: localhost Server Port: 8080 Document Path: / Document Length: 4 bytes Concurrency Level: 10 Time taken for tests: 7.194 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 1830000 bytes HTML transferred: 40000 bytes Requests per second: 1390.36 [#/sec] (mean) Time per request: 7.194 [ms] (mean) Time per request: 0.719 [ms] (mean, across all concurrent requests) Transfer rate: 248.18 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 14 Processing: 1 7 2.3 7 24 Waiting: 1 7 2.3 7 24 Total: 1 7 2.3 7 24 Percentage of the requests served within a certain time (ms) 50% 7 66% 8 75% 8 80% 8 90% 10 95% 12 98% 15 99% 17 100% 24 (longest request) ``` 从测试结果中可以看出,avro-rpc在处理10000个请求时,平均每个请求处理时间为7.194毫秒。每秒处理请求数为1390.36,处理速度较快,而且没有出现失败的请求。因此,我们可以认为avro-rpc是一个性能良好的轻量级RPC框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值