基于磁盘的redis实现
dredis的Python项目详细描述
dredis:基于磁盘的redis实现
redis是一个非常棒的键值数据库,它的速度非常快,因为它在内存中。 有些人想要redis丰富的数据类型,而不必担心内存限制。对于那些 如果能提供更慢的性能并需要无限的存储空间,dredis可能是另一种选择。
警告:此项目仍处于试验阶段,它没有实现所有redis命令!
安装
请确保安装"LevelDB">"+">"+">"+"+"+"+"+"。$ pip install dredis
注意:lmdb后端不需要外部依赖。
运行
$ dredis --dir /tmp/dredis-data
要了解所有选项,请使用--help
:
$ dredis --help usage: dredis [-h][-v][--host HOST][--port PORT][--dir DIR][--backend {lmdb,leveldb,memory}][--backend-option BACKEND_OPTION][--rdb RDB][--debug][--flushall][--readonly] optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit --host HOST server host (defaults to 127.0.0.1) --port PORT server port (defaults to 6377) --dir DIR directory to save data (defaults to a temporary directory) --backend {lmdb,leveldb,memory} key/value database backend (defaults to leveldb) --backend-option BACKEND_OPTION database backend options (e.g., --backend-option map_size=BYTES) --rdb RDB RDB file to seed dredis --debug enable debug logs --flushall run FLUSHALL on startup --readonly accept read-only commands
在本地使用Docker运行DREDIS(主机上的端口6377):
$ docker-compose up
后端
它支持leveldb、lmdb和一个实验性的内存后端。
所有后端选项都应在命令行中作为--后端选项name1=value1--后端选项name2=value2传递(这些值必须与json兼容)。
水平分贝
leveldb是最简单的持久化后端,因为它不需要任何选项调整就可以让它可靠地工作。
选项
我们使用plyvel作为leveldb后端。所有可用选项都是plyvel.db的参数。
leveldb的当前默认选项是:
名称
:与--dir选项的值相同
create_if_missing
:true
LMDB
LMDB的性能可以优于LevelDB,我们正在考虑将来将其作为默认后端。
选项
我们使用py lmdb作为lmdb后端。所有可用选项都是lmdb.environment的参数。
我们建议您提前考虑,并根据需要更改映射大小
参数-这是磁盘上lmdb数据库文件的最大大小。
LMDB的当前默认选项是:
路径
:与--dir选项的值相同
地图大小
:1073741824
(1GB)映射异步
:真
writemap
:true
readahead
:false
元同步
:假
内存
这是实验性的,不会持续到磁盘上。创建它是为了有一个比较持久后端的基线。
选项
无。
支持的命令
<表><广告>脚注:
- *
命令的应答目前不兼容,它返回一个带有命令名的平面数组(不返回其arity、标志、位置或步数)。
- **
expire
尚未设置密钥过期,它是一个no op命令 - ***
还原
不适用于用lzf压缩的redis字符串或编码为obj_encoding_int
的redis字符串;也不适用于编码为obj_encoding_intset
的集,也不适用于编码为obj_encoding_ziplist
的散列和排序集
DREDIS是如何实现的
最初dredis有自己的文件系统结构,但后来它被转换为使用leveldb,后者更可靠、更快(现在还有lmdb后端)。
其他项目实现的功能与dredis上提供的类似,但它们不是项目开始时yipit所需要的。他们中的一些人 依赖多个线程并损害一致性,不能实现lua脚本,或者不能正确实现排序集。我们对一些解决方案运行了dredis测试,但它们失败了(这意味着它们不完全兼容)。
类似项目:
- https://github.com/yinqiwen/ardb
ardb
在范围上似乎是最相似的,是投稿或投稿的最佳人选。他们的排序集实现有一个负分数的错误。这是一个大型C++项目,有很多特性。
- https://github.com/qihoo360/pika
- 没有lua支持。这是一个大型C++项目,文档是中文的。这个项目看起来很稳定,被中国的大公司使用。
- https://github.com/kernelmaker/blackwidow
-
一个C++库,而不是一个像服务器一样的服务器。
- https://github.com/siddontang/ledisdb
- 类似于redis,但命令不同
- https://github.com/reborndb/qdb
- 不再支持lua,也不再维护
- https://github.com/alash3al/redix
- 不支持lua和排序集
- https://github.com/meitu/titan
- 没有lua支持,也没有足够的排序集支持
lua支持
lua通过lupa库支持。
挑战
数据一致性
我们依赖后端的一致性属性,并使用批处理/事务来保持一致性。调整后端选项可能会损害一致性(例如,lmdb的sync=false
。
群集模式和复制
不支持复制、密钥分发和群集模式。 如果需要更高的可用性,可以创建多个共享或复制磁盘的服务器(复制时可能会影响一致性)。 使用DNS路由或网络负载平衡器正确路由请求。
备份
命令save以与redis的rdb version 7(与redis 3.x兼容)相同的格式创建快照。
我们建议您在次要的dredis进程上运行save
,否则服务器将在快照期间挂起(以lmdb为后端的一致性保证更高)。
以后可能会支持命令bgsave
。
其他备份解决方案包括备份后端创建的文件。 一种简单的方法是定期备份到对象存储(如amazon s3)或使用块存储解决方案并执行定期备份(如aws ebs)。
如果从辅助进程或备份数据目录中使用save
,则不会对主服务器造成任何重大影响。
为什么是python
因为这是一种很好的语言,可以很快把事情搞定,而且每个人都很清楚这一点。 如果这成为一个有价值的项目,将对其他语言进行评估-所选语言不会对I/O瓶颈产生太大影响,但可能会带来良好的性能优势。 我们正在尝试使用cython来获得更好的性能,而不必重写c中的大块内容。
项目将很快迁移到python 3。
你没有更好的名字吗?
@andrewgross建议重新查找。这个名字只有在这个项目成功的情况下才重要,它仍然是一个实验。 另外,其他项目使用名称redisk
@nadlerjessie建议我们将dredis发音为"redis医生"。
释放DREDIS
- 确保
changelog.md的顶部有所有重要更改
释放- 确保您的pypi凭证在
中正确无误~/.pypirc
- 运行
- 确保您的pypi凭证在
- 输入新版本(例如
1.0.0
)