基于磁盘的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_missingtrue

LMDB

LMDB的性能可以优于LevelDB,我们正在考虑将来将其作为默认后端。

选项

我们使用py lmdb作为lmdb后端。所有可用选项都是lmdb.environment的参数。 我们建议您提前考虑,并根据需要更改映射大小参数-这是磁盘上lmdb数据库文件的最大大小。

LMDB的当前默认选项是:

  • 路径:与--dir选项的值相同
  • 地图大小1073741824(1GB)
  • 映射异步
  • writemaptrue
  • readaheadfalse
  • 元同步

内存

这是实验性的,不会持续到磁盘上。创建它是为了有一个比较持久后端的基线。

选项

无。

支持的命令

<表><广告>命令签名 键入< /广告><正文>命令*服务器数据库大小服务器水槽服务器冲洗数据库服务器保存服务器删除键[键…]按键转储键按键存在密钥[密钥…]按键过期密钥ttl**按键按键模式按键重命名密钥newkey按键还原密钥ttl序列化值[替换]***按键TTL键按键< >键入键按键认证连接ping[消息]连接选择数据库连接获取密钥字符串GetRange键开始-结束字符串增量键字符串增加键增量字符串设置键值字符串SADD键值[值..]设置SCARD键设置sismember键值设置smembers键设置评估脚本numkeys[键…][参数…]脚本Zadd关键得分成员[得分成员…]排序集Zcard键排序集Z计数键最小值最大值排序集Zrange key start top[带核心]排序集zrangebyscore key min_score max_score[带核心][限制偏移计数]排序集Zrank关键成员排序集ZREM关键成员[成员…]排序集zscan键光标[匹配模式][计数]排序集zscore关键成员排序集zunionstore目的地numkeys键[键…][权重[权重…]]排序集HDEL键字段[字段…]散列hget键值散列hGetAll键散列hincrby键字段增量散列HKEYS键散列hlen键散列hset key字段值[字段值…]散列hsetnx关键字段值散列hvals值散列

脚注:

  • *命令的应答目前不兼容,它返回一个带有命令名的平面数组(不返回其arity、标志、位置或步数)。
  • **expire尚未设置密钥过期,它是一个no op命令
  • ***还原不适用于用lzf压缩的redis字符串或编码为obj_encoding_int的redis字符串;也不适用于编码为obj_encoding_intset的集,也不适用于编码为obj_encoding_ziplist的散列和排序集

DREDIS是如何实现的

最初dredis有自己的文件系统结构,但后来它被转换为使用leveldb,后者更可靠、更快(现在还有lmdb后端)。

其他项目实现的功能与dredis上提供的类似,但它们不是项目开始时yipit所需要的。他们中的一些人 依赖多个线程并损害一致性,不能实现lua脚本,或者不能正确实现排序集。我们对一些解决方案运行了dredis测试,但它们失败了(这意味着它们不完全兼容)。

类似项目:

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

  1. 确保changelog.md的顶部有所有重要更改
  2. 确保您的pypi凭证在~/.pypirc
  3. 中正确无误
  4. 运行释放
  5. 输入新版本(例如1.0.0

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如果SQL server执行计划是流式传输数据,那么调用next()时Java ResultSet对象将如何反应?   java为什么水平滚动条永远不会出现在JTable上?   java如何在Android项目中添加SDK模块   绿脚:爪哇。lang.ClassCastException:无法将障碍物投射到球投射物   xslt需要在Java1.4.2中使用SaxonB(版本9.1.0.8)方面的帮助   java Apache HTTP客户端下载SOAP响应的一部分   为Java 9计划的“过滤传入序列化数据”解决了数据反序列化安全漏洞吗?   java如何使用drools对列表中的元素进行分组   java从匿名类到lambda表达式   Java中是否有不可变的单链表实现?   java动态添加按钮以滚动查看安卓   java GAE:无法为模块http请求设置管理员登录凭据   java如何在Hibernate 5 CriteriaBuilder中使用条件条件获取计数   java如何将JSON+HAL响应解析为POJO   java如何获取计算器程序,对两个以上的数字进行加、减、乘、除   java Thymeleaf+静态资源+@ResponseBody