Go语言实战流媒体视频网站


本文摘自网络,作者,侵删。

download:Go语言实战流媒体视频网站

本课程带着同学们使用Go语言实战一个流媒体视频网站。从后端Server到前端UI,全面掌握Go语言的开发关键技能和Go语言编码的架构风格。同时通过讲述SOA服务化解耦的设计理念,帮助同学们理解真实web服务背后的内容。最后通过架构调整实现Cloud native(云原生)部署。

适合人群
有一定开发经验,对Go语言语法有基本了解
想做Go项目实践的开发者
技术储备要求
HTTP协议,SOA相关,Web service相关知识
go语言语法基础
func AsyncAdd(run func() error) {
//TODO: 扔進異步協程池
go run()
}
func GetInstance(ctx context.Context,id uint64) (string, error) {
data,err := GetFromRedis(ctx,id)
if err != nil && err != redis.Nil{
return "", err
}
// 沒有找到數據
if err == redis.Nil {
data,err = GetFromDB(ctx,id)
if err != nil{
return "", err
}
AsyncAdd(func() error{
return UpdateCache(ctx,id,data)
})
}
return data,nil
}
func GetFromRedis(ctx context.Context,id uint64) (string,error) {
// TODO: 從redis獲取信息
return "",nil
}
func GetFromDB(ctx context.Context,id uint64) (string,error) {
// TODO: 從DB中獲取信息
return "",nil
}
func UpdateCache(ctx context.Context,id interface{},data string) error {
// TODO:更新緩存信息
return nil
}
func main() {
ctx,cancel := context.WithTimeout(context.Background(), 3 * time.Second)
defer cancel()
_,err := GetInstance(ctx,2021)
if err != nil{
return
}
}
剖析
我們先简單剖析一下,這一段代码要幹什麼?其實很简單,我們想要獲取一段信息,首先會從緩存中獲取,假如緩存中獲取不到,我們就從DB中獲取,從DB中獲取到信息後,在協程池中放入更新緩存的辦法,異步去更新緩存。整個設計是不是很圆滿,但是在實践工作中,異步更新緩存就沒有勝利過?

招致失敗的缘由就在這一段代码:

AsyncAdd(func() error{
return UpdateCache(ctx,id,data)
})
复制代码
錯誤的缘由只要一個,就是這個ctx,假如改成這樣,就啥事沒有了。

AsyncAdd(func() error{
ctxAsync,cancel := context.WithTimeout(context.Background(),3 * time.Second)
defer cancel()
return UpdateCache(ctxAsync,id,data)
})


本文来自:51CTO博客

感谢作者:mb606da4dda44b2

查看原文:Go语言实战流媒体视频网站

相关阅读 >>

手撸Golang Go与微服务 saga模式之4

Go orm 干啥的?

详解 Go 语言中的方法

php的局限性怎么破?php与Go可完美结合

Golang组件化网络服务器框架halia指南

Golang中的defer关键字

Golang是多线程模式吗?

Go-carbon1.2.5版本发布,新增两个互转方法!

Go那些事儿|Go反射使用第二弹(valueof)

GoGolang之间有区别吗?

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...