使用Sharding Counters技术提升GAE的计数性能
2009 3 17 01:52 PM 2917次查看
分类:Google App Engine 标签:Google App Engine
由于代码已在文章中列出,这里就只说其思想了。
总体上来说,GAE的数据库适合读,而不是写(约每秒可以进行5次写操作)。
在《Brett Slatkin gave in his Google I/O talk》这个视频里,有提到读写的差异(非常夸张)。
最重要的是写是个事务,而读不是,所以无需等待。
在使用count方法时,需要遍历所有符合条件的实体,其算法时间复杂度为O(N)。
如果将这个数据保存在数据库中,则时间复杂度就能达到O(1)。
考虑到GAE的数据库是分布式的,同时改多个不同的实体,比只操作一个实体要更快;所以我们可以将counter用名字+序号作为key_name,然后随机选择一个序号进行写入。这样一来,在多个用户同时操作时,因为改写的实体不同,所以相互之间不需要等待,便使得时间复杂度降低为O(1/N)。
这种方式的缺点是读取时需要把所有计数器都取出来,进行累加运算。但前面提到了,读比写要快,而且计数器是个很小的实体,所以并不太影响性能。
最后,为了减少数据库操作,我们还需要用到memcache,也别忘了用run_in_transaction方法来来保证数据库的计数器正确写入。
0条评论 你不来一发么↓