日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

使用Redis set 解决数据的唯一性问题

發布時間:2023/12/4 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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 解决数据的唯一性问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。