download:Web前端架构师

超大复杂项目+高端技术+大厂规范+全局架构思维
系统培养大厂P7技术专家/中小厂前端Leader
6~8个月,让3年+前端完成质的飞跃
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博客作者mb60502f49a42bb的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 排查指南 | mPaaS 小程序提示“网络不给力”时该如何排查?
  2. 排查指南 | 当 mPaaS 小程序提示“应用更新错误(1001)”时
  3. 记一次生产环境问题解决案例(k8s环境)
  4. Flink1.8.0重大更新-Flink中State的自动清除详解
  5. FlinkSQL中的回退更新-Retraction
  6. 记一次线上问题排查与解决
  7. 【大数据成神之路】第一版更新完毕
  8. ensp起不来的原因汇总(长期更新)
  9. 附解决方案,小程序获取的用户信息中昵称图然变成了“微信用户”,而

随机推荐

  1. 扑克牌魔术里面的算法
  2. 使用pm2后台运行nodejs程序
  3. Android性能优化案例研究(上)
  4. 一个正确的编程学习方法
  5. 速成编程、副业挣钱有无可能?
  6. 我总是半途而废
  7. B 站,牛逼!
  8. 排序算法 #1 选择排序(文字版)
  9. 一道 LeetCode 周赛的题目,让我自信满满!
  10. 每日前端夜话(0x03):2018年JavaScript状态