键值存储之上的面向表的抽象层
项目描述
kvlayer
=======
``kvlayer`` 是一个数据库抽象层,为应用程序提供简单的键值存储。出于开发目的,这可以针对内存中的实现或诸如 [Redis](http://redis.io/) 之类的服务器运行;在测试和生产中,这可以切换到关系数据库,例如 [PostgreSQL](http://postgresql.org/) 或集群数据库,例如 [Accumulo](http://accumulo.apache.org/) 或[Riak](http://basho.com/riak/)。
配置
-------------
``kvlayer`` 依赖于 [Yakonfig](https://github.com/diffeo/yakonfig/) 库来获取其配置信息。配置位于传递给应用程序的 YAML 文件中。这包括*存储类型*,指示要使用的后端,以及*应用程序名称*和*命名空间*,它们都区分共享同一数据库的不同应用程序。
```yaml
kvlayer:
storage_type: local # in-memory data store
app_name: kvlayer
namespace: kvlayer
```
kvlayer API
-----------
应用程序会看到多个 kvlayer *tables*,它们可以实现为具有该概念的数据库的数据库原生表。每行都有一个键和一个值。键是 Python 元组,具有一些一致的类型集;元组部分可以是字符串、整数或 UUID。值始终是 Python 字节字符串。
kvlayer 提供了四种基本操作。``put()`` 将一个或多个键值对写入数据库。``get()`` 检索具有已知固定键的键值对。``scan()`` 检索键范围内的键值对。``delete()`` 删除特定键。
一个最小的 kvlayer 应用程序看起来像:
```python
import argparse
import kvlayer
import yakonfig
parser = argparse.ArgumentParser()
yakonfig.parse_args(parser, [yakonfig, kvlayer])
kvl = kvlayer.client()
kvl.setup_namespace({'table': (str,)})
# 写入值
kvl.put('table', (('foo' ,), 'one'), (('bar',), 'two'))
#
在 kvl.get('table', ('foo',)) 中检索 k,v 的值:
assert k == ' foo'
print v
#
在 kvl.scan('table', (('a',), ('e',))) 中扫描 k,v 的值:
print k
print v
#
在 kvl.scan_keys 中扫描 k 的键('table', (('e',), ('z',))):
print k
# 删除值
kvl.delete('table', ('foo',))
```
其他说明
----------
请参阅[使用 saltstack 对 Accumulo 进行测试](accumulo-tests.md) 的详细信息。
对于吞吐量测试,请参阅 [kvlayer_throughput_tests](https://github.com/diffeo/kvlayer/blob/0.4.5/kvlayer/tests/test_throughput.py)。
例如,使用各种单节点 EC2 实例,随机
读取/写入会遇到以下速率:
| 工人数 | 存储类型 | 读取 MB/秒 | 写入 MB/秒 | |
|-------------|-------------|-------------|------ --------|---|
| 100 | 雷迪斯 | 99.6 | 57.3 |m1.xlarge |
| 50 | 雷迪斯 | 93.7 | 56.5 |m1.xlarge |
| 25 | 雷迪斯 | 66.9 | 33.8 |m1.xlarge |
| 80 | 后勤 | 34.2 | 14.4 |m1.中 |
| 50 | 后勤 | 33.1 | 14.1 |m1.中 |
| 25 | 后勤 | 30.1 | 13.7 |m1.中 |
| 100 | 累积 | 17.2 | 13.6 |m1.大 |
| 50 | 累积 | 21.9 | 16.0 |m1.大 |
| 25 | 累积 | 24.7 | 16.6 |m1.大 |
TODO:收集更多统计数据。
=======
``kvlayer`` 是一个数据库抽象层,为应用程序提供简单的键值存储。出于开发目的,这可以针对内存中的实现或诸如 [Redis](http://redis.io/) 之类的服务器运行;在测试和生产中,这可以切换到关系数据库,例如 [PostgreSQL](http://postgresql.org/) 或集群数据库,例如 [Accumulo](http://accumulo.apache.org/) 或[Riak](http://basho.com/riak/)。
配置
-------------
``kvlayer`` 依赖于 [Yakonfig](https://github.com/diffeo/yakonfig/) 库来获取其配置信息。配置位于传递给应用程序的 YAML 文件中。这包括*存储类型*,指示要使用的后端,以及*应用程序名称*和*命名空间*,它们都区分共享同一数据库的不同应用程序。
```yaml
kvlayer:
storage_type: local # in-memory data store
app_name: kvlayer
namespace: kvlayer
```
kvlayer API
-----------
应用程序会看到多个 kvlayer *tables*,它们可以实现为具有该概念的数据库的数据库原生表。每行都有一个键和一个值。键是 Python 元组,具有一些一致的类型集;元组部分可以是字符串、整数或 UUID。值始终是 Python 字节字符串。
kvlayer 提供了四种基本操作。``put()`` 将一个或多个键值对写入数据库。``get()`` 检索具有已知固定键的键值对。``scan()`` 检索键范围内的键值对。``delete()`` 删除特定键。
一个最小的 kvlayer 应用程序看起来像:
```python
import argparse
import kvlayer
import yakonfig
parser = argparse.ArgumentParser()
yakonfig.parse_args(parser, [yakonfig, kvlayer])
kvl = kvlayer.client()
kvl.setup_namespace({'table': (str,)})
# 写入值
kvl.put('table', (('foo' ,), 'one'), (('bar',), 'two'))
#
在 kvl.get('table', ('foo',)) 中检索 k,v 的值:
assert k == ' foo'
print v
#
在 kvl.scan('table', (('a',), ('e',))) 中扫描 k,v 的值:
print k
print v
#
在 kvl.scan_keys 中扫描 k 的键('table', (('e',), ('z',))):
print k
# 删除值
kvl.delete('table', ('foo',))
```
其他说明
----------
请参阅[使用 saltstack 对 Accumulo 进行测试](accumulo-tests.md) 的详细信息。
对于吞吐量测试,请参阅 [kvlayer_throughput_tests](https://github.com/diffeo/kvlayer/blob/0.4.5/kvlayer/tests/test_throughput.py)。
例如,使用各种单节点 EC2 实例,随机
读取/写入会遇到以下速率:
| 工人数 | 存储类型 | 读取 MB/秒 | 写入 MB/秒 | |
|-------------|-------------|-------------|------ --------|---|
| 100 | 雷迪斯 | 99.6 | 57.3 |m1.xlarge |
| 50 | 雷迪斯 | 93.7 | 56.5 |m1.xlarge |
| 25 | 雷迪斯 | 66.9 | 33.8 |m1.xlarge |
| 80 | 后勤 | 34.2 | 14.4 |m1.中 |
| 50 | 后勤 | 33.1 | 14.1 |m1.中 |
| 25 | 后勤 | 30.1 | 13.7 |m1.中 |
| 100 | 累积 | 17.2 | 13.6 |m1.大 |
| 50 | 累积 | 21.9 | 16.0 |m1.大 |
| 25 | 累积 | 24.7 | 16.6 |m1.大 |
TODO:收集更多统计数据。