论坛凯发k8国际首页 java企业应用论坛

[完结12章]基于c 从0到1手写linux高性能网络编程框架(附电子书) -凯发k8国际

浏览 252 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2023-12-25  
学习地址1:https://pan.baidu.com/s/1aisz1k_2uwyab41st1hxfa 提取码:t2gy
学习地址2:https://share.weiyun.com/xnelqdhp 密码:bdmum6


今天我将给大家讲解基于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 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";
}
 
global site tag (gtag.js) - google analytics
网站地图