记一下互联网术语

编程常用单词

  • tmp/temp: 临时对象
  • startAt/endAt: 开始时间/结束时间
  • prev/next: 上一个/下一个

职位

  • PM(Product Manager): 产品经理
  • AM(Account Manager): 客户经理
  • RD(Research & Develop): 研发
  • FE(Front End): 前端

指标

  • DAU(Daily Active Users): 日活跃数
  • 响应时间(RT) : 响应时间是指系统对请求作出响应的时间。
  • 吞吐量(Throughput):吞吐量是指系统在单位时间内处理请求的数量。
  • 并发用户数:并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。
  • QPS每秒查询率(Query Per Second) :每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
  • 高可用(HA):是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。而服务器的可用性是指单位时间内(通常一年),服务器可以正常工作的时间比例。(可用性=平均故障间隔/(平均故障间隔 + 故障恢复平均时间))
  • 独立访问者数量(unique visitors,UV)、页面浏览数(page views,PV)

程序员

  • RPC(Remote Procedure Call): 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。值得注意是,两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样。
  • PR 的全称是 Pull Request,经常用 Github 的同学对这个肯定很熟悉了。MR 的全称是 Merge Request,相信玩过 Gitlab 的同学都知道这个。『重点:pr 和 mr 本质上都是指合并代码请求,只是站在不同角度有不同的说法而已』
  • SEO(Search Engine Optimization),中文是“搜索引擎优化”
  • sso(Single sign-on),单点登录
  • OSS: 对象存储,OSS图片处理服务是阿里云OSS对外提供的海量、安全、低成本、高可靠的图片处理服务。您可以将原始图片上传保存在 OSS 上,通过简单的 RESTful 接口,在任何时间、任何地点、任何互联网设备上对图片进行处理。
  • CDN(Content Delivery Network): 内容分发网络
  • WAF(Web Application Firewall): Web 应用防火墙
  • 负载均衡:制定策略做资源的分配
  • uuid: Universally Unique Identifier,通用唯一识别码
  • dto: data transfer object,数据传输对象
  • dao: data access object,数据访问对象
  • OOM: Out of memory,内存溢出
  • DTS: 数据传输服务DTS(Data Transmission Service)支持RDBMS、NoSQL、OLAP等数据源间的数据交互,集数据同步、迁移、订阅、集成、加工于一体,助您构建安全、可扩展、高可用的数据架构。

旅游相关

  • 在线旅游(OTA,全称为Online Travel Agency),是旅游电子商务行业的专业词语。OTA是在线旅行社,主要是各种旅游产品的代理商,如携程,而平台主要提供旅游信息搜索,为顾客提供旅游代理商,其中也包括OTA在内的旅游产品信息,如爱彼迎。
  • 房源静态信息:酒店的名称,地址,电话,房型等
  • 房源动态信息:价格、房量
  • 房态:入住、预离(离店日期为今天)、在住、远期(入住日期为今天之后)、离店、关停/软装(关停:暂停出售,软装:装修)
  • 酒店会有保留房,民宿是整租
  • 及时确单
  • PMS: 酒店物业管理系统(Property management System,简称PMS)
  • ARI数据:酒店动态数据,如房价、房态和房量
  • CRS: 酒店中央预订系统(Common Reporting Standard,简称CRS)

特殊编码

\u2005:特殊的空格字符,群里@人时高亮需要用到

Go Json 技巧

omitempty

忽略 struct 空字段,当字段的值为空值的时候,它不会出现在JSON数据中.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Email    string `json:"email"`
    Password string `json:"password,omitempty"`
}

func main() {
    jsonByte, _ := json.Marshal(User{Email: "7@qq.com"})
    fmt.Println(string(jsonByte))
}

// 输出结果
// 不带 omitempty 的输出结果:{"email":"7@qq.com","password":""}
// 带 omitempty 的输出结果:{"email":"7@qq.com"}

临时合并两个struct

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    type BlogPost struct {
        URL   string `json:"url"`
        Title string `json:"title"`
    }
    type Analytics struct {
        Visitors  int `json:"visitors"`
        PageViews int `json:"page_views"`
    }

    blog := BlogPost{URL: "http://www.x.com", Title: "title"}
    analytics := Analytics{Visitors: 100, PageViews: 200}

    jsonByte, _ := json.Marshal(struct {
        *BlogPost
        *Analytics
    }{&blog, &analytics})

    fmt.Println(string(jsonByte))

    // 输出结果
    // {"url":"http://www.x.com","title":"title","visitors":100,"page_views":200}
}

一个json切分成两个struct

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    type BlogPost struct {
        URL   string `json:"url"`
        Title string `json:"title"`
    }
    type Analytics struct {
        Visitors  int `json:"visitors"`
        PageViews int `json:"page_views"`
    }

    var (
        blog      BlogPost
        analytics Analytics
    )

    json.Unmarshal([]byte(`{"url":"http://www.x.com","title":"title","visitors":100,"page_views":200}`), &struct {
       *BlogPost
       *Analytics
    }{&blog, &analytics})

    fmt.Println(blog)
    fmt.Println(analytics)

    // 输出结果
    // {http://www.x.com title}
    // {100 200}
}

数字以字符串形式输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import (
    "encoding/json"
    "fmt"
)

type Test struct {
    Email string `json:"email"`
    Field int    `json:"field,string"`
}

func main() {
    jsonByte, _ := json.Marshal(Test{Email: "7@qq.com", Field: 100})
    fmt.Println(string(jsonByte))
}

// 输出结果
// {"email":"7@qq.com","field":"100"}

json和map转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func main() {
    jsonStr := `
        {
          "env": "local",
          "redis_address": "127.0.0.1:6379",
          "redis_password": "xxx"
        }
    `

    // json转换成map
    m := make(map[string]interface{})
    _ = json.Unmarshal([]byte(jsonStr), &m)
    fmt.Println(m) // 输出:map[env:local redis_address:127.0.0.1:6379 redis_password:xxx]

    // map转换成json
    j, _ := json.Marshal(m)
    fmt.Println(string(j)) // 输出:{"env":"local","redis_address":"127.0.0.1:6379","redis_password":"xxx"}
}

Go 开发遇到的性能问题

原生 json 包效率低

原因

原生 json 包主要是用到了reflect,所以比较慢,推荐优先使用 json-iterator 包解析 json。

代码分析

测试环境:macbook pro macos

Go 版本: 1.14

json-iterator 版本: v1.1.9

测试解析单次大 json 的情况

PHP注释规范

函数/方法注释规范

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * @param 定义函数或者方法的参数信息
 * @return 定义函数或者方法的返回信息
 * @throws 指明此函数可能抛出的错误异常,极其发生的情况
 * @todo 指明应该改进或没有实现的地方
 * @example 示例
 * @deprecate 指明不推荐或者是废弃的信息
 * @name 名字
 * @author 函数作者的名字和邮箱地址
 * @abstract 申明变量/类/方法
 * @access 指明这个变量、类、函数/方法的存取权限
 * @category 组织packages
 * @copyright 指明版权信息
 * @const 指明常量
 * @exclude 指明当前的注释将不进行分析,不出现在文挡中
 * @final 指明这是一个最终的类、方法、属性,禁止派生、修改。
 * @global 指明在此函数中引用的全局变量
 * @include 指明包含的文件的信息
 * @link 定义在线连接
 * @package 定义归属的包的信息
 * @see 定义需要参考的函数、变量,并加入相应的超级连接。
 * @since 指明该api函数或者方法是从哪个版本开始引入的
 * @static 指明变量、类、函数是静态的。
 * @var 定义说明变量/属性。
 * @version 定义版本信息
*/

PHP 的一些坑

大小写的坑

mysql5.7 查询不区分大小写。

php7.2 array_diff() 区分大小写,在不区分大小写的情况下取差集,应使用 array_udiff() 和 strcasecmp() 处理

示例:array_udiff([‘a’, ‘b’, ‘c’], [‘A’, ‘b’], ‘strcasecmp’) // 输出 c

Mysql 主从复制延时案例

Mysql之主从复制读写分离

Mysql 之主从复制原理

MySQL 主从复制的延时一直是业界困扰已久的问题。延时的出现会降低主从读写分离的价值,不利于数据实时性较高的业务使用 MySQL。

如果主从复制之间出现延时,就会影响主从数据的一致性。

Go 数组指针和指针数组的区别

Golang中数组指针和指针数组区别

区别二者,字面上只看后两个字即可:

数组指针 :它是一个指针,但是数据类型为数组,或者说指向数组

指针数组 :它是一个数组,该数组的元素都为地址值

一.数组指针

1.语法

var 变量名 *[数组大小] 数组类型:

理解并发与并行

并发与并行

例子

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发(不一定是同时的)。

Hugo 使用教程

Hugo 是什么

静态网站生成器

  • Hugo只有一个二进制文件(比如Windows里只是一个hugo.exe)
  • Hugo可以将你写好的MarkDown格式的文章自动转换为静态的网页。
  • Hugo内置web服务器,可以方便的用于本地调试。

安装命令

1
2
# v0.146
brew install hugo

Hugo 常用命令

  • hugo new site quickstart // 新建一个博客网站
  • hugo new post/xxx/xxx.md // 新建文章
  • hugo server -D // Start the Hugo server
  • hugo // 构建静态页面,不包含 draft=true 的文件
  • hugo -D // 构建静态页面,包含 draft=true 的文件

Hugo 项目目录

  • config.toml是网站的配置文件,这是一个TOML文件,全称是Tom’s Obvious, Minimal Language,这是它的作者GitHub联合创始人Tom Preston-Werner 觉得YAML不够优雅,捣鼓出来的一个新格式。
  • theme 目录里放的是主题皮肤
  • content 目录里放的是你写的markdown文章
  • archetypes 目录里放的是生成 Markdown 的模板,在使用hugo new PAGE_NAME.md来创造一个新页面时,会根据archetypes目录下的模板,来生成新文件。
  • static 目录里放的是一些图片、css、js等资源,如存在 static/images/test.png,则调用方式为 /images/test.png
  • layouts 目录里放的是网站的模板文件
  • public 存放所有静态页面的数据,如文章、图片

主题推荐

even:https://github.com/olOwOlo/hugo-theme-even/blob/master/README-zh.md

IM-心跳机制

作为即时通讯应用,心跳机制是其网络通信技术底层中非常重要的一环,有没有心跳机制、心跳机制的算法实现好坏,都将直接影响即时通讯应用在应用层的表现——比如:实时性、断网自愈能力、弱网体验等等。