自动迁移 因为Gorm可以通过自动数据迁移特性来创建所需的数据库表,并在用户修改相应的结构时自动对数据库表进行更新, 当我们运行这个程序时,程序所需的数据库表就会自动生成 负责执行数据迁移操作的AutoMi
sqlx包的使用
sqlx是一个第三方库,它为database/sql包提供了一系列非常有用的扩展功能。 因为sqlx和database/sql包使用的是相同的接口,所以sqlx能够很好地兼容使用database/sql
Go与SQL
连接数据库 sq1.DB结构是一个数据库句柄(handle),它代表的是一个包含了零个或任意多个数据库连接的连接池(pool),这个连接池由sql包管理。程序可以通过调用Open函数,并将相应的数据库驱
MySQL 和 Redis 的数据一致性问题
什么是数据的一致性 “数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。 但根据缓存中是有数据为依据,则”一致“可以包含两种情况: 缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文
ruby分布式锁
#ruby的分布式锁实现,基于redis class Redlock DefaultRetryCount=3 DefaultRetryDelay=200 ClockDriftFactor = 0.01 UnlockScript=' if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end' def initialize(*server_urls) @servers = [] server_urls.each{|url| @servers << Redis.new(:url => url) } @quorum = server_urls.length / 2 + 1 @retry_count = DefaultRetryCount @retry_delay = DefaultRetryDelay @urandom = File.new("/dev/urandom") end def set_retry(count,delay) @retry_count = count @retry_delay = delay end def lock_instance(redis,resource,val,ttl) begin return redis.client.call([:set,resource,val,:nx,:px,ttl]) rescue return false end end def unlock_instance(redis,resource,val) begin redis.client.call([:eval,UnlockScript,1,resource,val]) rescue # Nothing to do, unlocking is just a
Go读写CSV
对Go语言来说,CSV文件可以通过encoding/csv包进行操作,下面通过这个包来读写CSV文件。 由于程序在接下来的代码中立即就要对写入的posts.csv文件进行读取,而刚刚写入的数据有可能还滞
幂等设计
概念 幂等这个概念,是一个数学上的概念,即:f……(f(f(x))) = f(x)。用在计算机领域,指的是系统里的接口或方法对外的一种承诺,使用相同参数对同一资源重复调用某个接口或方法的结果与调用一次的结果
日志切割logrotate原理和配置
logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。系统是这么实现按天执行的。crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。在 centos
Go模板之上下文感知
上下文感知 Go语言的模板引擎可以根据内容所处的上下文改变其显示. 上下文感知的一个显而易见的用途就是对被显示的内容实施正确的转义(escape):这意味着,如果模板显示的是HTML格式的内容,那么模板将
Go模板之动作
Go的模板动作就是嵌入模板的命令 条件动作 {{ if arg }} some content {{ else }} other content {{ end }} 迭代动作 迭代动作可以对数组,切片,映射,或者通道进行迭代, 在迭代循环内部, 点(.) 会被设置正在当前迭代内容 设置动作 设置动作允许为指定
Go的模板引擎
Go的模板都是文本文档(其中Web应用的模板通常都是HTML),它们都嵌入了一些称为动作(action)的指令。从模板引擎的角度来说,模板就是嵌入了动作的文本(这些文本通常包含在模板文件里面),而模板
利用cookie实现闪现消息
为了向用户报告某个动作的执行情况,应用程序有时候会向用户展示一条简短的通知消息, 比如说,如果一个用户尝试在论坛上发表一篇帖子,但是这篇帖子因为某种原因而发表失败了,那么论坛应该向这个用户展示一条帖子发
解析请求头和请求体
解析请求头 // 解析请求头 func headers(w http.ResponseWriter, request *http.Request) { // 获取所欲请求头,Header 是个 map, key 是字符串,value 是字符串切片 headers := request.Header fmt.Printf("所有请求头headers: %v\n", headers) // 获取单个请求头,返回的是字
为什么把某些参数放在请求头中
在HTTP协议中,首部和请求体是分开传输的,将一些认证信息参数放在请求头中,服务端先解析请求头,如果认证不通过,可以直接返回认证失败,不用再传输请求体,从而提高服务器的性能。 下面做实验验证,实验思路: