微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

管理实时流查看器巨大的日志

如何解决管理实时流查看器巨大的日志

我已经为Live Stream开发了一个.NET CORE应用程序,它具有很多功能。其中之一是向客户显示每隔5分钟有多少人在观看。

现在,在5分钟的间隔内,将ViewerIDTimeStamp的每个查看器日志保存到sql Server数据库中。这似乎是一种不好的方法,因为在开始的几天里,我已经在该表中达到了10万行。我需要这些数据,因为我们有一个“时间偷看图表”,可以显示每5分钟有多少人在看谁。

无论如何,有人建议我该如何处理吗?我正在考虑使用具有相同数据的.txt文件,但似乎服务器的I / O也可能是一个问题... 另外,尽管是关于Nosql数据库,也可以使用现有的MongoDB AaS,例如scalegrid.io或mlab.com。

有人可以帮我吗?预先感谢!

解决方法

我认为这与您先前的问题Filter SQL GROUP by a filter that is not in GROUP有关,并且在注释“如何使它变得更好”中扩展了该问题。

下面的答案绝对不是做到这一点的唯一方法-但我认为这是一个好的开始。

当您使用SQL Server进行初始数据存储(每分钟)时,建议您继续使用SQL Server进行下一阶段的数据存储。我认为您需要一个令人信服的论点,以便在下一阶段使用其他功能,因为您随后需要维护这两个功能(例如,使软件保持最新,进行备份等),并获得所有乐趣。在两个软件之间正确传输数据的方法。

我建议的方法是保留所需的最详细/粒度的数据,但仅此而已。

在上一个问题中,您要按分钟保存数据,然后最多计算5分钟。在此答案中,我总结了(并存储了)5分钟括号内的数据,汇总后就丢弃了您的分钟数据。

例如,您可能有一个名为“ StreamViewerHistory”的表,该表具有查看器的ID和时间戳(与原始表非常相似)。

  • 每5分钟每位观看者只有1行。您可以将timestamp字段设置为smalldatetime(因为您不必关心秒),甚至可以将其作为ID值,指向另一个引用每个时间范围的表。我认为smalldatetime较容易开始。
  • 确切地取决于它的使用方式,我建议将主键(或至少聚簇索引)作为ViewerID之前的时间戳-这意味着将新行添加到末尾。它还假设大多数数据查询都首先按时间范围过滤(例如,上周的数据)。
  • 当人们想要查看个人的历史记录时,我会考虑在ViewerId上添加索引,然后在时间戳上添加索引。 例如,
CREATE TABLE [dbo].[StreamViewerHistory](
    [TrackDate] smalldatetime NOT NULL,[StreamViewerID] int NOT NULL,CONSTRAINT [PK_StreamViewerHistory] PRIMARY KEY CLUSTERED 
    (
    [TrackDate] ASC,[StreamViewerID] ASC
    )
GO

CREATE NONCLUSTERED INDEX [IX_StreamViewerHistory_StreamViewerID] ON [dbo].[StreamViewerHistory]
    (
    [StreamViewerID] ASC,[TrackDate] ASC
    )
GO

现在,以某种间隔(作为ping进程的一部分,或定期运行的单独进程)询问源表LiveStreamViewerTracks中的数据,按照上一个问题处理数据,然后保存新表中的结果。然后从LiveStreamViewerTracks删除行以使其更小且可用。确保仅删除相关行(例如,已处理的行)。

上述过程的优点在于,SQL Server可以很好地使用此新表中的数据。每当您需要一张图表时(例如最近14天),它都不需要读取整个表格-而是从相关的日期开始,只读取相关的行。请注意,以确保您的查询可通过以下方式保存:

-- This is SARGable and can use the index
SELECT TrackDate,StreamViewerID
FROM   StreamViewerHistory
WHERE  TrackDate >= '20201001'

-- These are non-SARGable and will read the whole table
SELECT TrackDate,StreamViewerID
FROM   StreamViewerHistory
WHERE  CAST(TrackDate as date) >= '20201001'

SELECT TrackDate,StreamViewerID
FROM   StreamViewerHistory
WHERE  DATEDIFF(day,TrackDate,'20201001') <= 0

通常,如果您希望在给定的时间范围内每5分钟统计一次用户,那么您会遇到类似的情况

SELECT TrackDate,COUNT(*) AS NumViewers
FROM   StreamViewerHistory
WHERE  TrackDate >= '20201001 00:00:00' AND TrackDate < '20201002 00:00:00'
GROUP BY TrackDate

这应该足够好一段时间了。如果您的视图/等的确放慢了速度,则可以考虑采取其他措施来帮助您,例如,您还可以进行进一步的计算/其他报告表,例如也可以使用带有TrackDate和NumViewers的表-每个TrackDate都有一行。报告用户总数时,这应该非常快,但不允许您深入到特定用户。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。