(转)使用异步Python 3.6和Redis编写快速应用程序
转自:http://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651374524&idx=1&sn=d289aa7aa484d0485489b9e63a56ff8a&chksm=bd2408a88a5381bea9f854376ecb96f5aab056d2dc203142df10a42b238b695e42928256b0ce&mpshare=1&scene=23&srcid=0503WYobyoHUL7QCB8Pw2K3j#rd
人们对于Python和其他解释型语言(例如:Ruby,JavaScript,PHP,Perl等等),最常抱怨的就是他们太慢了。显然,网络应用中,速度更快的语言能够实现更短的响应时间以及降低服务器的消耗。
为了解决这样的问题,Python3.4引入了asyncio模块,随后,Python3.5则为它设计了新的语法。然后,随之而来的uvloop网络库为asyncio带来了速度上的极大提升:
uvloop使得asyncio相当快。实际上,和nodejs,gevent以及任何其他Python中的异步网络架构相比,asyncio的速度至少是它们的2倍,基于uvloop的asyncio在性能上的表现已经接近于Go语言了。
在Paxos(译者注:一种基于消息传递的一致性算法)中,我们大量使用asyncio,既是因为它的性能更好,也是因为asyncio更加适合我们整体架构。我们的产品与来自不同的客户端的事务数据同步,同时,因为它是一个分布式系统,所以本质上讲,它又是异步的。
asyncio能够出色地将吞吐量最大化,但是我们也关心要减少延迟。就延迟而言,你的数据库本身会是一个主要的瓶颈。实践中,当我们使用例如合适的索引,或者固态磁盘这些最佳方法时,一个大约10ms响应时间的数据库查询被认为是效果不错的。
当然,RAM要比asyncio要快几个数量级,但是简单的"key-value"型的存储结构,并不能实现软件工程师们所常常依赖的许多特性。比如,多索引和基本类型检测是非常有用的,也最好能有像"ORDER BY","LIMIT"和"OFFSET"这些功能。
此外,Redis的性能、高级特性及其文档,已经给我们留下了非常深刻的印象。所以我们写了一个可被Redis支持的对象映射器:"subconscious",它依赖于asyncio和Redis的强大原语。使得你能以RAM的性能利用数据库,这就像是一个SQLAlchemy的精简版(不支持"JOIN"操作)。
译者注:Redis:一个key-value存储系统
译者注:SQLAlchemy:Python编程语言下的一款开源软件。提供了SQL工具包及“对象关系映射”工具,使用MIT许可证发行。
你可以如下定义一个模型(更多细节请查阅 official repo):
然后,你可以查询和使用你的这个模型:
你也会找到很多你期望在传统的ORM中有的功能。下面是如何向一个满足属性:{US, college-age, male}的用户发一个推送的过程:
译者注:ORM:对象关系映射
为了证明在实际中这个工具(subconscious)是多么强大和方便使用,我们把一个类似Pastebin的网站和大约100行代码放在了一起。
网站URL:http://52.170.82.45/
源代码:https://github.com/paxos-bankchain/pastey
我们用Microsoft Azure中最廉价的应用实例(称作F1,拥有1核处理器以及2GB的RAM)上加载和测试了这个APP,结果数据是很漂亮的:
大约41秒内发送了10000次页面请求
页面响应时间的中位数大约是19毫秒
大约22毫秒内,90%的页面做出了服务响应
Redis可以保存在磁盘上,但是对比传统的数据库,它的持久性更弱。同时,它的事务和回滚很复杂,而且对于及数据完整性,几乎没什么保证。一些常见的用例如下:
可以从日志中重播的临时数据(所以持久性不是大问题)
频繁更新的数据:写入RAM比写入磁盘要快得多
当延迟是非常重要的考虑因素时
当相同的数据被定期查询,同时数据的容量很低,以及/或者你有很充足的硬件预算时
对于低吞吐量的应用或者适用于水平缩放的应用来说,这些特性可能无法提供让人兴奋的充足的优势。但是对于高吞吐量的应用来说,延迟对它们有着不可忽略的影响,那么,这种性能的提升就存在着重大的价值。
Subconscious是使用MIT许可证发行的开源工具,所以你可以自由地在你自己的项目中使用它。
英文原文:https://eng.paxos.com/write-fast-apps-using-async-python-3.6-and-redis
译者:guoziqing
(转)使用异步Python 3.6和Redis编写快速应用程序的更多相关文章
- Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- 十一天 python操作rabbitmq、redis
1.启动rabbimq.mysql 在""运行""里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd, ...
- Python操作memcached及redis
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- 17.Python笔记之memcached&redis
作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
- Python自动化运维之17、Python操作 Memcache、Redis、RabbitMQ
一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...
- Python 之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
一.Memcached Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负债.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- Python操作MongoDB和Redis
1. python对mongo的常见CURD的操作 1.1 mongo简介 mongodb是一个nosql数据库,无结构化.和去中心化. 那为什么要用mongo来存呢? 1. 首先.数据关系复杂,没有 ...
随机推荐
- Android API之Telephony.Threads
1. Telephony.ThreadsColumns Columns for the "threads" table used by MMS and SMS. 在Telephon ...
- E325 注意 发现交换文件
git中的 交换文件应该是保持当前git的session的一种文件. git中,如果出现这个有两种原因: 1.你开了两个git客户端对同一个git仓库进行了操作.如果是这样的话,退出一个.正常退出,不 ...
- libevent终于编译通过了
在网上找了个例子,其实libevent本身带了很多测试用例,不过这是第一次编译成功,尼玛 各种高性能IO库都是在linux下的,win32果断被bs了,还好有libevent对win32支持的比较好. ...
- 阿里面试的一点感受 阿里ali片式经历和面试题
阿里面试的一点感受 <!-- [废话开始] 百度实习三个月,明天就要离职了,感觉还挺开心的,同事们都很照顾我,Boss也比较欣赏我,我很满足了.掐指一算,这大四其实也没几个月了,同事们都在感叹大 ...
- C++ map,set内部数据结构
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据.它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序.每个元素的值不能直接被改变.[重点]内部结构采用红黑树的平衡二叉 ...
- openstack网络基础
一.概述 网络虚拟化是云计算的最重要部分,本文详细讲述 Linux 抽象出来的各种网络设备的原理.用法.数据流向.您通过此文,能够知道如何使用 Linux 的基础网络设备进行配置以达到特定的目的,分析 ...
- 【MySQL】MySQL之MySQL常用的函数方法
MySQL常用函数 本篇主要总结了一些在使用MySQL数据库中常用的函数,本篇大部分都是以实例作为讲解,如果有什么建议或者意见欢迎前来打扰. limit Select * from table ord ...
- C++转型操作符
转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html 旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷, ...
- centos 6&7 升级openssh
1.查看现在的版本 # rpm -qa | grep openssh openssh-clients-6.6.1p1-22.el7.x86_64 openssh-server-6.6.1p1-22.e ...
- Debian下的crontab保存
nano编译器 ctrl+x然后y,保存退出