c#编写的高并发数据库控制访问代码

作者:hebedich 时间:2024-01-16 04:57:04 

代码的作用在于保证在上端缓存服务失效(一般来说概率比较低)时,形成倒瓶颈,从而能够保护数据库,数据库宕了,才是大问题(比如影响其他应用)。

假设(非完全正确数据,仅做示例):
每秒支持10,000,000次查询(千万);
一次读库需要耗时:1ms;
修改内存变量需要耗时:0.001ms;
那么:
每秒最终访问的数据库的请求数量 < 1000
其他的9,900,000个请求会返回到其他页面。这就是为啥很多抢单网站有人可以访问,而有人得到繁忙中页面的原因。

微观到1ms来看,在currentValidSessionID == -1的时间是 1ms,从而平均会有10000条记录涌入。
currentValidSessionID从-1变为其他值的时间为0.001ms,这个时间内,


  lock (databaseDoor)
  {
    // now there is only one request can reach below codes.
    if (currentValidSessionID == -1)
    {
      currentValidSessionID = currentRequest.SessionID;
    }
  }

平均会有 10000×0.001=10条记录会执行到上述这段代码,操作系统会为锁形成等待序列。
那么我们的目标是,每毫秒只允许一次读库(因为其他应用也会使用),所以我们只希望这进入的10条,最终只有一条能够继续前进。
那么这就是


if (currentValidSessionID == -1)
{
}

的作用了。再次进行一次判断,进入原子保护队列的请求,也只有一个能够继续。

一点思考:
其实对于一个主频能上N GHz的服务器来说,一个内存数赋值给另一个内存数据就是1~4条指令(平均2条,两次MOV操作),也就是2/N ns时间,而不是我们上述假设的 1000ns(0.001ms)。其实不用原子,我们已经可以把千亿级请求的访问数控制在个位数。
不过一个架构师,如果可以用一个99.99%安全的方案,就绝对不用99.9%。 SO。


public static long currentValidSessionID = -1;
public static object databaseDoor = new object();
void readDatabase(Request currentRequest)
{
    // use currentValidSessionID to filter out other requests came in during the execute time gap
    if (currentValidSessionID == -1)
    {
        // use object-lock to filter out other requests came in during the variable change time gap.
        lock (databaseDoor)
        {
            // now there is only very little number of requests can reach below codes.
            if (currentValidSessionID == -1)
            {   // now there will be only one request can access the database
                currentValidSessionID = currentRequest.SessionID;
            }
        }
    }
    if (currentValidSessionID == currentRequest.SessionID)
    {   // here is the one !
        try
        {
            // use transaction to guarantee the execute time to void block
            // access database codes go here
        }
        catch()
        {
            // exception codes go here
        }
        finally
        {
            currentValidSessionID = -1;  // recover to original state
        }
    }
}

标签:C#,高并发,数据库
0
投稿

猜你喜欢

  • Python根据指定日期计算后n天,前n天是哪一天的方法

    2022-12-27 19:13:50
  • vue3如何实现挂载并使用axios

    2023-07-02 16:46:06
  • ASP Application 对象用户手册

    2008-10-23 13:59:00
  • 几个简单的基本的sql语句

    2024-01-20 18:55:58
  • 详解Python odoo中嵌入html简单的分页功能

    2021-05-21 12:24:06
  • Windows 64位下python3安装nltk模块

    2023-11-20 09:42:12
  • go语言优雅地处理error工具及技巧详解

    2023-07-16 18:56:56
  • 基于hashlib模块--加密(详解)

    2023-10-08 15:46:29
  • pandas group分组与agg聚合的实例

    2023-01-04 14:22:28
  • Golang调用FFmpeg转换视频流的实现

    2024-04-30 10:01:43
  • Echarts实现单条折线可拖拽效果

    2024-04-10 13:59:17
  • 一篇文章搞定Mysql日期时间函数

    2024-01-20 19:32:58
  • Jupyter Notebook的连接密码 token查询方式

    2023-10-21 23:51:47
  • SQL Server 作业同步 (结合备份作业)

    2012-07-11 15:59:47
  • JS实战篇之收缩菜单表单布局

    2024-04-18 09:47:43
  • PyCharm-错误-找不到指定文件python.exe的解决方法

    2022-04-20 00:48:10
  • 在Pycharm中修改文件默认打开方式的方法

    2023-03-12 06:34:23
  • 用SQL语句生成带有小计合计的数据集脚本

    2009-01-06 11:33:00
  • Python安装.whl文件流程以及问题解决方法

    2022-10-24 15:15:23
  • JS关于 replace 取值、替换第几个匹配项问题小结

    2024-04-25 13:11:05
  • asp之家 网络编程 m.aspxhome.com