给Django用户的SQLAlchemy介绍

SQLAlchemy是什么?

SQLAlchemy的官网上写着它的介绍文字:

    SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives
application developers the full power and flexibility of SQL.
   

SQLAlchemy 是一个非常强大的ORM和数据库工具,但是它庞大的文档和复杂的功能总是让很 多人望而生畏。而Django的ORM相对来说就让很多人觉得简单实用。

事实上,SQLAlchemy其实也没有那么复杂,光使用它一些比较高级的功能其实并没有比 使用Django ORM复杂多少,而它丰富的功能则能让你在遇到更复杂的问题时处理起来得心应手。

uwsgi日志慢请求分析器:uwsgi-sloth

uwsgi-sloth 是由我开发的一个分析uwsgi日志的工具, 主要的功能是通过分析uwsgi日志里面的请求处理时间来生成慢请求报表,为你在优化uwsgi app性能时提供帮助。

目前支持针对uwsgi日志文件生成 单个静态报表文件 或者实时分析日志来生成 实时报表

效果图预览:

https://github.com/piglei/uwsgi-sloth/raw/master/uwsgi-sloth-screenshot.png

如果你的站点跑在uwsgi下面,而且没有成熟的性能监控系统,那uwsgi-sloth简直就是为你量身定制。

PostgreSQL的MVCC并发处理
原文: https://devcenter.heroku.com/articles/postgresql-concurrency
翻译: piglei

Postgre数据库的很大的卖点之一就是它处理并发的方式。我们的期望很简单:读永远不阻塞写,反之亦然。Postgres通过一个叫做 多版本并发控制(MVCC) 的机制做到了这一点。这个技术并不是Postgres所特有的:还有好几种数据库都实现了不同形式的MVCC,包括 Oracle、Berkeley DB、CouchDB 等等 。当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要。它事实上是复杂问题的一种非常优雅和简单的解法。

MVCC如何工作

在Postgres中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的事务不仅仅是被 BEGIN - COMMIT 包裹的一组语句,还包括单条的insert、update或者delete语句。当一个事务开始时,Postgrel递增XID,然后把它赋给这个事务。Postgres还在系统里的每一行记录上都存储了事务相关的信息,这被用来判断某一行记录对于当前事务是否可见。

举个例子,当你插入一行记录时,Postgre会把当前事务的XID存储在这一行中并称之为 xmin 。只有那些*已提交的而且 xmin` 比当前事务的XID小的记录对当前事务才是可见的。这意味着,你可以开始一个新事务然后插入一行记录,直到你提交( COMMIT )之前,你插入的这行记录对其他事务永远都是不可见的。等到提交以后,其他后创建的新事务就可以看到这行新记录了,因为他们满足了 xmin < XID 条件,而且创建哪一行记录的事务也已经完成。

对于 DELETE UPDATE 来说,机制也是类似的,但不同的是对于它们Postgres使用叫做 xmax 的值来判断数据的可见性。这幅图展示了在两个并发的插入/读取数据的事务中,MVCC在事务隔离方面是怎么起作用的。

在Django中实现一个高性能未读消息计数器

计数器(Counter)是一个非常常用的功能组件,这篇blog以未读消息数为例,介绍了在 Django中实现一个高性能计数器的基本要点。

故事的开始:.count()

假设你有一个Notification Model类,保存的主要是所有的站内通知:

    class Notification(models.Model):
    """一个简化过的Notification类,拥有三个字段:

    - `user_id`: 消息所有人的用户ID
    - `has_readed`: 表示消息是否已读
    """

    user_id = models.IntegerField(db_index=True)
    has_readed = models.BooleanField(default=False)
   

理所当然的,刚开始你会通过这样的查询来获取某个用户的未读消息数:

Python下的苹果推送服务(APNS)模块选择

APNS 是苹果为IOS设备提供的推送服务,全称是(Apple Push Notification service)。 如果你有接触移动互联网相关的开发的话,应该对它很熟悉。

接下来我会给大家简单介绍一下Python下的一些APNS相关的模块以及其特点。

模块介绍

PyAPNs

项目地址: https://github.com/djacobs/PyAPNs

PyAPNs是我最早使用的APNS模块,它应该是我要介绍的所有模块里面最简单的,最新的源码 只有384行,实现了APNS的基本功能,包括发送推送、使用Frame群发推送、feedback 接口等。

它的所有验证都是在客户端做的,比如每一个Payload不超过256字节。