download:Spring Cloud分布式微服务实战,养成应对复杂业务的综合技术能力

这是一门培养应对复杂业务的综合技术能力的实战课程,本课采用前后端分离开发模式,严格遵守企业级架构和规范,带你开发门户平台+媒体中心+运营中心三大业务的企业级自媒体平台。让你全面掌握主流后端技术栈:Spring Cloud+MongoDB+Redis+RabbitMQ等,同时获得微服务、分布式、项目和微架构综合实战经验。

适合人群
需要快速提升主流技术综合项目经验的Java开发人员
向架构师迈进的初中级Java开发人员
技术储备要求
Java语言,且最好具备
Maven、MySQL、Linux基础
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. 基于S.M.A.R.T.的磁盘健康监控
  2. 京东技术:用最小的图片格式,打造最优的用户体验
  3. “金三银四”的折腾之聊一聊面试
  4. 并非所有信息都是等价的:
  5. 人的认知特性与分析
  6. 【容器技术】Docker容器技术入门(二)
  7. Docker容器技术入门(一)
  8. 【资源分享】拥抱开源、分享开源、热爱开源
  9. zookeeper技术介绍

随机推荐

  1. ubuntu14.04 安装apache+mysql+php
  2. Ubuntu 16.04搭建lamp环境
  3. include一个php文件,经常会失败,请问需要注
  4. php中的错误级别
  5. php关于网页乱码问题
  6. 如何从其他文件调用数组
  7. 今天去面试遇到了一个问题,左连接查询的问
  8. php清理当前目录下的指定文件和空目录(源
  9. PHP的订单生成算法
  10. 切出多维数组的一部分