增加计数器但随着延迟减少

increase counter but decrease with DELAY

我想保留一个计数器来查看有多少用户正在调用 Web 服务。 Web 服务几乎在一秒钟内完成。我可以在开始时增加一个变量,在结束时减少,但这不是我想要的。

我需要在开始时增加变量并在 3 秒后减少计数。我考虑过使用缓存过期,但一秒钟内会有超过 1000 次调用,我不想给服务器或内存增加额外的负载。我也知道像 (hangfire) 这样的即发即忘的方法可以工作,但在那种情况下,我需要为每个请求在 class 中 运行 计时器。

另外这个方法必须是线程安全的。我最近使用 Redis,所以如果存在这种功能,它可以成为我的解决方案。我也比较喜欢

目前我做的是: 以创建日期为开头将记录写入数据库 之后删除超过 2 秒的记录 运行 程序

但这会加载数据库,我想不出一个简单的解决方案。

有什么想法吗? 谢谢。

编辑: 我制作了以下示例。继续按增量按钮,大约 90.000 你会在行中得到 "Object variable not set" 错误:

Cache("x") = CInt(Cache("x").ToString) + 1

...

Imports Microsoft.VisualBasic
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Web.Hosting

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub cmdIncrement_Click(sender As Object, e As EventArgs) Handles cmdIncrement.Click
        For i As Integer = 1 To 10000
            If Cache("x") Is Nothing Then Cache("x") = 0
            Cache("x") = CInt(Cache("x").ToString) + 1
            fireit()
        Next
        getvalue()
    End Sub
    Protected Sub cmdRefresh_Click(sender As Object, e As EventArgs) Handles cmdRefresh.Click
        getvalue()
    End Sub
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        getvalue()
    End Sub
    Protected Sub getvalue()
        If Cache("x") Is Nothing Then Cache("x") = 0
        Label1.Text = Cache("x").ToString & " - " & Now.ToString
    End Sub
    Protected Sub fireit()
        HostingEnvironment.QueueBackgroundWorkItem(Function(token) DecrementMyVariable("aaa", token))
    End Sub

    Protected Shared Async Function DecrementMyVariable(text As String, token As CancellationToken) As Task(Of String)
        Await Task.Delay(5000)
        Dim x As Integer = CInt(HttpRuntime.Cache("x").ToString)
        HttpRuntime.Cache("x") = x - 1
        Return "aaa"
    End Function

End Class

您只想将每次调用该服务的日期和时间存储到日志中。然后,您可以在给定的时间段内绘制它。将详细信息保存到 CSV 文件,您可以查看 Excel.

中的数据

您可以将其存储到数据库中,然后查询数据库以查找最近三秒内的所有呼叫。

只需在内存中执行您当前在数据库中执行的操作即可。创建共享 List(Of Date) 对象。每次调用任何方法时,将 Date.Now 添加到该列表。然后有一个每秒触发的计时器,它会从该共享列表中删除任何早于您所需的三秒阈值的项目。任何时候你想获得当前的用户数,你可以只读那个列表的 Count 属性。将 SyncLock 放在您修改或访问该列表的所有位置周围,以使其线程安全。