緩存,並發更新的大坑?誰來填?

《緩存,究竟是淘汰,還是修改?》發出後,有朋友提到,高併發的情況下,緩存的更新可能存在問題,今天簡單聊聊這個話題。

緩存,併發更新的大坑?誰來填?

業務場景:

  • 調用第三方服務,例如微信,一般會分配一個token,每次訪問接口需要帶上這個token;
  • 這個token是有有效期的,當token過期時,需要去重新認證申請;
  • 也可以在token過期前重新申請,但此時舊token會失效。

常見實現方式,如圖:

緩存,併發更新的大坑?誰來填?

  • 把token放在緩存中,每次帶上token去調用接口;
  • 如果token過期,需要去申請新token;
  • 申請完新token,需要把新token更新到緩存裡。

高併發下可能存在的問題,如圖:

緩存,併發更新的大坑?誰來填?

  • 取舊token,訪問接口,發現token過期;
  • 併發請求,取舊token,訪問接口,也發現token過期;
  • 去申請新token1;
  • 併發申請新token2(此時token1會過期);
  • 把token1放入緩存,同時使用token1訪問接口(此時token1已經過期),發現token1過期,可能會遞歸申請新token3(此時token2過期);
  • 把token2放入緩存,同時使用token2訪問接口(此時token2已經過期),發現token2過期,可能會遞歸申請新token4(此時token3過期);

額,高併發請求導致相互失效。

常見解決方案,如圖:

緩存,併發更新的大坑?誰來填?

  • 線上s1和s2只從緩存讀取token
  • 更新token異步,asy-Master定期更新token,避免併發更新
  • 使用shadow-master保證token更新高可用,asy-Master掛了,asy-Backup頂上

潛在缺點:

  • s1/s2/asy-master直接調用同一個緩存實例,如果緩存實例變更,可能需要同步變更,導致耦合。

潛在優化:

  • asy-Master利用多線程,實現在s1/s2裡,保證高可用;
  • redis裡用一個時間戳表示token的更新時間,更新token時,查看token的時間戳,如果token剛更新過,併發的請求便不再更新。

文字雖短,希望問題描述清楚了,希望大家有收穫。

那如何學習才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視頻課程用來跟著學習是非常有必要的。

為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視頻課程詳細講解了(Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容!

而且還把框架需要用到的各種程序進行了打包,根據基礎視頻可以讓你輕鬆搭建分佈式框架環境,像在企業生產環境一樣進行學習和實踐。

緩存,併發更新的大坑?誰來填?

後臺私信回覆 “ 架構 ” 就可以馬上免費獲得這套價值一萬八的內部教材!


分享到:


相關文章: