Browse Month: 四月 2017

架构

架构

《亿级流量网站架构核心技术》

11 多级缓存

缓存涉及到的问题: 缓存算法,缓存更新,原子性,缓存崩溃与快速恢复

如何缓存数据

多级缓存,维度化缓存与增量缓存,热点缓存问题

分布式缓存与负载均衡

分布式缓存

热点数据与更新缓存

单机全量缓存

更新缓存与原子性

使用队列或者分布式锁

缓存崩溃与快速修复

取模/一致性哈希

快速恢复

12 连接池线程池详解

池化的目的是通过复用技术提升性能

对象池:通过复用对象从而减少创建对象,垃圾回收的开销

连接池(数据库连接池,redis 连接池,http 连接池):通过复用tcp 链接来减少创建和释放连接的时间来提升性能

数据库连接池

HTTPClient 连接池

线程池

mongodb

mongodb: 事务

MongoDB 写操作的原子性是在document 级别,即使修改的是文档中的内嵌部分,写锁的级别也是document上。

当一个写操作要修改多个文档,每个文档的修改是原子性的。整个的写操作并不是原子性的,它可能和其他写操作产生交织。

$isolated 隔离操作符来限制写操作,让它不与其他写操作交织。 不隔离性能更高,但是会产生数据的不确定性,隔离写操作,事务性更好。

隔离写操作

$isolated 操作符可以隔离写操作,在一个写操作要更新多个文档,它能防止其他进程与本次写操作交错。直到这个写操作完成,其他进程才能写。

$isolated 并不是一个事务,写过程中发生错误时,MongoDB 不会回滚已经写的数据,且$isolated 不能在分片集群上工作。

类事务语法

MongoDB 并不支持事务特性,这个特性需要程序员实现。

MongoDB 中提到唯一索引,和Update if Current,用于解决并发控制问题。

参考

mongodb

mongodb: 聚合

aggregate() 方法对数据进行聚合,aggregate() 接收一个步骤数组成为它的参数,每个步骤描述对数据处理的操作。

db.collection.aggregate( [ <stage1>, <stage2>, ... ] )

分组统计

$group 操作符用于分组操作

db.restaurants.aggregate(
   [
     { $group: { "_id": "$borough", "count": { $sum: 1 } } }
   ]
);
  • $group 操作符中,使用_id 来说明分组的key,key 由 $+字段名 组成。
  • $sum 操作符计算每个分组的文档数

结果集如下:

{ "_id" : "Staten Island", "count" : 969 }
{ "_id" : "Brooklyn", "count" : 6086 }
{ "_id" : "Manhattan", "count" : 10259 }
...

过滤分组

$match 操作符过滤文档


db.restaurants.aggregate(
   [
     { $match: { "borough": "Queens", "cuisine": "Brazilian" } },
     { $group: { "_id": "$address.zipcode" , "count": { $sum: 1 } } }
   ]
);

$macth 限定查询 borough 字段值为 "Queens" 并且 cuisine 字段值为 "Brazilian" 的所有文档。然后$group 分组统计文档数。

结果集如下:

{ "_id" : "11368", "count" : 1 }
{ "_id" : "11106", "count" : 3 }
{ "_id" : "11377", "count" : 1 }
...

参考