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

 更新时间:2015年03月17日 15:04:39   投稿:hebedich  
往往大数据量,高并发时, 瓶颈都在数据库上, 好多人都说用数据库的复制,发布, 读写分离等技术, 但主从数据库之间同步时间有延迟.

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

假设(非完全正确数据,仅做示例):
每秒支持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#的高并发编程能够有所帮助。

相关文章

  • C# 获取硬盘号,CPU信息,加密解密技术的步骤

    C# 获取硬盘号,CPU信息,加密解密技术的步骤

    这篇文章主要介绍了C# 获取硬盘号,CPU信息,加密解密技术的步骤,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2021-01-01
  • WPF自定义TreeView控件样式实现QQ联系人列表效果

    WPF自定义TreeView控件样式实现QQ联系人列表效果

    TreeView控件在项目中使用比较频繁,下面这篇文章主要给大家介绍了关于WPF自定义TreeView控件样式实现QQ联系人列表效果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-04-04
  • C#新手常犯的错误汇总

    C#新手常犯的错误汇总

    这篇文章主要介绍了C#新手常犯的错误汇总,对于经验丰富的C#程序员同样具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C#难点逐个击破(1):ref参数传递

    C#难点逐个击破(1):ref参数传递

    一般情况,方法的参数传递是通过值进行传递的,另一种情况是引用传递,大家可以参考下。
    2010-02-02
  • 基于Unity3D实现仿真时钟详解

    基于Unity3D实现仿真时钟详解

    这篇文章主要为大家详细介绍了如何利用Unity3D模拟实现一个简单是时钟效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • 简单学习C#中的泛型方法使用

    简单学习C#中的泛型方法使用

    这篇文章主要介绍了C#中的泛型方法使用,需要的朋友可以参考下
    2016-02-02
  • C#如何使用SHBrowseForFolder导出中文文件夹详解

    C#如何使用SHBrowseForFolder导出中文文件夹详解

    这篇文章主要给大家介绍了关于C#如何使用SHBrowseForFolder导出中文文件夹的相关资料,文中通过示例代码介绍的非常详细,对大家的学习合作工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • C#绘图基本方法实例总结

    C#绘图基本方法实例总结

    C#要实现简单的画图功能可以利用Graphics这个类,下面这篇文章主要给大家介绍了关于C#绘图基本方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • C#判断字符串是否存在字母及字符串中字符的替换实例

    C#判断字符串是否存在字母及字符串中字符的替换实例

    这篇文章主要介绍了C#判断字符串是否存在字母及字符串中字符的替换,实例形式讲述了C#针对字符串的正则操作,需要的朋友可以参考下
    2014-10-10
  • C#使用动态规划解决0-1背包问题实例分析

    C#使用动态规划解决0-1背包问题实例分析

    这篇文章主要介绍了C#使用动态规划解决0-1背包问题,实例分析了C#动态规划算法的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论