关于MongoDB的全局锁

对MongoDB有所了解的人都知道,MongoDB有一个让人头疼的全局锁(读写锁,允许并发读,而写会阻塞所有的读写),要命的是这个锁不是表级的,不是库级的,而是整个Server级别的,这让人听起来是不是非常的蛋疼。

在2.0版本以前,这一问题一直没有得到解决,于是有人提出,在可预见某个update操作的记录可能在磁盘上时,为了减少写锁占用的时间,可以采用先读后写的方式,通过先读一次,将要操作的记录加载到内存中,再进行内存中的update,这样写锁就不包括将数据从磁盘加载到内存的时间了。

在可预见数据冷热的情况下,这种操作能够有一定的效果,但是很明显,这种变态的方法不应该是一个终极解决方案。

值得庆幸的是,在2.0版本中,MongoDB宣称有很大程度的并发性能提升,而这一提升的基础正是解决了这个全局锁的问题。

解决的方法并不是通过减少锁粒度来解决,虽然collection级别的锁机制也正在开发中。(SERVER-1240)

解决方法是通过对一些可能造成长时间锁占用的操作进行锁抑制。比如和我们上面的方法类似,在进行update操作时,如果发现需要更新的记录在磁盘上,那么这个锁就不会一直占用,而是等到将数据从磁盘加载到内存后再添加写锁进行update。

而同理,对于其它一些可能耗时比较长的操作也可以采用类似的方法,通过将长时间占用的全局锁拆分成多个细粒度的小锁来使需要获取锁来进行的操作能够交错的执行,从而避免一夫当关万夫莫开的情况,主要包括下面一些操作:

查询操作

批量更新操作

批量删除操作

批量insert写入操作

阅读全文

一条SQL

今天上午在一个JAVA群里,有人问了一个关于sql的问题,他用的应该是oracle或者DB2之类的数据库,偶也不清楚,就变变数据类型,用mysql做例子吧。大概也就是这个意思,要把如下的一个形式的表数据,

通过一条SQL,查询出需要的结果,需要的结果是这个样子:

阅读全文

php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数。

例如:

由于IP转换成的整型值太大超出了整型的范围,所以变成负数。需写成$ip_n = bindec(decbin(ip2long($ip)));这样便可得到无符号的整型数,如下所示:

阅读全文

千万级访问量架构

1、HTML 静态化

其实大家都知道,效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单 的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无 法全部手动去挨个实现,于是出现了我们常见的信息发布系统 CMS,像我们常 访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统 来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面, 还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有 一套高效、可管理的 CMS 是必不可少的。除了门户和信息发布类型的网站,对 于交互性要求很高的社区类型网站来说, 尽可能的静态化也是提高性能的必要手 段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是 大量使用的策略,像 Mop 的大杂烩就是使用了这样的策略,网易社区等也是如 此。同时,html 静态化也是某些缓存策略使用的手段,对于系统中频繁使用数 据库查询但是内容更新很小的应用,可以考虑使用 html 静态化来实现,比如论 坛中论坛的公用设置信息, 这些信息目前的主流论坛都可以进行后台管理并且存 储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考 虑将这部分内容进行后台更新的时候进行静态化, 这样避免了大量的数据库访问 请求。

阅读全文

1、PowerDesigner使用MySQL的auto_increment

◇问题描述:

PD怎样能使主键id使用MySQL的auto_increment呢?

◇解决方法:

打开tableproperties窗口→columns→选中id列→打开columnsproperties窗口→勾选identity即可

注意:概念模型没有此选项,物理模型才有

2、PowerDesigner去掉SQL脚本中的双引号

◇问题描述:

PD生成Oracle数据库建表SQL时,默认会给表名和字段名加上双引号,怎样能去掉SQL脚本中的双引号呢?

◇解决方法:

把Database→EditCurrentDBMS→General→Script→Sql→Format→CaseSensitivityUsingQuote设置为NO即可

阅读全文

在调用如下mysql语句时:

提示

出现该错误,是由于在该mysql语句中使用同一个表用了两次,导致前后发生歧义,解决办法就是给其中一个表或者两个表 起一个别名即可,

如下语句可以解决该问题:

阅读全文

作者的图片

DigDeeply

Technology Stack: Golang/PHP/Openresty, and so on…

Web Development Engineer

Beijing China