偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用緩存防擊穿,解決微信”被動(dòng)回復(fù)用戶消息”重試回復(fù)問題

存儲(chǔ) 存儲(chǔ)軟件
有這么條規(guī)則, ”微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會(huì)斷掉連接,并且重新發(fā)起請(qǐng)求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會(huì)對(duì)此作任何處理,并且不會(huì)發(fā)起重試。詳情請(qǐng)見“發(fā)送消息-被動(dòng)回復(fù)消息””。

 [[379879]]

本文轉(zhuǎn)載自微信公眾號(hào)「UP技術(shù)控」,作者conan5566。轉(zhuǎn)載本文請(qǐng)聯(lián)系UP技術(shù)控公眾號(hào)。   

背景

做微信公眾號(hào)開發(fā)的時(shí)候,其中有個(gè)接收普通消息、接收事件推送 API。

有這么條規(guī)則, ”微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會(huì)斷掉連接,并且重新發(fā)起請(qǐng)求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會(huì)對(duì)此作任何處理,并且不會(huì)發(fā)起重試。詳情請(qǐng)見“發(fā)送消息-被動(dòng)回復(fù)消息””。

概括起來就2點(diǎn)

1、就是說5s沒響應(yīng),這個(gè)請(qǐng)求就會(huì)被放棄;

2、會(huì)重新發(fā)起請(qǐng)求,具有冪等性;

問題

這樣就會(huì)產(chǎn)生2個(gè)問題。

1、假設(shè)我的方法就正好需要6s,那么即使返回結(jié)果也是沒用的,因?yàn)檎?qǐng)求被放棄了。

2、我需要返回給用戶正確的回信,假設(shè)第一次超時(shí)沒法及時(shí)回信,比如綁定操作,第一次沒回信,第二次再來總不能回復(fù)綁定過了,這樣顯然不合理。

或者直接回復(fù) success ,這樣顯然沒法正常的進(jìn)行消息提醒。

那么怎么做到既執(zhí)行了操作(第一次超時(shí)了),(第二次微信重試)又及時(shí)回復(fù)正確的回信呢 。

代碼實(shí)現(xiàn)

1、定義緩存的key,就是消息MsgId。

  1. string cacheKey = model.MsgId.ToString(); 

2、使用緩存機(jī)制,把結(jié)果緩存起來,下次進(jìn)來,直接回復(fù)上次執(zhí)行的結(jié)果。

  1. TimeSpan expired = new TimeSpan(0, 0, 20); 
  2.                     string cacheKey = model.MsgId.ToString(); 
  3.                     return _cacheLayer.Get(cacheKey, () => 
  4.                     { 
  5.                         MsgReply param = new MsgReply() { ToUserName = model.FromUserName, FromUserName = model.ToUserName }; 
  6.                         string Jsonstr = WeiXinHelper.ReadAccess(HttpRuntime.AppDomainAppPath.ToString() + "/App_Data/WeChat/KeyWordReplay.json"); 
  7.                         var r = JsonConvert.DeserializeObject<AutoReplay>(Jsonstr); 
  8.                         param.Content = r.content; 
  9.                         if (String.Equals(model.MsgType, "text", StringComparison.CurrentCultureIgnoreCase)) 
  10.                         { 
  11.                             var item = r.keywordcontent.FirstOrDefault(o => o.keyword.Contains(model.Content)); 
  12.                             if (item != null
  13.                             { 
  14.                                 param.Content = item.content; 
  15.                             } 
  16.                         } 
  17.  
  18.                         string response = _weChatAlertsService.SubscribeReply(param); 
  19.                         AddReceiveLog(model, xml, response); 
  20.                         return response; 
  21.                     }, expired); 

3、這樣既解決冪等問題,也返回了正確的結(jié)果。

4、這里需要注意,緩存取得每個(gè) Key專有的 lock object;若同時(shí)有多個(gè) thread要求相同資料,只會(huì)(到數(shù)據(jù)庫)查第一次,剩下的從 cache讀取。

  1. public T Get<T>(string key, Func<T> getDataWork, TimeSpan absoluteExpireTime, bool forceRefresh = false, bool returnCopy = truewhere T : class 
  2.         { 
  3.             try 
  4.             { 
  5.                 lock (GetMemoryCacheLockObject(key)) 
  6.                 { 
  1. private static object GetMemoryCacheLockObject(string key
  2.         { 
  3.             string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key); 
  4.             lock (CacheObject) 
  5.             { 
  6.                 var lockObject = CacheObject[cacheLockKey]; 
  7.                 if (lockObject == null
  8.                 { 
  9.                     // 取得每個(gè) Key專屬的 lock object;若同時(shí)有多個(gè) thread要求相同資料,只會(huì)(到資料庫)查第一次,剩下的從 cache讀取 
  10.                     lockObject = new object(); 
  11.                     CacheObject.Set
  12.                         cacheLockKey, 
  13.                         lockObject, 
  14.                         new System.Runtime.Caching.CacheItemPolicy() 
  15.                         { 
  16.                             AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10) 
  17.                         } 
  18.                     ); 
  19.                 } 
  20.  
  21.                 return lockObject; 
  22.             } 
  23.         } 

總結(jié)

1、使用緩存機(jī)制,把第一次的結(jié)果保存下來,對(duì)方重試的時(shí)候,直接返回上次的結(jié)果。

2、使用lock ,保證并發(fā)的時(shí)候,若同時(shí)有多個(gè) thread要求相同資料,只會(huì)(到數(shù)據(jù)庫)查第一次,剩下的從 cache讀取。

 

責(zé)任編輯:武曉燕 來源: UP技術(shù)控
相關(guān)推薦

2024-10-22 08:30:21

lockthread數(shù)據(jù)庫

2024-07-22 00:00:00

緩存機(jī)制lock

2013-04-10 18:48:56

微信公眾平臺(tái)技巧

2013-04-09 18:13:44

微信公眾平臺(tái)關(guān)鍵詞

2020-07-02 13:10:49

PyWeChatSpy拍一拍Python

2018-06-29 09:53:07

Python微信自動(dòng)回復(fù)

2013-04-10 16:04:12

微信微信機(jī)器人技巧

2023-01-31 08:37:11

緩存穿透擊穿

2021-01-14 10:58:03

Python表情包微信

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫

2017-03-17 15:10:52

微信消息撤回功能

2023-11-10 14:58:03

2024-07-12 08:48:50

2021-01-31 10:51:37

緩存lock數(shù)據(jù)

2021-04-18 10:24:35

WhatsAppAndroid惡意軟件

2021-07-19 22:31:39

微信微信客服移動(dòng)應(yīng)用

2018-11-12 11:12:46

2013-05-24 09:35:46

Java實(shí)現(xiàn)

2013-01-10 16:32:39

Google開發(fā)者Google Play

2013-05-14 10:07:13

谷歌
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)