Golang Xorm数据库操作(未完待续) 作者: lovingyu_er 时间: 2020-08-21 18:10:00 分类: Golang,朝花夕拾 评论 ####更新数据 1. 单条数据插入或者获取插入的条目的主键ID ``` //写入数据库 vpn := Model.Vpn{ Vpnname:vpnname, Ip:ip, Createat:time.Now(), } _,err := session.InsertOne(&vpn) fmt.Println(" last insert id is :",vpn.Id) if err != nil{ session.Rollback() return false } ``` ```session```是```DbEngine.NewSession()```开启的事务实例。案例中我使用了事务操作。我们采用了指针的(传址)方式去插入数据.那么我们通过```vpn.id```就可以获取到最后一次插入的值。 2. 获取单条数据: ``` //判断是否已经存在 tmpVpn := Model.Vpn{} session :=DbEngine.NewSession() session.Where("ip=?",ip).Get(&tmpVpn) fmt.Println(tmpVpn) ``` 案例中,首先定义了需要查询的数据的结构体,和数据库中表列对应,通过```Get()```函数就可以查询单条数据.也是采用指针的方式处理。 3. 获取多条数据 ``` VpnList := []Model.Vpn{} session.In("ip", ips).Find(&VpnList) fmt.Println("ip的信息") spew.Dump(VpnList) ``` 同```1,2```一样,获取到的是```Model.Vpn```类型的切片。 4. 字段为```0```的时候,一些查询存在的问题: ``` whereUserVpn := Model.Uservpn{ Userid: currentUserId, Vpnid: intVpnid, Using: 1, } ``` 当我的Vpnid赋值为0的时候,查询的时候,Get并不能将为0的字段的值作为```where```条件,会自动将非0的字段作为where条件。 5. Join查询操作 ``` var userdetail []userVpnDetail DbEngine.Table("uservpn"). Select("uservpn.userid,uservpn.vpnid,vpn.id,vpn.vpnname,vpn.ip,vpn.createat"). Join("left", "vpn", "vpn.id=uservpn.vpnid"). Where("uservpn.userid=?", uid). Find(&userdetail) //spew.Dump(userdetail) return userdetail ``` 其中```uservpn```是user和vpn两张表的对应关系表,可以一对多,多对一的进行查询 6. 更新数据```update```操作 ``` session :=DbEngine.NewSession() _,err := session.ID(vpn.Id).Update(&vpn) if err != nil{ fmt.Println("update err is :",err.Error()) session.Rollback() return false } session.Commit() return true ``` 以```ID```作为```where```提交进行更新;
Redis 缓存命中率 作者: lovingyu_er 时间: 2020-08-21 13:48:00 分类: Redis 评论  ####Redis缓存命中率 在Redis的命令行中,运行```info```命令,会获取到: ``` ... keyspace_hits:38157440 keyspace_misses:5735678 ... ``` 其中: **```keyspace_hits```** : 表示缓存的命中次数 **```keyspace_misses```** :表示未命中缓存 那么,缓存的命中率是: ``` 缓存命中率 = keyspace_hits/(keyspace_hits+keyspace_misses) ``` 那么上述的实际命中率就是: ``` 缓存命中率 = 38157440/(38157440+5735678) * 100% = 38157440/43893118*100% = 86.93% ``` 以上两个参数的变化如下: 我们get一个缓存中有效的key,keyspace_hits = keyspace_hits + 1 我们get一个缓存中无效的key,keyspace_misses = keyspace_misses + 1 我们set数据时,他们的值都不变,也就是说,缓存命中率,是我们读取数据的时候命中的比率。
Golang type关键字总结 作者: lovingyu_er 时间: 2020-08-20 15:25:27 分类: Golang 评论 ####类型等价于定义,相当于类型的重命名 案例: ``` type newstring string func main(){ var str newstring = "type newstring replace string" fmt.Println("str is ",str) return } ``` 上述的```newstring```就是和```string```属于同一种类型了 ####针对type定义的新类型定义新的方法 案例: ``` type newstring string func (newstr newstring) len()int{ return len(newstr) } func main(){ var str newstring = "type newstring replace string" fmt.Println("str is ",str) fmt.Println("newstr's len is ",str.len()) } ``` ####定义结构体 ``` type person struct{ name string age int } ``` ####定义函数类型方法 ``` type handler func(name string) int func (h handler) add (name string )int { return h(name) +10 } ``` 这种在golang的```http.HanderFunc()```内置函数就是这种情况: ```type HandlerFunc func(ResponseWriter, *Request)```
Docker容器的一些常见用法 作者: lovingyu_er 时间: 2020-08-19 23:30:35 分类: 编程语言,Linux性能优化 评论 ####Docker 磁盘相关命令: #####1. Docker system 命令 ```docker system```命令,它用于管理磁盘的空间的命令 ###### 1.1 docker system df 命令 ,类似于linux上的df命令,数据返回如下: ``` docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 55 31 3.307GB 3.004GB (90%) Containers 44 1 75.01MB 75MB (99%) Local Volumes 0 0 0B 0B Build Cache 0 0 0B 0B ``` 可以看到Docker的镜像共占用了3.307G的数据,容器占用了**75.01MB**的磁盘空间,**Local Volumes** 数据卷没有占用空间 清理命令: ``` 1. docker system prune -a :将没有在使用的Docker镜像删除掉,会把暂时关闭的容器,以及暂时没有用到的Docker都彻底清理掉。 2. docker system prune :用于清理磁盘,删除关闭的容器,无用的数据卷和网络,以及没有tag的镜像。 ``` #####2. Docker 挂载目录 ``` --mount :本地文件|目录不存在,docker会创建 -v :本地文件|目录不存在,docker会自动创建 ``` 关于```--mount```和```-v```参数的详细介绍,请参考:```https://docs.docker.com/storage/bind-mounts/```官方文档 #####3. docker遇到的问题: 3.1 **```OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown```** 解决方案:可能是你的镜像是mini版本,需要换一个有/bin/bash的镜像。我就是重新换了一个。 #####4. docker容器内操作: 4.1 如何进入某个容器? 解决方案: ```docker exec -it 容器ID/容器名称 bash ``` ####Docker常用的一些基本命令 #####1. 查看容器的镜像: ``` docker images ``` 案例: ``` darrykigerdeMBP:shop darry$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE netmanager latest 9cf1964455ea 11 hours ago 893MB c8f5b50df388 11 hours ago 892MB 9e4890016346 12 hours ago 892MB 1ba64f70cbd7 12 hours ago 14.4MB golang latest 75605a415539 7 days ago 839MB ``` 可以看到案例输出的结果总共有5列: 第一列:images名称, 第二列:标签 第三列:镜像的ID 第四列:镜像的创建时间 第五列:镜像的大小 #####2. 容器的状态 ``` docker ps doker ps -a ``` 前者是查看正在运行的容器镜像 ,```-a```查看所有的容器 #####3. docker build 命令,根据一个```Dockerfile```或者```dockerfile```文件构建一个容器 ``` darrykigerdeMBP:netmanager darry$ pwd /Users/darry/go/src/netmanager darrykigerdeMBP:netmanager darry$ docker build . -t netmanager ``` 该命令会在当前目录```.```中查找```Dockerfile```文件,并构建一个镜像。 其中```-t```参数,指定构建好的仓库的镜像名称。 #####4. docker run 命令,在一个新的容器中运行命令行 案例: ``` docker run -u root -p 8080:8080 netmanager --mount type=bind,source=/Users/darry/go/src/netmanager/Storage/,target=/build/Storage/ ``` 其中: ```-u```:指定容器运行的用户名 ```-p```:容器内部到宿主机的端口映射 ```netmanager``` 是上述```build```好的镜像 ```--mount```:将宿主机source的文件目录挂载到容器中的目录target ,详细的使用方式,可以参考上述的的```-v``` 和```--mount```参数介绍部分的文档。
Golang web重定向函数 作者: lovingyu_er 时间: 2020-08-17 11:38:00 分类: Golang,朝花夕拾 评论 目前在项目中使用的是: ``` http.Redirect(w,request,"/error/404.shtml",301) return ``` 该函数在执行的```Redirect```函数,参数列表: 1. ```w```参数,是```http.ResponseWriter```接口 2. ```request```参数,是```http.Request```接口 3. ```/error/404.shtml```参数:是跳转到的界面 4. ```http.Status``` 参数:```http```状态码,比如:200,40x,50x,30x等等,如果写200,就会返回一个OK连接的字符串,点击以后会跳转到第三个参数定义的界面。