处理数据集合的“最佳实践”

“除了实现一个Collection class之外,永远都不要使用for循环来处理数据。”

这是我们在这个系列中,始终围绕的一个主题。无论你从任何来源获得了原始数据,当你要对它们加工处理时,你都不应该使用原始的for循环

就如同我们已经看到过的一些场景一样:

  • 当你逐个处理时,你需要的是each
  • 当你转换元素生成新的集合时,你需要的是map
  • 当你要对集合中的元素进行过滤时,你需要的是filter
  • 当你合并集合时,你需要的是merge
  • 当你需要去重时,你需要的是unique

总之,每当你需要对数据进行加工处理的时候,你都可以采用一个或多个high order function组合起来帮你完成任务。而当你这样做之后,你的代码就会变得更加简洁、易懂并且易于测试和维护。

PS, 所谓的high order function,就是把一个函数当作参数的函数。它最大的好处,就是可以帮助我们重用那些在过程式编程中无法重用的代码。

【摘自:https://www.boxueio.com/series/do-not-loop-again/ebook/115】

Nginx优化——减少内存占用

通过修改php-fpm启动数量,可以控制对内存的占用。

修改php-fpm.conf文件:

【参考:】

https://www.douban.com/note/315222037/

www.4wei.cn/archives/1002061

 

wordpress使用阿里云OSS功能

Aliyun OSS support plugin for wordpress (ver: 2.0)


前文接 基于阿里云OSS的WordPress远程附件支持插件——阿里云附件(Aliyun Support)(修订版)

随着使用,发现这个插件有几个比较严重的问题,改动中代码结构也稍显混乱,于是花了点时间完全重写了这个插件。
继续阅读“wordpress使用阿里云OSS功能”

数据库扩展(三)——主从复制&读写分离PK垂直划分&水平划分

  • 数据库的业务请求逻辑代码调整:

若使用垂直/水平划分,则需要根据不同的操作调整要处理的数据库链接。

若使用主从复制、读写分离,无需修改原有的数据库逻辑代码,只要使用“数据库反向代理”(mysql proxy)即可,如下图:屏幕快照 2015-08-11 下午2.34.34

  • 处理正在提供服务的数据库的数据的复杂度及耗时时长:

若使用水平划分,为了调整原有数据以适配现有的存储方式,需要对原始数据表中的数据做一次遍历,并按照水平划分规则插入到新的数据表中。(解决办法:在最初开始建立单机数据库的时候就对数据进行分表处理,即下图中的四张数据表user、log_0、log_1、log_2可以存在同一数据库中,当数据量达到一定量后,只做“垂直划分”即可。)

  • 多表操作:

垂直/水平划分后的数据库不能做多表操作。垂直划分后,一个数据库中只有一张表,自然不支持多表操作;水平划分后,即使同一数据库中存在多张表,但因水平划分后的数据表存储的是该表结构的部分数据,这会使得多表操作的结果会出现与预期不一致现象。

总结:

数据库的划分没有统一的方法,需要根据自己的业务特点来定制合适的数据库配置方式。

摘自:

机械工业出版社《微信公众平台应用开发实战》 钟志勇 著

电子工业出版社 《构建高性能Web站点》 郭欣 著

web性能优化

    • web服务器的选用

      Nginx。部分数据统计,Nginx可以保持10000个没有活动的链接,只占2.5MB内存,搭配epoll时可维护近50000个并发链接;Apache一旦达到200个进程,请求响应速度会变很慢。

    • 使用内存数据库

      Redis > Memcached。相比Memcached,Redis有以下优点:

      ①不仅支持简单的key/value类型数据,同时还提供list、set、zset、hash等数据结构的存储;

      ②支持数据的备份,即master-slave模式的数据备份;

      ③支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载使用。

继续阅读“web性能优化”

mysql in 子查询 效率慢 优化

我的阅读心得:尽量用join 代替in子查询,可提高查询速度,但前提是查询字段中没有使用distinct关键词,否则适得其反!

原文:

现在的CMS系统、博客系统、BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下。但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久!百思不解(后来终于解决),我的表结构是下面这样的,文章只有690篇。

文章表article(id,title,content)
标签表tag(tid,tag_name)
标签文章中间表article_tag(id,tag_id,article_id)
其中有个标签的tid是135,我帮查询标签tid是135的文章列表
用以下语句时发现速度好慢,我文章才690篇
select id,title from article where id in(
select article_id from article_tag where tag_id=135
)
其中这条速度很快:select article_id from article_tag where tag_id=135
查询结果是五篇文章,id为428,429,430,431,432
我用写死的方式用下面sql来查文章也很快
select id,title from article where id in(
428,429,430,431,432
)
我在SqlServer中好像不会这样慢,不知MySQL怎样写好点,也想不出慢在哪里。

后来我找到了解决方法:

select id,title from article where id in(
select article_id from (select article_id from article_tag where tag_id=135) as tbt
)

继续阅读“mysql in 子查询 效率慢 优化”