高并发项目时所需要注意的点

一、热点数据缓存(Redis等)

针对热点静态数据,用户访问量高的情况。可以将数据存储在redis等nosql存储里的方法,对热点数据进行缓存操作。程序设计上可以理解为

data=redis.get

if(data==null){

    data=db.get

    redis.put(data)

}

return data

Redis一个坑点

Redis默认是只能本机访问的,所以需要在redis的Config文件当中将bing 127.0.0.1注释掉。

但是在新版本的redis中,还需要关闭它的safe_mode才能真正实现局域网访问。

二、事务优化

在程序事务传播时,尽量减少事务引起的行级锁持有时间(如update操作)。将可能出现的异常封装成Runtime异常,这样在事务出现问题时,可以将该事务所涉及到的所有操作进行rollback,保证数据的一致性。例如:将insert操作做在update之前。

2.1 深度优化(存储过程)

针对数据库服务不在本地的情况,即可能由于网络延迟产生的存储过程缓慢情况。

可以采用将事务性流程放在数据库端执行的方式。但在互联网公司当中,这种操作并不普遍,还是采用正常事务优化的方式多一些。

三、热点页面静态访问(CDN)

将热点数据或其他可以做成静态界面的数据存放在CDN当中,减少服务器压力。

页面静态化存储中一个坑点

由于过去的页面手动渲染函数为

SpringWebContext ctx = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(),
model.asMap(), applicationContext);
// 手动渲染
html = thymeleafViewResolver.getTemplateEngine().process("这里写html页面名称", ctx);

但是该SpringWebContext在Spring5的包下没有了,方法改为

WebContext ctx = new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
// 手动渲染
html = thymeleafViewResolver.getTemplateEngine().process("这里写html页面名称", ctx);

四、分布式Session(其中一个解决办法)

由于高并发服务通常有多台服务器,存在一个Session同步的问题。

  • 用户登录后生成一个Token
  • 将该Token与用户id存放到一个第三方缓存当中,如redis
  • 在用户访问时,首先去redis查找是否有相应redis记录。即分布式session