在MongoDB中实现乐观并发控制

说起来,自从接触了MongoDB以后,我在大小项目中就再也没有 接触过关系型数据库了。性能倒不是什么主要问题,主要是方便,例如我可以在MongoDB中直接保存数组,然后把其中的元素当作查询条件,而在关系型数据 库中,则需要使用额外的表格,然后再JOIN等等。当然,在MongoDB中很难进行JOIN,于是对于某些场景下会略显麻烦,但在记忆中我似乎真没什么 束手束脚的情况。这方面我还没有仔细分析,可能MongoDB支持保存复杂对象会有所帮助吧。以上都是废话,这里我简单谈一下如何在MongoDB中实现乐观并发控制。当然加入您对MongoDB的功能都有所了解,那么这种做法也是十分显而易见的。 简单地说,“并发控制”便是避免在并发环境下某条记录被错误地覆盖。例如在一次“读取”、“修改”、“提交”的事务中,除非进行合理控制,否则可能 其中某次提交的数据就遗失了。所谓“悲观”并发控制,则意味着在某次事务的“开始”和“提交”之间不会出现任何“读取”操作(即这条记录被锁定了),这自 然不会有问题。而乐观并发控制,则保证的是在某次“读取”和“提交”之间没有进行任何“提交”操作,否则便会提交失败,于是当前事务便会重新从“读取”这 个最早的步骤开始。此类概念(或者说并发处理方式)在许多地方都有体现,例如在普通的并发编程中,lock就近似于“悲观”并发控制,而“软件事务内存”则类似于“乐观”并发控制。 如果要在普通的关系型数据库里实现乐观并发控制,我们一般需要为其加上一个额外的Version字段,它是整型,也可能是个时间戳。在更新某条记录 时,我们将这个字段的“旧值”作为UPDATE语句的条件之一,同时这个字段也会写入新的值。如果这次更新影响了某条记录,那么表示更新成功,反之则表示 这条记录已经被删除,或是在“读取”和“提交”之间遇到了其他提交操作。在SQL Server中存在一个Timestamp类型,这个类型的字段会在记录修改时自动更新。 在MongoDB中的做法也没有太大区别,只是它的update语句并不会返回它所影响的记录数,于是我们必须额外进行一次查询,例如文档上所记载: > t.update({_id: 1, version: 3}}, {$set: {Content: “New Content”, version: 4}}); > db.$cmd.findOne({getlasterror: 1}); {“err”:, “updatedExisting”: true, “n”: 1 , “ok”: 1} // it worked > t.update({_id: 1, version: 3}}, {$set: {Content: “New Content”, version: 4}}); > db.$cmd.findOne({getlasterror: 1}); {“err”:, “updatedExisting”: false, […]

CTO谈豆瓣网和校内网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。洪强宁,2002年毕业于清华大学,现任北京豆瓣互动科技有限公司首 席架构师。洪强宁和他带领的技术团队致力于用技术改善人们的文化和生活品质,在网站架构、性能、可伸缩性上进行深入研究。豆瓣网曾获软件中国2006年度 最佳技术应用网站。

参考的文章–又拍云实战

今年秋天,加入猛买之后,遇到的第一个挑战就是图片托管。当时,网站流量快速增长,原有服务器几次增加带宽依然无法满足需求,流量常常跑满。现在回头总结一下,像我们这样的小公司,自己维护静态资源服务器大致有这些不爽: 峰值带宽决定大部分成本 如果峰值带宽在20Mb,那就得买20Mb,哪怕在凌晨只有几百Kb。 运维的成本不可忽视 除了买带宽,还得时时处处留意服务器运行情况、网卡流量、安全状况等,也需要持续投入。 单机达不到CDN的功效 虽然我们用的机房速度和稳定性都不错,但毕竟是单机,无法保证全国各地的访问速度。 后来,我通过@Fenng联络到了@gofeeling和又拍,正赶上又拍云处在最后测试阶段,我们成了又拍云第一批用户。又拍云(以下简称为UpYun)恰好为我们解决了上面的问题。 按需付费,带宽需求再高,也只需要按流量付费,据粗略计算成本低至原先三成; 抛开运维负担,如不放心,配置几个URL监控即可; CDN不再是问题,不同地区的用户都能享受到最好的访问速度。 在两个月的使用过程中,UpYun确实出现过2次不稳定的状况,但又拍同学们都很及时地解决了。正式上线后,稳定性极佳,到目前为止可用率高达100%。 这篇文章主要是从用户的角度谈谈UpYun的特点和使用技巧,让对UpYun感兴趣的朋友们更好地了解这个平台,可以加深了解,更好地使用它。UpYun目前提供的是文件存储+CDN的服务,可以认为是AWS的S3+CloudFront,但实际用起来,有些细节上的不同。 0、与众不同的Bucket 和一般云存储服务提供的Bucket不同,UpYun中的Bucket分为文件类和图片类。文件类Bucket可以存放任何文件;图片类Bucket仅能存放图片文件,妄图上传其他类型会被拒绝。每个Bucket都可以绑定多个域名。 1、文件增量同步 使用第三方服务托管静态资源,都会有文件同步的需求。那么,放在主服务器的文件,如何同步到UpYun呢?又拍官方提供了两种方式:FTP和API。API功能强大,但是需要做开发,目前还没人开发出类似s3cmd这样的工具;FTP命令功能有限,想用原生的几个命令辗转腾挪实现sync很费劲(不切实际地想,如果支持rsync就好了)。 我们在实际使用时,利用了lftp的mirror命令,通过FTP协议实现了文件增量同步。再配合crontab,就能做到定时增量同步了。这样既避免了投入精力围绕API做开发,又能达到rsync的效果。下面是一个脚本示例供参考: #!/bin/bash HOST=”v0.ftp.upyun.com” USER=”username” PASS=”password” LCD=”localpath” RCD=”remotepath” lftp -c “open ftp://$HOST; user $USER $PASS; lcd $LCD; cd $RCD; mirror –reverse –delete –dereference –verbose –exclude-glob=*.php”

Buddy框架图片文件云存储模块实现

去试试又拍云存储的服务http://www.upyun.com/,就去注册然后申请试用了。 本次upyun.com的认证方式很让我意外,竟然是客服打电话过来确认,这点服务感觉还是挺好的,从这里感觉还是蛮重视用户的。特别要说的是,今天是星期天我又在这里宣传upyun.com的服务,就和同事说了下,结果他去注册了,竟然在半小时后就接到了客服人员的电话了,感觉这个确认还是很及时的,体验很好,这点感觉还是很不错的。 试用就开始吧,为什么要试用又拍云存储服务呢?这里我做归纳补充下: 1,图片服务器的托管及运维费用挺高的,而且峰值带宽觉得了大部分成本,且运维的软硬成本增大 2,单机达不到CDN功效,需要CDN支持的话,花费就更大了 3,图片的处理及图片的缓存,需要配置nginx的静态缓存图片,需要做系统设计扩展图片类的保存图片及缩略图功能 4,图片的备份,对于图片的备份是个问题需要用rsync同步到备份机器,添加了运维成本和开发成本  基于以上原因,自己开发及部署图片服务的代价还是很大的,所以这个也是极力推荐使用又拍云存储www.upyun.com的原因了,至于大家说的upyun.com是否稳定,磊哥提到的猛买网用了2个月还是没问题的,我也相信@gofeeling和又拍的技术实力的。 如何申请及开通就请详细参看磊哥的博文吧,本篇主要更细致化的讲解技术实现。 首先,设计表结构 id,filename,desc,createtime,status,remoteurl,url,model,user_id 本次主要用到的字段有 filename 及 model 构造图片的访问地址 $staticUrl / $model / $filename 例如: http://img001.img.woshimaijia.com/user/testuser.jpg 考虑到图片表可能进行分表,这里的id使用了 17位的bigint 时间递增

php+mysql注入详细

前言   2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早 的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个 技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击 也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说 说其定义和原理。如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺。权当指点小弟。 关于php+Mysql的注入   国内能看到php+Mysql注入的文章可能比较少,但是如果关注各种WEB程序的漏洞,就可以发现,其实 这些漏洞的文章其实就是一个例子。不过由于国内研究PHP的人比研究ASP的人实在少太多,所以,可能没 有注意,况且PHP的安全性比ASP高很多,导致很多人不想跨越这个门槛。   尽管如此,在PHP站点日益增多的今天,SQL注入仍是最有效最麻烦的一种攻击方式,有效是因为至少 70% 以上的站点存在SQLInjection漏洞,包括国内大部分安全站点,麻烦是因为MYSQL4以下的版本是不支 持子语句的,而且当php.ini里的magic_quotes_gpc 为On 时。提交的变量中所有的 ‘ (单引号), ” (双 引号), (反斜线) and空字符会自动转为含有反斜线的转义字符。给注入带来不少的阻碍。   早期的时候,根据程序的代码,要构造出没有引号的语句形成有效的攻击,还真的有点困难,好在现 在的技术已经构造出不带引号的语句应用在某些场合。只要有经验,其实构造有效的语句一点也不难,甚 至成功率也很高,但具体情况具体分析。首先要走出一个误区。 注:在没有具体说明的情况下,我们假设magic_quotes_gpc均为off。 php+Mysql注入的误区   很多人认为在PHP+MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以使用 “declare@a sysname select @a=<command> execmaster.dbo.xp_cmdshell@a”这类的命令来消除引号, 其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。   为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有字符串均是常量,即使是dir这样 的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码: $command = “dir c:”; system($command);   否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们 构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?什么时候不用 呢?看看下面两句SQL语句: ①SELECT * FROM article WHERE articleid=’$id’ ②SELECT * FROM article […]

新一轮“苹果大战”在即 三运营商齐招手iPhone5

 南都讯 记者汪小星 实习生余婷 三大运营商高层近日均公开表示与iPhone合作的意向,摩拳擦掌抢食“苹果”。   中国联通董事长常小兵日前在香港召开的股东大会上表示,联通正在考虑引入苹果新一代iPhone手机。就在上周,移动和电信的高层不约而同地透露了与苹果合作引入iPhone的情况。对此,常小兵认为,移动、电信争夺iPhone是大势所趋。   新一代iPhone即将诞生,联通在国内iPhone江湖中一家独大的地位很有可能被打破。新一轮“苹果大战”不可避免。   中国联通董事长常小兵日前在香港表示,如果苹果推出iPhone5,将会考虑引入。目前iPhone销售策略合适,暂未有计划改变。而中国联通总经理陆益民透露,iPhone对联通3G业务推动很大,联通目前iPhone用户平均月增30万至40万。   倘若竞争对手都引入iPhone,联通要如何应对?常小兵回应,竞争对手引入iPhone是大势所趋,除了苹果,联通还将加强与其他手机厂商的相关合作。   “中国移动需要让我们的客户能够使用iPhone,而苹果当然不会放弃中国移动6亿用户这个市场。”中国移动集团董事长王建宙日前亦在股东大会上首度明确表示,中国移动已经与苹果公司达成共识,苹果未来将推出TD-LTE制式的iPhone手机。   王建宙称,目前使用iPhone的中国移动用户超过400万。而早在2007年中国移动就曾与苹果谈判,只可惜双方谈判一度破裂,联通抓住时机火速牵手iPhone。经过4年反复拉锯,中国移动似乎再也不想错失iPhone,希望在明年TD-LTE网络正式商用时,推出TD-LTE制式的新一代iPhone。   中国电信也不甘落后。中国电信董事长王晓初日前公开表示,公司目前正在就引入CDMA制式的iPhone与苹果密切接触,但基于保密协议不能就有关内容或进度做出评论。   早在今年2月,CDMA版本的iPhone4就已在美国上市。此前,也曾传出中国电信为iPhone4用户提供烧号服务。据悉,安徽、广东、江苏等电信公司经过调试,已对CDMA版iPhone4成功写号。   (本文来源:南方都市报 )

iPhone

iPhone由苹果公司(Apple, Inc.)首席执行官史蒂夫·乔布斯在2007年1月9日举行的Macworld宣布推出,2007年6月29日在美国上市,将创新的移动电话、可触摸宽屏iPod以及具有桌面级电子邮件、网页浏览、搜索和地图功能的突破性因特网通信设备这三种产品完美地融为一体。iPhone引入了基于大型多触点显示屏和领先性新软件的全新用户界面,让用户用手指即可控制iPhone。iPhone还开创了移动设备软件尖端功能的新纪元,重新定义了移动电话的功能。 iPhone是结合照相手机、个人数码助理、媒体播放器以及无线通信设备的掌上设备,由苹果公司(Apple, Inc.)首席执行官史蒂夫·乔布斯(Steve Paul Jobs)在2007年1月9日举行的Macworld宣布推出,2007年6月29日在美国上市。   iPhone是一部4频段的GSM制式手机,支持EDGE和802.11b/g无线上网(iPhone3G/3Gs/4支持WCDMA上网,iPhone4支持802.11n),支持电邮、移动通话、短信、网络浏览以及其他的无线通信服务。iPhone没有键盘,而是创新地引入了多点触摸(Multi-touch)触摸屏界面,在操作性上与其他品牌的手机相比占有领先地位。   iPhone包括了iPod的媒体播放功能,和为了行动设备修改后的Mac OS X操作系统(iOS,本名iPhone OS,自4.0版本起改名为iOS),以及200万像素的摄像头。(一代、二代为200万,3Gs为320万,支持自动对焦,4代提升到背照式500万 )此外,设备内置有感应器(即所谓的重力感应),能依照用户水平或垂直的持用方式,自动调整屏幕显示方向。并且内置了光感器,支持根据当前光线强度调整屏幕亮度。还内置了距离感应器,防止在接打电话时,误触屏幕引起的操作。iPhone(4代)使用1GHz Apple A4处理器。   移动电话、宽屏 iPod 和上网装置 ─ iPhone 将三大功能集于一身,通过多点触摸( Multi-Touch) 技 术,手指轻点就能拨打电话、应用程序之间也易如反掌。还可以直接从网站拷贝粘贴文字和图片。   短信和彩信通过短信和彩信直接发送文字、照片、音频、视频和联系人信息。还可以转发整段对话或其中的重要部分,Spotlight Search 可以让你在同一个地方搜遍 iPhone 中的各种不同内容,包括联系人、电子邮件、日历以及备忘录等等。用语音备忘录随时随地记录并分享你的灵感、备忘事宜、会议记录或任何录音。   现在中国大陆iPhone使用率已经非常高了,在各个时尚潮人,明星,高层之中普及率更高。它被定义为一种高品味的象征。很多网站,实体店等等有有iPhone配件以及整机出售,为中国的通讯产业的发展做出了巨大的贡献。同时也解决了不少人的就业问题。iPhone无疑是非常伟大的跨时代产品,甚至有人打出“无所不能的iPhone”这样的口号。 iphone(16张)至今仍没有一款手机可以在用户体验上超越iphone!目前在APP store上的软件已经达到几十万,全球累计下载量超亿次。 部分运营iPhone的通信商    iphone的通信商 AT&T Mobility、Verizon O2 T-Mobile Orange、SFR、Bouygues Vodafone Optus 3(和记电讯国际)、数码通(VODAFONE沃达丰) 中国联通 中华电信 编辑本段上市时间    苹果手机靓图(11张)2007年6月29日18:00iPhone 2G在美国上市,4GB版售价(根据各国家与地区的情况,必需要与运营商签订一到两年的话费合约,才能购买IPHONE,也可以视之为存话费购机)为499美元,8GB售价为599美元。9月5日苹果宣布减价,苹果公司美国线上商店4GB版停产,8GB售399美元。9月6日,乔布斯在公司网站上刊登一封致全体iPhone用户的公开信,对降价一事表示歉意,并承诺对老用户作出补偿。   2008年2月4日,苹果公司推出16G版iPhone,售价499美元。   2008年7月11日,苹果公司推出3G iPhone。8GB版售价为199美元,16GB版售价为299美元。ios   2x版正式提供全球语言。   2009年6月9日,苹果公司推出iPhone 3GS。并于2009年6月19日正式上市。其中用户在与运营商AT&T签约两年的情况下,iPhone 3GS […]

php防止sql注入

  程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对 用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据 库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL Injection,即SQL注入。 受影响的系统:对输入的参数不进行检查和过滤的系统 SQL注入过程 正常来讲,我们通过地址接收一些必要的参数如: hello.php?id=2  页面中我们会使用  2 写入到SQL语句中 正常情况:Select * From Table where id=2 如果我们对SQL语句熟悉,就知道2 我们可以替换成我们需要的SQL语句 如:and exists (select id from admin) 2、防止注入的几种办法 其实原来就是我们需要过滤一些我们常见的关键字和符合如: Select,insert,update,delete,and,*,等等 例子: Php代码   function inject_check($sql_str) {       return eregi(‘select|insert|update|delete|’|/*|*|../|./|union|into|load_file    |outfile’, $sql_str);     // 进行过滤    }   function inject_check($sql_str) { return eregi(‘select|insert|update|delete|’|/*|*|../|./|union|into|load_file |outfile’, $sql_str); // 进行过滤 } 或者是通过系统函数间的过滤特殊符号 Addslashes(需要被过滤的内容) 3、PHP其他地方安全设置     1、register_globals […]