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

前言

最近遇到一个问题,就是接收第三方数据的时候,

54a84594cc295baacec2ecb6d8f01e8b.png

类似这种直播数据,由于业务的缘故,导致对方给的数据每次都是全量的,

而且请求很频繁,有时候一秒好几十次。直播数据一般都是刷刷刷的,这个大家或多或少有看比赛,会知道。

对方给数据的模式

第一次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());}}

这样,就避免了过多的数据拆分计算或者入库之类造成的数据延迟之类的,在几毫秒的时间内就能把数据处理完成,达到业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql集群从节点无法启动_一次galera cluster集群故障节点无法启动问题排查

现象环境&#xff1a;Server version: 10.0.25-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e配置文件&#xff1a;[rootnode-23 mariadb]# more /etc/my.cnf[mysqld]server_id3bind_address node-23port 3306datadir/var/lib/mysqllog-error/var/log/mariadb/mariadb…

DbVisualizer 8 解决中文乱码问题

DbVisualizer 8 解决中文乱码问题 原文http://blog.chinaunix.net/uid-26640696-id-3128544.html 在SQL Commander中&#xff0c;sql语句中如果有中文&#xff0c;显示是‘口口口’。解决办法如下&#xff1a; 在Tools->tool Properties->General->Appearance->Fon…

webform 页面传值的方法总结

ASP.NET页面之间传递值的几种方式 页面传值是学习asp.net初期都会面临的一个问题&#xff0c;总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说&#xff0c;常用的较简单有QueryString&#xff0c;Session&#xff0c;Cookies&#xff0c;Application…

【转】Android编程点滴(14) -- Android中资源文件夹res/raw和assets的使用

*res/raw和assets的相同点&#xff1a; 1.两者目录下的文件在打包后会原封不动的保存在apk包中&#xff0c;不会被编译成二进制。 *res/raw和assets的不同点&#xff1a;1.res/raw中的文件会被映射到R.java文件中&#xff0c;访问的时候直接使用资源ID即R.id.filename&#xff…

iNeuOS工业互联网操作系统,智慧用电测控应用案例

目 录1. 概述... 22. 系统部署结构... 23. 用电测控终端... 34. 系统应用介绍... 61. 概述通过物联网技术对引发电气火灾的主要因素(导线温度、电流和漏电流等)进行不间断的数据跟踪与统计分析&#xff0c;实时发现电气线路和用电设备存在的安全隐…

mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)

MySQL数据库概述MySQL数据库是经典的关系型数据库管理系统&#xff0c;MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件。MySQL是一款…

出现了!豆瓣最高9.9分,2020年最值得看的美剧!你居然还没看过?【内附资源】...

全世界只有3.14 % 的人关注了爆炸吧知识在调性普遍黄暴烧脑的美剧大流中&#xff0c;《This is us》没有大牌主演&#xff0c;没有炫酷特效&#xff0c;却让观众集体沦陷&#xff0c;被称为5年难得一见的美剧。有人说&#xff0c;这是「有生之年看过的最温柔的美剧」。但它取得…

静态注册BroadcastReceiver内部类

先看代码&#xff1a; [java] view plaincopy public class ZonePicker { public static class SetDefaultTimeZone extends BroadcastReceiver{ Override public void onReceive(Context context, Intent intent) { // TODO Auto-gener…

Excel VBA - Workbook对象

来源&#xff1a;http://blog.csdn.net/alexbnlee/article/details/6911204 Workbooks(1).Name Workbooks(1).FullName 工作簿地址加名字 Workbooks(1).Path 工作簿地址 Workbooks(1).Close SaveChanges:False 关闭工作簿&#xff0c;并且不保存 Workbooks.Open ThisW…

C# 修改配置文件进行窗体logo切换

01—前言&#xff1a;题外的话大家可能发现这个号现在原创越来越少了&#xff0c;其实小编并没有放弃持续更新&#xff0c;只是把一手原创放到了 【dotnet编程大全】这个号了&#xff0c;那个号目前原创主要更新的是wpf mvvm方面的知识&#xff0c;框架用的Caliburn.Micro&…

数学有趣地超乎你的想象

全世界只有3.14 % 的人关注了爆炸吧知识说起数学你是拒绝还是喜欢看完这一组&#xff0c;对于数学他的震撼、霸气、美来感受下哇1三角形内角和为1802多边形外角和为360&#xff08;图来源于可乐学习&#xff09;3怎样将一个正三角形剪拼成正方形&#xff1f;4怎样把两正方形剪拼…

bitset 运算

C提供bits类&#xff0c;支持位向量的操作。 引入头文件bitset &#xff1a; #include <bitset> 定义bitset变量 bitset<位向量长度><变量名>&#xff1b; 默认变量所有位都被初始化为0 有两种初始化方式 用一个无符号整数作参数&#xff0c;bitset前N位将被…

phpcms2008常用函数

{$head[title]} 页面标题&#xff0c;用法&#xff1a; <title>{$head[title]}-{$PHPCMS[sitename]}</title> {$PHPCMS[sitename]} 网站名称 用法&#xff1a;<title>{$head[title]}-{$PHPCMS[sitename]}</title> {$head[keywords]} 关键字 用法&#…

“”和“” java

“>>”算术右移运算符, 表示带符号右移&#xff0c;它使用最高位填充移位后左侧的空位。右移的结果为&#xff1a;每移一位&#xff0c;第一个操作数被2除一次&#xff0c;移动的次数由第二个操作数确定。按二进制形式把所有的数字向右移动对应巍峨位数&#xff0c;低位移…

使用C#像google/zx一样编写脚本

google/zxzx是谷歌开源的一个能够帮助开发者快速编写脚本的工具&#xff0c;它使用JavaScript作为编程语言。示例脚本如下&#xff1a;#!/usr/bin/env zxawait $cat package.json | grep namelet branch await $git branch --show-current await $dep deploy --branch${branch…

redis 查询缓存_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....

在实际的工作项目中&#xff0c; 缓存成为高并发、高性能架构的关键组件 &#xff0c;那么Redis为什么可以作为缓存使用呢&#xff1f;首先可以作为缓存的两个主要特征&#xff1a;在分层系统中处于内存/CPU具有访问性能良好&#xff0c;缓存数据饱和&#xff0c;有良好的数据淘…

5部适合学英语的动画电影,快和孩子一起看!

全世界只有3.14 % 的人关注了爆炸吧知识今天我们与大家分享5部非常适合小学生学习英语的动画电影&#xff0c;家长们可依据不同类别和主题为孩子挑选喜欢的影片&#xff0c;在家陪孩子一起观看。文末可免费领取哦~01 《丁丁历险记》讲述的是一天丁丁买了一只古老的船模送给船长…

OC面向对象—封装

OC面向对象—封装 一、面向对象和封装 面向对象的三大特性&#xff1a;封装&#xff08;成员变量&#xff09;、继承和多态 在OC语言中&#xff0c;使用interface和implementation来处理类。 interface就好像暴露在外面的时钟表面&#xff0c;像外界提供展示以及接口。implemen…

如何把 .NET 进程中的所有托管异常找出来?

大家应该知道 .NET异常 本质上就是一个 Object 对象&#xff0c;也就是说只要你执行了 new XXException() 语句&#xff0c;那么它就会分配到 GC Heap 上。这也就意味着&#xff0c;如果你有一个进程的dump文件&#xff0c;那你就可以从dump中导出程序最近都抛了什么异常&#…

编程题: 将一个矩阵(二维数组)顺时针旋转90度

在一个m*n的矩阵任取一个元素(i, j)&#xff0c;发现旋转后对应的元素下标变成:(j, m-i)。 进一步研究一下矩阵的各种翻转可知:沿左上到右下的对角线翻转&#xff1a;(i, j)与(j, i)对换; 沿右上到左下的对角线翻转&#xff1a;(i, j)与(n-j, m-i)对换;上下翻转&#xff1a;(i,…