生活随笔
收集整理的這篇文章主要介紹了
                                
使用Redis set 解决数据的唯一性问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            前言
最近遇到一個問題,就是接收第三方數據的時候,
類似這種直播數據,由于業務的緣故,導致對方給的數據每次都是全量的,
而且請求很頻繁,有時候一秒好幾十次。直播數據一般都是刷刷刷的,這個大家或多或少有看比賽,會知道。
對方給數據的模式
第一次100條數據,第二次只是多了1條,但是下發的101條。。。,
第n次可能會把前面的數據改了或者刪除。。。
如果僅僅只是接收數據,那其實沒什么大問題。
問題
我們的業務需求是接收到數據立馬要增量呈現給客戶,而且必須要快。
大家都知道,直播一旦延遲了?,那么數據的意義就不大了,尤其是那種重要的比賽。
那么問題來了
對方給的是全量的,而且數據是沒有對應排序id、時間之類的,說的白一點就是一條條字符串,但是我們呈現給自己客戶的是要增量數據,所以進行全量比對是不行的,因為太慢了。
所以通過入庫加索引去重這種方式是不可行的。
那么怎么做到,既快速判斷,又增量提取數據呢
思路
這里我們借助redis??set 來實現
下面來看下set概念
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
集合對象的編碼可以是 intset 或者 hashtable。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
借助set ?我們先去判斷數據是否存在。
if (startflag && IsSetContainsItem(textLive, GetCalcMD5(textLive))){//存在continue;}else{startflag = false;//不存在tmaxOrder++;textLive.Order = tmaxOrder;textLiveList.Add(textLive);SetAddSet(textLive);TextLiveBll.InsertQueue(textLive);}public bool IsSetContainsItem(MatTextLive textLive, string value){try{string setId = textLive.MatchId + textLive.Round;return MatchRedisManager.IsSetContainsItem(setId, value);}catch (Exception ex){_Logger.Error(ex.ToString());return false;}}
存在的話,說明之前處理過了,不在處理。
if (startflag && IsSetContainsItem(textLive, GetCalcMD5(textLive))){//存在continue;}
不存在,就添加進去set,然后直接返回客戶,在異步入庫。
else{startflag = false;//不存在tmaxOrder++;textLive.Order = tmaxOrder;textLiveList.Add(textLive);SetAddSet(textLive);TextLiveBll.InsertQueue(textLive);}/// <summary>/// 添加 set/// </summary>/// <param name="textLive"></param>public void SetAddSet(MatTextLive textLive){try{MatTextLive info = new MatTextLive{HomeScore = textLive.HomeScore,MatchId = textLive.MatchId,Round = textLive.Round,TeamPosition = textLive.TeamPosition,Text = textLive.Text,TimeText = textLive.TimeText,VisitScore = textLive.VisitScore};string setId = textLive.MatchId + textLive.Round;string value = MD5Helper.CalcMD5(JsonConvert.SerializeObject(info));MatchRedisManager.AddSet(setId, value);RedisManager.ExpireEntryAt(setId, DateTime.Now.AddHours(6));}catch (Exception ex){_Logger.Error(ex.ToString());}}
這樣,就避免了過多的數據拆分計算或者入庫之類造成的數據延遲之類的,在幾毫秒的時間內就能把數據處理完成,達到業務需求。
                            總結
                            
                                以上是生活随笔為你收集整理的使用Redis set 解决数据的唯一性问题的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。