往往大数据量,高并发时, 瓶颈都在数据库上, 好多人都说用数据库的复制,发布, 读写分离等技术, 但主从数据库之间同步时间有延迟.代码的作用在于保证在上端缓存服务失效(一般来说概率比较低)时,形成倒瓶颈,从而能够保护数据库,数据库宕了,才是大问题(比如影响其他应用)。

假设(非完全正确数据,仅做示例):
每秒支持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
}
}
}

  

最新文章

  1. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
  2. [转]Zabbix 3.0 安装笔记
  3. rbenv安装ruby2.3.0在线安装不上。老子出绝招了(更新)
  4. 超大整数运算算法——为RSA加密算法提供运算工具
  5. datatables 服务器返回数据后的处理-表格数据属性的操作方法(ajax.dataSrc)
  6. System Operations on AWS - Lab 5W - Managing Resources (Windows)
  7. java 从jar包中读取资源文件
  8. USACO 3.2 Factorials
  9. view类的XML属性
  10. javascript之页面打印
  11. java学习笔记04-基本数据类型
  12. python数据结构-如何实现用户的历史记录功能
  13. 微生物组学数据分析工具综述 | 16S+宏基因组+宏病毒组+宏转录组--转载
  14. 无网情况下linux安装django
  15. 包含 PHP和nginx的镜像 supervisord.conf Dockerfile 案例
  16. leetcode笔记:Validate Binary Search Tree
  17. zigzag方式编码
  18. eclipse中设置文件的编码格式为utf-8
  19. 【DOS】COPY命令
  20. 【医学图像】3D Deep Leaky Noisy-or Network 论文阅读(转)

热门文章

  1. DP简单问题联系--最长递增子序列+最长公共子序列等
  2. HDU1598【最小生成树拓展】
  3. Mecanim动画系统 - 在角色上使用Mask 叠加动画层
  4. 一文解析总结Java虚拟机内存区域模型
  5. C#求圆的周长、面积、体积
  6. SparkR安装
  7. Python爬虫|爬取喜马拉雅音频
  8. socket编程模拟linux下的ssh代码实现
  9. 用注解@DelcareParents实现引用增强
  10. Mysql之Union用法