高并发处理的方法

高并发有很多方面   主要从服务器  数据库  和缓存方面解决

一 服务器

    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是否存在  不存在页面显示“啊”

猜你喜欢

转载自blog.csdn.net/weixin_44178762/article/details/85388579