数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据。
收集聚合数据的常见做法是:先将各个行插入一个报告表里面,之后再通过扫描这些行来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。
之所以使用插入行的方式来存储,是因为对于大部分数据库来说,插入行操作的执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行更新却是一个速度相当慢的操作,因为这种更新除了会引起一次随机读之外,还可能会引起一次随机写。
而在Redis里面,用户可以直接使用原子的INCR命令及其变种来计算聚合数据,并且因为Redis将数据存储在内存里面,而且发送给Redis的命令请求并不需要经过典型的查询分析器或者查询优化器进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。
小结
这块让我惊讶的是一个小小的记录报告数据,并利用报告数据获取聚合数据的功能,都有这么多性能点可以考虑。Redis的INCR命令是原子性的,同时其不需要查询分析器或者查询优化器进行处理,这些都会增加性能。