幂等/idempotent
本文字数: 10 阅读时长 ≈ 1 分钟
linux port
Linux 查看端口占用情况可以使用 lsof 和 netstat 命令。
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 查看端口
lsof -i:端口号
查看服务器 8000 端口的占用情况:
1
2
3# lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nodejs 26993 root 10u IPv4 37999514 0t0 TCP *:8000 (LISTEN)其他参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
netstat
netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。
netstat 查看端口占用语法格式
1 | netstat -tunlp | grep 端口号 |
更多命令
1 | netstat -ntlp //查看当前所有tcp端口 |
golang technique
go-repo code snippet
判断机器位数
1
const intSize = 32 << (^uint(0) >> 63)
在64平台系统:
1. uint(0)在平台底层是0x0000000000000000
2. ^uint(0)在平台底层是0xFFFFFFFFFFFFFFFF
3. ^uint(0) >> 63 在底层平台是0x0000000000000001,也就是1
4. 32 << 1 结果是32*2 = 64
data conversion
- 充分利用已有的实现
1 | type Sorter interface{ |
断言防止panic,使用安全方式
1
2
3
4
5
6
7
8
9
10var list interface{}
list=&Sequence{1,2,4,3}
// 不安全方式,assertion不成功,会panic
convert:=list.(*Sequence)
// 安全方式
convert,ok:=list.(*Sequence)
if !ok{
return errors.New("convert error")
}反射,通过CanSet()判断反射得到的值能否修改
1
2
3var f float64=3
val:=reflect.ValueOf(x)
val.CanSet()反射在标准库中大量使用,fmt.Fprintf及其他格式化函数大多使用反射实现;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//fmt.Fprintf
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
p := newPrinter()
p.doPrintf(format, a)
n, err = w.Write(p.buf)
p.free()
return
}
// 判断interface的类型,在go 1.15 ".(type)"只能在switch使用
var i interface{}=&os.File{}
switch val.(type){
case int:
case *os.File:
case string:
}
参考文档
- golang官方文档 https://golang.google.cn/doc/effective_go#pointers_vs_values
- uber代码规范 (https://github.com/uber-go/guide)
- code snippet https://www.cnblogs.com/keystone/p/13930136.html
linux top
using gorm
CURD
Create
json自定义字段使用
如下为system使用自定义字段
1
2
3type System struct{
Version string
}为自定义类型实现接口Value/Scan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25func (s System)Value()(driver.Value, error) {
bytes, err := json.Marshal(s)
return string(bytes), err
}
func (s *System) Scan(value interface{}) error {
var bytes []byte
switch v := value.(type) {
case []byte:
bytes = v
case string:
bytes = []byte(v)
default:
return fmt.Errorf("解析失败,原始数据:%v", value)
}
result := System{}
if len(bytes) <= 0 {
*s = result
return nil
}
err := json.Unmarshal(bytes, &result)
*s = result
return err
}json查询,例如这里要查询version=1.0的System
1
2select * from table_t
where system->'$.version' = "1.0"
Update
Retrieve
预加载,preload
外键tag
预加载依赖在领域层结构体变量的gorm tag,需要在结构体上变量上增加外键tag,tag有多种写法,根
领域对象间的不同关系如:belongs to/has one/has many等有不同写法.
- belongs to 参考: https://gorm.io/zh_CN/docs/belongs_to.html
- has one
- has many
- many to many
在项目ForeignKey,References这两个标签最常用,主要用于Preload相关数据
自定义预加载,可在预加载时添加条件实现排序等功能
排序
1
2
3
4
5
6
7// 文档:https://gorm.io/zh_CN/docs/preload.html
//您可以通过 func(db *gorm.DB) *gorm.DB 实现自定义预加载 SQL,例如:
db.Preload("Users", func(db *gorm.DB) *gorm.DB {
return db.Order("user.age DESC")
}).Find(&users)
// SELECT * FROM user WHERE id IN (1,2,3,4) order by user.age DESC;
2.
order by
常用
指定从数据库检索记录时的排序方式1
2
3
4
5
6
7
8
9
10
11db.Order("age desc, name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;
// 多个 order
db.Order("age desc").Order("name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;
db.Clauses(clause.OrderBy{
Expression: clause.Expr{SQL: "FIELD(id,?)", Vars: []interface{}{[]int{1, 2, 3}}, WithoutParentheses: true},
}).Find(&User{})
// SELECT * FROM users ORDER BY FIELD(id,1,2,3)order by field 自定义排序
使用上面的写法通过自定义字段排序时注意,WithoutParentheses为true,为false是构建的sql为order by field(column,(“f1,f2,f3,…”)),会报错组合排序
1
2
3select id,status,create_time
FROM `order`
ORDER BY FIELD(status,'s3','s2','s1')desc,create_time desc如上的sql使用gorm框架可以这么写:
1
2
3
4
5
6
7
8res:=[]*Order{}
db.Clauses(clause.OrderBy{
Expression: clause.Expr{
SQL: "FIELD(status,?) DESC,create_time DESC",
Vars: []interface{}{
[]string{"s3","s2","s1"},
},
WithoutParentheses: true}}).Find(&res)不能使用链式调用(gorm v2版本,版本号:gorm.io/gorm v1.20.11),如:
1
2
3
4
5
6
7
8
9db.Clauses(clause.OrderBy{
Expression: clause.Expr{
SQL: "FIELD(status,?) DESC",
Vars: []interface{}{
[]string{"s3","s2","s1"},
},
WithoutParentheses: true}}).
Order("create_time DESC").
Find(&res)参考文档
- gorm v2文档: https://gorm.io/zh_CN/docs/query.html#Order
索引
强制索引
1
2
3
4
5
6
7
8
9
10
11
12import "gorm.io/hints"
db.Clauses(hints.UseIndex("idx_user_name")).Find(&User{})
// SELECT * FROM `users` USE INDEX (`idx_user_name`)
db.Clauses(hints.ForceIndex("idx_user_name", "idx_user_id").ForJoin ()).Find(&User{})
// SELECT * FROM `users` FORCE INDEX FOR JOIN (`idx_user_name`, `idx_user_id`)"
db.Clauses(
hints.ForceIndex("idx_user_name", "idx_user_id").ForOrderBy(),
hints.IgnoreIndex("idx_user_name").ForGroupBy(),
).Find(&User{})Index 用于提高数据检索和 SQL 查询性能。 Index Hints 向优化器提供了在查询处理过程中如何选择索引的信息。与 optimizer 相比,它可以更灵活地选择更有效的执行计划
- 加了join
1
2
3
4db.Table("`order` FORCE INDEX (order_create_time_d977ab1e,idx_demand_number, idx_stocked_number,idx_di)").
//Clauses(hints.CommentBefore("from", "FORCE INDEX (order_create_time_d977ab1e, idx_demand_number,idx_stocked_number,idx_di)")).
// 这样写,生成的sql语句有问题,force index位置在where条件中间
Joins("left join servicelist on order.service_list_id=servicelist.id").Find(& orders)
Delete
Config
ConnPool
gorm 连接池配置通过sql.DB实现
1
2
3
4
5
6
7
8
9gormDB,err:=gorm.Open(...)
db,err:=gormDB.DB()
if err!=nil{
return
}
db.SetConnMaxLifetime() //连接最长复用时间
db.SetConnMaxIdleTime() //maximum amount of time a connection may be idle,最长空闲时间
db.SetMaxIdleConns() // 最长空闲时间 maximum number of connections in the idle connection pool
db.SetMaxOpenConns() // 最大连接数 maximum number of open connections to the database
vscode config
插件
推荐插件
koroFileHeader
功能: 自动在文件头或函数头增加注释
url: https://marketplace.visualstudio.com/items?itemName=OBKoro1.korofileheader
函数
1
2
3
4
5/**
* @description:
* @param {*}
* @return {*}
*/文件
1
2
3
4
5
6
7
8<!--
* @Author: your name
* @Date: 2021-06-25 10:10:19
* @LastEditTime: 2021-10-29 14:24:21
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: /vscode-config.md
-->
code runner
- golang同package下的代码undefined
1 | 在.vscode下的settigns.json增加配置 |
go path
- vscode同时开发多个项目,每个项目不同路径
在不同终端下,配置不同gopath,使用 eexport GOPATH=/home/xxx/xxx设置
memcached
本文字数: 123 阅读时长 ≈ 1 分钟
What
高性能
分布式
多个分布式节点共享分布式内存,与传统部署方式不同,节点越多,memcached的可用内存越多.
memory object caching system
key-value
LRU (memory manage algorithm)
go-struct-sort
本文字数: 629 阅读时长 ≈ 1 分钟
1 | // 用于staff的排序 |
beego跨域问题
- what is it
- how it looks like
1
2 - how to solve
1 | import "github.com/astaxie/beego/plugins/cors" |
- why