高并发有很多方面 主要从服务器 数据库 和缓存方面解决
一 服务器
1‘搭建集群
2 你nginx负载均衡 nginx实现负载均衡有四种方法
1)轮询算法 (就是每个服务器交替处理)
2)weight 权重方法 默认权重为1 根据服务器的运行速度分配权重
3)ip_hash 根据用户的ip地址 给服务器设置相应地址 不同地区的访问相应地区的服务器
4) 根据数据的访问时间 空闲服务器优先选择
3 cdn 节点
cdn网络节点 可以减少用户对主服务器的访问 在cdn中会有大量的静态资源以及不常改变的资源数据 cdn会有定时一段时间后向主服务器更新资源信息
二,数据库
1 优化数据库 添加索引 索引分为普通索引(加速查询)唯一索引 (加速查询 而且列值为唯一值 可以为null) 主键索引( 加速查询 列值唯一 但不可以为null 每个表只能一个主键索引) 组合索引 多列值组成一个索引 专门用于组合查询搜索 其效率大于索引合并 全文索引 对文体的内容进行分词,进行搜索
在对数据表进行查询时尽量不对null进行查询 还有少用 !<>查询 这会是索引失效 进行全局搜索
2 mycat 中间件对数据库进行读写分离 一般至少两个 主负责写 从 负责读 如果从宕机可以重启 再重新在主里复制 如果主宕机要先把从升级为主在重启
3 数据库的分库分表 同库分表 所有表在同一个数据库中 名字不能相同 要修改表面 优点由于都在同一数据库 公共表不用复制 缺点 数据库的cpu 文件IO 内存 网络IO的瓶颈都无法解决 只能降低表中的数据记录数。 异库分表 因为库不同 所有名字可以一样 优先 可以解决 cpu 内存 文件IO 网络IO 的瓶颈问题 而且表名相同 处理简单 缺点 公共表在所有的分表都要使用 所以要进行同步复制 修改也要同步
三、缓存
redis是最常用的缓存 把项目中经常被访问的书籍存入缓存 减少对数据库的访问
redis 的持久话可以分为 RDB快照(默认缓存)和AOF RDB快照优势是适合文件备份 例如我们可以redis设定为晚上使用缓存 数据 可能会丢失数据
save 60 1000,如果我在60秒内只更新了800条数据,然后系统崩溃了,那么这800条数据就没了
第二:
大数据量的时候,做RDB,redis服务会暂停近1分钟(20g的物理内存,redis里面有13g的数据)!
这个就是redis持久化的时候的服务暂停现象(为啥?创建子进程,子进程的工作不需要资源么?)。
一种方式就是,我关闭自动快照的设置,就是不要写save 10 1000这样的命令,而是在系统不忙的时候发送bgsave,
至少我能控制什么时候系统发生停顿么。再或者我发送save,这个虽然会停顿,但是因为不用创建子进程有时候也比较快。
aof优势在于:就算出问题了,最多丢失1秒内的更新数据
aof的劣势:
aof文件的体积可能会很大(可能比快照文件还大),另一方面,系统重启的时候回从aof里读命令
,如果aof文件太大,读命令也就要还很久
静态页面 freemarker 对于一些不经常改变的页面 而且经常访问的页面 我可以做静态化
freemarker简单用法
assign可以在模板定义 然后直接使用
<#assign linkman="你好"> 联系人:${linkman}
<#include "head.ftl">引用别的模板
<#if success=true> 这里等号是一个=也可以== 都可以
这个success是后面穿过来的变量 是可变的
<#else>
</#if>
<#list goodslist as goods> 循环遍历goodslist
${goods_index }固定的取索引的方法
${goods.id}
</#list>
${goodslist?size} 取
<#assign text="{'bank':'工商银行','电话':'123455666'}">
<#assign text.bank>错误写法 因为test是一个值
<#assign data=text?eval>
${data.bank}
map.put("today",new Date());
${today?date}当前日期 2018-12-29
${today?time} 当前时间 19:41:32
当前日期+时间 ${today?datetime} 2018-12-29 19:41:32
日期格式化 :${today?string('yyyy年MM月')}
Map.put ("point",143254243)
${point} 输出143,254,243(怎么去点点呢?)
${point?c} 输出 为 143254243
判断aaa是否存在
<#if aaa??>
aaa存在
${aaa}
<#else>
aaa不存在
</#if>
这种方法麻烦
${bbb!''} 半段bbb是否存在
${bbb!'啊'} 半段bbb是否存在 不存在页面显示“啊”