rv-xw 涉及点

  • nginx常用模块

http_proxy  这个模块实现的是nginx作为反向代理服务器的功能

nginx-http-footer-filter  在响应请求文件底部追加内容

http_ssl_module 配置https

ngx_lua 支持Lua语言

ngx_http_log_module  定义访问日志格式

ngx_http_referer_module 防盗链

  • nginx常用配置

upstream backend  设定负载均衡后台服务器列表

client_max_body_size  允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值

server 虚拟主机配置

worker_processes 定义了nginx对外提供web服务时的worker进程数,不确定时,可设置为可用的CPU内核数

worker_rlimit_nofile  表示worker进程最多能打开的文件句柄数,设置等同于liunx系统ulimit设置为优

location  配置nginx自己处理的静态文件,不请求后台的tomcat

worker_connections 每一个worker进程能并发处理(发起)的最大连接数  

allow/deny  允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配

  • nginx最大连接数与cpu的关系

worker_processes:表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;

上面表示两种设置方法,比如

方法一:worker_processes auto;
  表示设置服务器cpu核数匹配开启nginx开启的worker进程数
  查看cpu核数:lscpu、cat /proc/cpuinfo

方法二:nginx设置cpu亲和力
   worker_processes 8;
 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推

worker_cpu_affinity:表示开启八个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核,以此类推。
这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下午切换带来的资源浪费

如果服务器cpu有限
比如:2核CPU,开启2个进程,设置如下
worker_processes     2;
worker_cpu_affinity 01 10;

比如:2核CPU,开启4个进程,设置如下
worker_processes     4;
worker_cpu_affinity 01 10 01 10;

worker_rlimit_nofile 65535;

这个参数表示worker进程最多能打开的文件句柄数,基于liunx系统ulimit设置

查看系统文件句柄数最大值:ulimit -n
注意:Linux一切皆文件,所有请求过来最终目的访问文件,所以该参数值设置等同于liunx系统ulimit设置为优

  • nginx如何配置https

详见:http://blog.csdn.net/weixin_35884835/article/details/52588157

使用ssl模块配置同时支持http和https并存:

一,生成证书

二,配置nginx

三、受浏览器信任的StartSSL免费SSL证书

四、项目需要,将访问目录 \services\ 由http访问 重定向到 https (解决方法:nginx rewrite 加上 location 方式实现)

五,配置结束上传以后用nginx -t 测试下配置无误 就reload一下nginx服务 检查443端口是否在监听

  • linux 如何查看cpu占用最高的的进程
top
  • 编写sql的良好实践
摘自《阿里巴巴Java开发手册终极版v1.3.0.pdf》:
  1. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
  2. 数据订正时,删除和修改记录时,要先select,避免出现误删除,确认无误才能执行更新语句。
  3. 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
  4. in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。
  5. 不要使用count(列名)或count(常量)来替代count(*),因为count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。
  6. 使用ISNULL()来判断是否为NULL值,因为ULL与任何值的直接比较都为NULL。
  7. 不得使用外键与级联,一切外键概念必须在应用层解决。
个人:
  1. 在生产上查询DB时,尽量限定好查询范围,尽量不要使用count(*)、sum(*),若确实要用,请带好查询条件
  2. 查询条件尽量命中索引
  3. 避免不恰当的使用“SELECT *”,因为若表字段较多,则可能在执行时性能较差
  4. 避免在本地谓词的列上使用复杂表达式,如不要用YEAR(Date) > 2004,改为Date > ‘ 2004-12-31 ’
  • http长连接、短连接的优缺点
长连接
优点:节省较多的TCP建立和关闭的操作,减少浪费节约时间(TCP建立连接要3次握手,关闭连接要4次握手)。
缺点:存活功能的探测周期太长在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,随着客户端连接越来越多,server早晚有扛不住的时候。
适用场景:长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况
短连接
优点:对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
缺点:但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。(TCP建立连接要3次握手,关闭连接要4次握手)
适用场景:WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,若每个用户都占用一个连接,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连接好。
  • mysql的常用配置参数(mysql配置文件)
default-character-set:mysql服务器默认字符集设置
log-bin:指定二进制日志文件名称,用于记录对数据造成更改的所有查询语句
sync-binlog:指定多少次写日志后同步磁盘
general-log:是否开启查询日志记录
general_log_file:指定查询日志文件名,用于记录所有的查询语句
slow-query-log:是否开启慢查询日志记录
slow_query_log_file:指定慢查询日志文件名称,用于记录消耗时间较长的查询语句
long_query_time:设置慢查询的时间,超过这个时间的查询语句才记录日志
  • union 和 union all 的相同点与区别点

相同点:都是对两个结果集进行并集操作

区别:

  1. Union:不包括重复行,同时进行默认规则的排序;
  2. Union All:包括重复行,不进行排序;

对于UNION来说,交换两个SELECT语句的顺序后结果仍然是一样的,这是因为UNION会自动排序。而UNION ALL在交换了SELECT语句的顺序后结果则不相同,因为UNION ALL不会对结果自动进行排序。

  • MyBatis的$与#的区别?

#相当于对数据 加上 双引号,$相当于直接显示数据


1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
  
3. #方式能够很大程度防止sql注入。
  
4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
  
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

  • 常用的Linux命令:查网络连接、查CPU、查内存、查磁盘空间

查看系统文件句柄数最大值:ulimit -n

查看网络连接:netstat

查内存:free

磁盘空间:df -h  

  • HashMap的数据结构
HashMap采取数组加链表的存储方式来实现。亦即数组(散列桶)中的每一个元素都是链表
  • ConcurrentHashMap的锁机制 ;

ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。

ConcurrentHashMap没有将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制实现更大程度的共享。这种细粒度的加锁机制体现在ConcurrentHashMap划分的Segment数组,Segment数组上各Segment元素代表了粒度更细的锁,Segment继承自ReentrantLock可重入锁
ConcurrentHashMap这种基于分组Segment并加锁的策略可在高并发的环境下获得更高的吞吐量。

  • JDK1.7 、JDK1.8 新特性
JDK1.7:
  1. 泛型实例的创建可以通过类型推断来简化
  2. try-with-resources 语句自动关闭相关的资源

JDK1.8:
  1. Lambda
  2. 流API:新的java.util.stream包提供了“支持在流上的函数式风格的值操作”
  3. 反射和annotation的改动
  • lambda表达式使用示例
1、使用lambda表达式替换匿名类
实现Runnable接口是匿名类的最好示例。用() -> {}代码块替代了整个匿名类,比如:
// Java 8之前:
new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Before Java8, too much code for too little to do");
    }
}).start();

//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

2、使用lambda表达式对列表进行迭代
// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
    System.out.println(feature);
}
// Java 8之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
 
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features.forEach(System.out::println);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值