亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Redis到底該如何利用(三)?

2019-11-17 02:45:04
字體:
來源:轉載
供稿:網友

Redis到底該如何利用(三)?

上兩篇受益匪淺,秉著趁熱打鐵,不挖到最深不罷休的精神,我決定追加這篇。上一篇里最后我有提到實現分級緩存管理應該是個可行的方案,因此今天特別實踐了一下。不過緩存分級之后也發現了一些問題,例如下圖:

當appServerA修改了數據,并同步到Redis/DB之后,如何讓appServerB也能更新本地緩存呢?雖然Redis的出現是為了解決這個問題的,但是分級方案里,MemoryCache還是需要保留。那么如何保存呢?我嘗試了下面的幾種方式,現在我們逐一來看。

全數據增量同步

所謂全數據校驗,即所有的緩存數據首先都同步至Redis,然后根據數據的時間戳來進行同步。分解步驟如下:

  1. 首先將緩存的數據初始化,同步至Redis和MemoryCache,保持初始數據的同步
  2. 第二步,每當操作了數據之后,給記錄一個時間戳標識最近的更新。
  3. MemoryCache定時或者每次取數據的時候,以最近的一個同步的時間戳開始同步到現在的時間戳

上面的方案咱們落地到.NET+Redis又該怎么處理呢?

第一步很簡單直接跳過,第二步就有點問題了,這個時間戳要便于redis的排序和獲取,考慮到這些問題,我覺得取linux的數字型時間戳比較靠譜,再配合SortSet來建立索引,進行同步,看起來的確不錯。那么來看下代碼:

本篇還是以User為例,可能場景不適合,大家將就理解

public void UpdateToRedis(User user){            var redis = ConnectionMult

同步:

public void Sync(double timespan){            var redis = ConnectionMultiplexer.Connect("localhost");            var db = redis.GetDatabase();            TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);            double time = Convert.ToInt64(ts.TotalSeconds);//計算Unix時間戳                        //同步時間范圍內的記錄,這里增加時間范圍,以防止一些數據不準確的問題            var members = db.SortedSetRangeByScore("capqueen:user:index", timespan, time);            var keys = members.ToList().Select<RedisValue, RedisKey>(i => i.ToString());            var values = db.StringGet(keys.ToArray());            //構造List Json以加速解析            var portsJson = new StringBuilder("[");            values.ToList().ForEach(item =>            {                if (!string.IsNullOrWhiteSpace(item))                {                    portsJson.Append(item).Append(",");                }            });            portsJson.Append("]");            var users = JsonConvert.DeserializeObject<List<User>>(portsJson.ToString());            //和內存的List<User>做同步            ...            //END}

上面的代碼只是實例,實際運行的時候感覺還不是特別靠譜。

消息通知

增量同步是好,但是同時時機也是個問題,時機不對,就會影響用戶體驗。而且感覺我們還是無法很好的掌控數據。那么有沒有一種方式可以及時的通知到appServer更新緩存呢?這里我腦子里冒出來的是.NET Event機制。

我覺得.NET因為有了優秀的Event機制,才讓我覺得它使用起來很方便

但是這里是服務器之間的通信,我想非Scoket莫屬了,之間做過Scoket雙向通信,印象特別深刻,這樣的場景讓我自然而然的想到了這個方案??墒翘貏e的增加一個socket,本身復雜的架構要更復雜了,還是尋求一個靠譜的中間件比較適合。看過Redis的功能列表的同學,一定沒忘記Redis還有一個訂閱發布,pub/sub功能。于是我就利用了這個功能,設計了如下的方案:

  1. 為app增加一個sub線程,用于接收redis訂閱消息
  2. 在每一個緩存對象更新的同時,增加異步pub消息到redis

先來看下Redis的,pub/sub功能,請看文檔

redis提供指定channel的訂閱發布功能,每一個Client可以訂閱指定的channel消息,也可以向指定的channel發送消息。

利用ServiceStack.Redis的pub/sub功能實現如下:

using (var redisConsumer = new RedisClient(TestConfig.SingleHost))using (var subscription = redisConsumer.CreateSubscription()){    subscription.OnSubscribe = channel =>    {        //訂閱事件    };    subscription.OnUnSubscribe = channel =>    {       //退訂事件    };    subscription.OnMessage = (channel, msg) =>    {        // 這里的msg,我為了測試定義成了userid        var user= redisConsumer.As<User>().GetById(msg);//從Redis獲取記錄        UpdateLocalCache(user);//更新本地    };      subscription.SubscribeToChannels("capqueen:redis:events"); //blocking}

發送:

using (var redisPublisher = new RedisClient("localhost")){    redisPublisher.PublishMessage("capqueen:redis:events", userId);//發送消息}

這里我覺得message應該定義成一個消息體,接收處理應該根據具體的消息定義來具體處理,因為訂閱發布的通道顯然應該是合理利用,如果一個業務一個通道,有點太多了。

當然這個實現起來又要講一大篇了,這里不多說明。

總結

本篇文章,根據上一篇提的方案做了一些實現,不足之處太多了。例如事件丟了怎么辦?如何正確的處理消息缺失,記錄少了之類的特殊情況應該是很重要的。我暫時還沒想到方案,不知道前輩們如何看待這樣的問題??赡芪疫€是濫用了Redis,為了技術而技術了,不過不嘗試碰下壁,怎么能得到成長。所謂兼聽則明 偏信則暗,我感覺自己有點不見棺材不落淚了。請前輩們不吝指教!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美亚洲视频| 日本国产一区二区三区| 久久久久久久成人| 国产亚洲精品综合一区91| 国产精品黄页免费高清在线观看| 91精品视频在线播放| 91久久精品久久国产性色也91| 日韩精品高清在线观看| 亚洲精品成人免费| 国产精品流白浆视频| 亚洲精品二三区| 精品中文字幕视频| 久久精品在线视频| 久热在线中文字幕色999舞| 97国产精品视频人人做人人爱| 久久久久久久久中文字幕| 精品久久久久久电影| 中文字幕一精品亚洲无线一区| 国产亚洲精品一区二区| 久久久之久亚州精品露出| 欧美激情欧美狂野欧美精品| 欧美xxxx做受欧美.88| 国产精品自拍网| 国产噜噜噜噜久久久久久久久| 国产不卡一区二区在线播放| 一本色道久久综合亚洲精品小说| 久久精品一偷一偷国产| 国产精品www网站| 亚洲综合国产精品| 奇米四色中文综合久久| 欧美另类在线观看| 热久久美女精品天天吊色| 亚洲黄色www网站| 日韩电影免费观看在线观看| 欧美电影院免费观看| 国产v综合ⅴ日韩v欧美大片| 久久精品视频免费播放| 欧美激情一级二级| 亚洲毛片在线看| 久久91超碰青草是什么| 欧美在线激情网| 成人黄色在线播放| 国产精品欧美日韩| 日韩免费黄色av| 国产日韩在线看| 国产偷国产偷亚洲清高网站| 国内免费久久久久久久久久久| 亚洲精品美女免费| 97视频免费看| 亚洲第一级黄色片| 欧美www视频在线观看| 亚洲精品久久视频| 粉嫩av一区二区三区免费野| 日韩免费观看网站| 国产精品视频色| 亚洲美女动态图120秒| 久久中文字幕国产| 日韩精品高清在线| 日韩电影中文字幕一区| 欧美巨乳美女视频| 自拍偷拍亚洲精品| 国产成人精品一区二区| 国产日产欧美精品| 欧美在线xxx| 亚洲天堂色网站| 欧美丝袜一区二区三区| 亚洲欧洲日本专区| 亚洲一区免费网站| 亚洲国产精品va在线看黑人| 日韩三级成人av网| 日韩av影片在线观看| 亚洲小视频在线| 国产精品大片wwwwww| 欧美高清在线视频观看不卡| 岛国视频午夜一区免费在线观看| 欧美乱大交xxxxx| 欧美激情一区二区三级高清视频| 激情久久av一区av二区av三区| 日韩在线观看免费全| 色偷偷偷亚洲综合网另类| 中文字幕久久久av一区| 国产一区二区三区久久精品| 亚洲永久在线观看| 日韩在线观看免费网站| 亚洲精品乱码久久久久久金桔影视| 久久久久久久久久久久久久久久久久av| 亚洲黄色在线看| y97精品国产97久久久久久| 国产精品欧美激情在线播放| 97在线看免费观看视频在线观看| 精品中文字幕在线2019| 国产精品久久久亚洲| 色综合视频一区中文字幕| 欧美视频在线观看免费| 国产精品亚洲片夜色在线| 日韩网站免费观看高清| 亚洲性猛交xxxxwww| 欧美国产中文字幕| 亚洲免费伊人电影在线观看av| 91精品视频免费观看| 91在线无精精品一区二区| 久久久久成人精品| 欧美激情日韩图片| 一本大道香蕉久在线播放29| 国内精品伊人久久| 亚洲精品成人网| 亚洲а∨天堂久久精品喷水| 136fldh精品导航福利| 国产精品手机播放| 亚洲国产欧美一区二区三区同亚洲| 欧美一级视频在线观看| 久久影院资源站| 中文字幕一区二区精品| 精品国产依人香蕉在线精品| 亚洲精品福利免费在线观看| 亚洲欧美激情四射在线日| 91情侣偷在线精品国产| 国产欧美va欧美va香蕉在| 成人在线一区二区| 国产精品久久久久久久久免费| 91高清免费视频| 精品国产一区二区三区四区在线观看| 欧美最近摘花xxxx摘花| 欧美黑人巨大精品一区二区| 久久亚洲一区二区三区四区五区高| 亚洲精品理论电影| 57pao成人永久免费视频| 中文字幕亚洲欧美日韩高清| 91午夜理伦私人影院| 欧美性生交xxxxx久久久| 精品国产自在精品国产浪潮| 伊人久久久久久久久久久| 国产精品av网站| 成人午夜一级二级三级| 亚洲自拍偷拍在线| 久久亚洲综合国产精品99麻豆精品福利| 亚洲福利视频免费观看| 狠狠色狠狠色综合日日五| 亚洲男人天堂网| 国产精品美女免费看| 国产精品中文字幕久久久| 成人黄色在线观看| 欧美日韩国产页| 91精品91久久久久久| 亚洲精品午夜精品| 国产aⅴ夜夜欢一区二区三区| 国产精品亚洲аv天堂网| 色妞在线综合亚洲欧美| 91精品国产沙发| 国产精品国产亚洲伊人久久| 久久夜精品va视频免费观看| 91精品啪在线观看麻豆免费| 91久久精品久久国产性色也91| 91九色精品视频| 亚洲一区二区三区在线视频| 欧美激情乱人伦一区| 97视频免费在线看| 91九色精品视频| 精品视频偷偷看在线观看| 亚洲第一区在线观看| 亚洲精品国精品久久99热| 97国产在线观看| 亚洲人成啪啪网站| 亚洲人成自拍网站|