资料
  • 资料
  • 专题
[完结12章]基于C++从0到1手写Linux高性能网络编程框架(附电子书)
推荐星级:
类别: 软件/EDA/IP
时间:2023-12-25
大小:2.57KB
阅读数:145
上传用户:开心就很好了
查看他发布的资源
下载次数
4
所需E币
0
ebi
新用户注册即送 300 E币
更多E币赚取方法,请查看
close
资料介绍
今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!

Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。

Linux 提供三个「点分十进制字符串表示的 IPv4 地址和用网络字节序整数表示的 IPv4 地址之间转换」的接口
 public GraceJSONResult doLogin(HttpServletRequest request,
                                   HttpServletResponse response,
                                   RegisterLoginBO registerLoginBO,
                                   BindingResult result) {

    // 判断BindingResult是否保存错误的验证信息,如果有,则直接return
    if (result.hasErrors()) {
        Map<String, String> errorMap = getErrors(result);
        return GraceJSONResult.errorMap(errorMap);
    }

    // 获得前端传来的基本信息
    String smsCode = registerLoginBO.getSmsCode();
    String mobile = registerLoginBO.getMobile();

    // 0. 校验验证码是否匹配
    String redisSMSCode = redis.get(MOBILE_SMSCODE + mobile);
    if (StringUtils.isBlank(redisSMSCode) || !redisSMSCode.equalsIgnoreCase(smsCode)) {
        return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
    }

    return GraceJSONResult.ok();
}
用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。
private AppUser getUser(String userId) {
    // 1. 查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库
    String userJson = redis.get(REDIS_USER_INFO + ":" + userId);
    AppUser user = null;
    if (StringUtils.isNotBlank(userJson)) {
        user = JsonUtils.jsonToPojo(userJson, AppUser.class);
    } else {
        user = userService.getUser(userId);
        // 2. 由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis
        // 哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以
        // 基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注
        redis.set(REDIS_USER_INFO + ":" + userId, JsonUtils.objectToJson(user), 1);
    }
    return user;
}
虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。
@Override
public GraceJSONResult list(String articleId, Integer page, Integer pageSize) {

    if (page == null) {
        page = COMMON_START_PAGE;
    }
    if (pageSize == null) {
        pageSize = COMMON_PAGE_SIZE;
    }

    PagedGridResult gridResult = 
                commentPortalService.queryArticleComments(articleId, 
                                                    page, 
                                                    pageSize);
    return GraceJSONResult.ok(gridResult);
}
生成html的步骤分为以下几步:
定义freemarker生成的html位置
配置freemarker基本环境
获得ftl模板
获得动态数据
融合ftl和动态数据,并输出到html
@Value("${freemarker.html.target}")
private String htmlTarget;

@GetMapping("/createHTML")
@ResponseBody
public String createHTML(Model model) throws Exception {

    // 0. 配置freemarker基本环境
    Configuration cfg = new Configuration(Configuration.getVersion());
    // 声明freemarker模板所需要加载的目录的位置
    String classpath = this.getClass().getResource("/").getPath();
    cfg.setDirectoryForTemplateLoading(new File(classpath + "templates"));

//        System.out.println(htmlTarget);
//        System.out.println(classpath + "templates");

    // 1. 获得现有的模板ftl文件
    Template template = cfg.getTemplate("stu.ftl", "utf-8");

    // 2. 获得动态数据
    String stranger = ;
    model.addAttribute("there", stranger);
    model = makeModel(model);

    // 3. 融合动态数据和ftl,生成html
    File tempDic = new File(htmlTarget);
    if (!tempDic.exists()) {
        tempDic.mkdirs();
    }

    Writer out = new FileWriter(htmlTarget + File.separator + "10010" + ".html");
    template.process(model, out);
    out.close();

    return "ok";
}

版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或 联系我们 删除。
相关评论 (下载后评价送E币 我要评论)
没有更多评论了
  • 可能感兴趣
  • 关注本资料的网友还下载了
  • 技术白皮书