温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
模块内容加载中...
背景:调阿里巴巴接口时,需要把多层对象转数组,再转json输出。试了好多方法,找了好多代码,均不行,要么就输出null,要么就空,各种报错。以下是找了好久找到的,可用的函数。/**&* 把多层对象转化为Array&*/function objectToArray ($object) {& & if(!is_object($object) &&& !is_array($object))& & & & return $& & return array_map('objectToArray', (array) $object);}/**&* 把对象转化为json&*/function arrayToJson($object){& & $arr = objectToArray($object);//先把对象转化为数组& & return json_encode($arr,true); //数组转为json}使用方法:直接调用:arrayToJson($object),其中$object是阿里API返回的object多层对像。注意:下面还有这一段,适应性更强//Careful://$array = (array) $//does a shallow conversion// ($object-&innerObject = new stdClass() remains an object)// and converting back and forth using json works// but it's not a good idea if performance is an issue.//If you need all objects to be converted to associative arrays//here is a better way to do that (code ripped from I don't remember where):function toArray($obj){& & if (is_object($obj)) $obj = (array)$& & if (is_array($obj)) {& & & & $new = array();& & & & foreach ($obj as $key =& $val) {& & & & & & $new[$key] = toArray($val);& & & & }& & } else {& & & & $new = $& & }& & return $}原文:http://stackoverflow.com/questions/2476876/how-do-i-convert-an-object-to-an-array
vi编辑器中的整行(多行)复制与粘贴就非常必要了。&&& 1、复制&&& 1)单行复制&&& 在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制;&&& 2)多行复制&&& 在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3……&&& 2、粘贴&&& 在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴&vi复制多行文本的方法方法1:光标放到第6行,输入:2yy光标放到第9行,输入:p此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面。方法2:命令行模式下输入6,9 co 12复制第6行到第9行之间的内容到第12行后面。方法3:有时候不想费劲看多少行或复制大量行时,可以使用标签来替代光标移到起始行,输入ma光标移到结束行,输入mb光标移到粘贴行,输入mc然后 :'a,'b co 'c&&&把 co 改成 m 就成剪切了要删除多行的话,可以用 :5, 9 deFrom:http://blog.csdn.net/xiyuan1999/article/details/5680102
二氧化碳干冰灭火器,是专门灭电器火的,尤其对强电闸,强电接头灭火有相当的效果。二氧化碳干冰灭火器是利用冷却和隔氧的原理灭火。所以,干冰灭火器,不适合汽车灭火。另:干冰灭火器比干粉灭火器贵多了,因为干冰制作工艺复杂,干粉只是碳酸氢钠,所以从工艺难度看价格就不一样干粉灭火器内充装的是干粉灭火剂。能否喷人干冰不能直喷人体皮肤,温度过度会冻伤,烧伤。如果人体真被猛烈高温的炙烤下发生燃烧一般都是脂肪层燃烧,这时低温可能造成皮肤和肌肉骤缩,从而撕裂皮肤和肌肉。干粉灭火器可以直接对着人体使用~&但不要进入呼吸道及五官各处。&干粉灭火器是目前最先进的.里面不含NaHCO3不烧人,可以对人直接喷射.在灭火器上表明ABC的是可以喷人的,BC得不行。干粉灭火剂是用于灭火的干燥且易于流动的微细粉末,由具有灭火效能的无机盐和少量的添加剂经干燥、粉碎、混合而成微细固体粉末组成。&干冰灭火器(二氧化碳液体灭火器)是以高压气瓶内储存的液态二氧化碳做为灭火剂进行灭火,按下开关后瓶内压力下降液体二氧化碳气化成二氧化碳气体隔绝空气来达到灭火的目的。有效期灭火器的有效期有两个方面,一个是灭火器本体,按照国家相关规范,干粉灭火器的强制报废年限是8年,也就是你说的8年有效期;另外一个方面,干粉灭火器的灭火剂也有一个有效期,各省市的具体情况不一样,一般来说灭火剂的有效期为 1 到 2 年,通常灭火器在重新重装时,厂家都会贴上灭火剂的有效期,也就是说多数情况下干粉灭火器在8年有效期内,每年都需要重新重装灭火剂,大概也就是所谓的年检吧。
虽然Virtual DOM确实是性能杠杠的,但是其实可以说它是无心插柳的一个结果。React的核心思想:一个Component拯救世界,忘掉烦恼,从此不再操心界面。1. Virtual Dom快,有两个前提1.1 Javascript很快Chrome刚出来的时候,在Chrome里跑Javascript非常快,给了其它浏览器很大压力。而现在经过几轮你追我赶,各主流浏览器的Javascript执行速度都很快了。Julia有一个Benchmark,, 可以看到Javascript跟C语言很接近了,也就几倍的差距,跟Java基本也是一个量级。所以说,单纯的Javascript其实速度是很快的。多说一句,这种benchmark并不是绝对的依据,因为用这个语言写这个跑得快,并不代表一定是用这个语言写那个也跑得快。1.2 DOM很慢关于什么CSS,什么layout那些我不懂,就不瞎说了,咱就说说DOM的结构。当你用document.createElement()创建一个空的Element的时候(比如创建一个空的div),有以下这几页的东西需要实现(当然,这不是标准,只是个大概的意思):非常非常多,并且还有不少嵌套引用。你可以在Chrome console里手动调用document.createElement 然后插入DOM里看看效果。这还是一个空的Elemnt,啥内容也没有,就这么复杂。所以说DOM的操作非常慢是可以理解的。不是浏览器不想好好实现DOM,而是DOM设计得太复杂,没办法。而更糟糕的是,我们(以及很多框架)在调用DOM的API的时候做得不好,导致整个过程更加的慢。React的Virtual Dom解决的是这一部分问题,它并不能解决DOM本身慢的问题。比如说,现在你的list是这样,&ul&&li&0&/li&&li&1&/li&&li&2&/li&&li&3&/li&&/ul&你想把它变成这样&ul&&li&6&/li&&li&7&/li&&li&8&/li&&li&9&/li&&li&10&/li&&/ul&通常的操作是什么?先把0, 1,2,3这些Element删掉,然后加几个新的Element 6,7,8,9,10进去,这里面就有4次Element删除,5次Element添加。而React会把这两个做一下Diff,然后发现其实不用删除0,1,2,3,而是可以直接改innerHTML,然后只需要添加一个Element(10)就行了,这样就是4次innerHTML操作加1个Element添加,比9次Element操作快多了吧?当然还有其它一些例子能够优化我们对DOM的操作,就不举例子了。(实际上是因为我举不出例子。。。)2. 关于React2.1 接口和设计在React的设计里,是完全不需要你操作DOM的。在React里其实根本就没有DOM这个概念的存在,只有Component。当你写好一个Component以后,Component会完全负责UI,你不需要也不应该去也不能够指挥Component怎么显示,你只能告诉它你想要显示一个香蕉还是两个梨。隔离DOM并不是因为DOM慢(当然DOM确实慢),而是把界面和业务完全隔离,操作数据的只关心数据,操作界面的只关心界面。可以想象成把MVC里面的Controller分成两个部分,一部分合并到M里面去,一部分合并到V里面去,就剩下MV,没有C了。。。其实M也并不是Model了。推荐看一下Pete Hunt的这个Talk 重复一遍,React的意思是,我提供一个Component,然后你只管给我数据,界面的事情完全不用你操心,我保证会把界面变成你想要的样子。你可以把一个React的Component想象成一个Pure Function,只要你给的数据是[1, 2, 3],我保证显示的是[1, 2, 3]。没有什么删除一个Element,添加一个Element这样的事情。NO。你要我显示什么就给我一个完整的列表。说到这里,插一句别的,我一开始看到这里还以为这样的处理方式比较适合一般的WEB应用,写游戏啊什么的可能这个模式不太好用,然后我就看到Pete Hunt那个Talk,说DOOM 3就是这么干的。。。。。。。眼泪都下来了,大神们的思路果然我是摸不着边的,洗洗睡吧。睡醒了接着说。React其实需要从Imperative Programming转换到Declarative Programming去理解。你不要一步一步告诉我这件事情怎么做,什么先和面再剁馅,NO,告诉我你想要煎饼还是月饼,我会想办法去做的,不要来干扰我。你只需要告诉我有这么一个列表[1, 3, 6]需要显示就行了,不要告诉我怎么显示,我会想办法的,我保证美得冒泡,各种神奇的效果,亮瞎你的钛合金狗眼。行了行了,你真啰嗦。。。。再说几句瞎扯的话,Flux虽然说的是单向的Data Flow,但是实际上就是单向的Observer。Store-&View-&Action-&Store(箭头是数据流向,实现上可以理解为View***Store,View直接trigger action,然后Store***Action)等等,不是说Component是pure function不跟谁绑定吗,为啥View要***Store?你这个骗子。怪不得都没有人给你点赞。。。。。。。我们还是继续说React把,Flux是什么鬼,我反正没听过。2.2 实现OK,那么,如何实现React呢?其实对于React来说,最容易实现的办法是每次完全摧毁整个DOM,然后重新建立一个全新的DOM。因为一个Component是一个Pure function,根本就没有State这个概念,我又不知道DOM现在是什么样子,那最简单的办法当然是只要你给新数据,我就把整个DOM删了,然后根据你给的数据重新生成一个DOM咯。等等,Virtual DOM哪儿去了?事实是这样的,最简单实现React的方式虽然说非常简单,但是效率实在是太低了,你居然要全部都删了重建DOM,DOM本身已经很慢了,你还这么去用,谁能忍啊?然后Virtual DOM就来救场了。Virtual DOM和DOM是啥关系呢?首先,Virtual DOM并没有完全实现DOM,Virtual DOM最主要的还是保留了Element之间的层次关系和一些基本属性。因为DOM实在是太复杂,一个空的Element都复杂得能让你崩溃,并且几乎所有内容我根本不关心好吗。所以Virtual DOM里每一个Element实际上只有几个属性,并且没有那么多乱七八糟的引用。所以哪怕是直接把Virtual DOM删了,根据新传进来的数据重新创建一个新的Virtual DOM出来都非常非常非常快。(每一个component的render函数就是在做这个事情,给新的virtual dom提供input)所以,引入了Virtual DOM之后,React是这么干的:你给我一个数据,我根据这个数据生成一个全新的Virtual DOM,然后跟我上一次生成的Virtual DOM去 diff,得到一个Patch,然后把这个Patch打到浏览器的DOM上去。完事。有点像版本控制打patch的思路。假设在任意时候有,VirtualDom1 == DOM1 (组织结构相同)当有新数据来的时候,我生成VirtualDom2,然后去和VirtualDom1做diff,得到一个Patch。然后将这个Patch去应用到DOM1上,得到DOM2。如果一切正常,那么有VirtualDom2 == DOM2。这里你可以做一些小实验,去破坏VirtualDom1 == DOM1这个假设(手动在DOM里删除一些Element,这时候VirtualDom里的Element没有被删除,所以两边不一样了)。然后给新的数据,你会发现生成的界面就不是你想要的那个界面了。最后,回到为什么Virtual Dom快这个问题上。其实是由于每次生成virtual dom很快,diff生成patch也比较快,而在对DOM进行patch的时候,我能够根据Patch的内容,优化一部分DOM操作,比如之前1.2里的那个例子。重点就在最后,哪怕是我生成了virtual dom,哪怕是我跑了diff,但是我根据patch简化了那些DOM操作省下来的时间依然很可观。所以总体上来说,还是比较快。简单发散一下思路,如果哪一天,DOM本身的已经操作非常非常非常快了,并且我们手动对于DOM的操作都是精心设计优化过后的,那么加上了VirtualDom还会快吗?当然不行了,毕竟你多做了这么多额外的工作。但是那一天会来到吗?诶,大不了到时候不用Virtual DOM。作者:EMayej Bee链接:http://www.zhihu.com/question//answer/来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
围绕Web最著名的格言之一是Java的“一次编写,到处运行”。不过这个座右铭只适用于Java吗?我们能否也用它来形容JavaScript?***是肯定的。单一页面应用多年前,Web是一群由HTML和CSS构建的静态页面,没有太多的交互性。每个用户行为要求服务器来创建和提供一个完整的页面。幸于JavaScript的出现,开发者开始创建漂亮的效果。不过这是随着Ajax的出现才开始的一场革命。Web开发者开始编写能够与服务器发送和接收数据的代码,同时不需要重新加载页面。随着时间的推移,客户端的“职责”增长了很多,导致了一种新的应用类型,即SPA(单一页面应用)。在一个SPA中,所有必要的资产都通过单一页面加载或动态加载恢复,并在必要时添加到页面中。这样的例子有和。SPA允许更好的互动,因为几乎所有的操作都在***端中执行,最大限度的保持与服务器通信。不幸的事它也存在一些重大问题,接下来我们讨论其中的一些。性能因为SPA需要比静态页面更多的***端代码,增加了下载的数据量。这会导致较慢的初始加载时间,从而产生不好的后果,比如用户的流失和收入的减少。引用微软的一篇中的一句话:一份Bing的研究发现一个页面加载时间增加10ms就是花费站点250美元。SEO由于SPA依赖于JavaScript执行,服务器不产生所有的HTML内容。因此网络爬虫在索引页面时会有很多困难(网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫)。最近谷歌,让它接纳基于JavaScript的页面。然而对于Bing、Yahoo以及其他的搜索引擎呢?对所有业务而言良好的索引是至关重要的,因为它通常会带来更多的访问和更高的收入。同构JavaScript应用同构JavaScript应用指的是用JavaScript编写的应用,能够同时运行于客户端和服务器。因此,你只需编写一次代码,在服务器上执行它来实施静态页面,同时执行于客户端以允许快速的交互。所以这种方法在两个世界中都能取得最好的结果,避免了前面描述的两个问题。如今有几种框架可以帮助你开发这类应用,而其中最著名的框架之一可能就是。Meteor是一个开源的JavaScript框架,基础构架是Node.JS + MongoDB,专注于实时的Web应用。另一个想提到的项目是,一个的小型库,允许你同时在客户端和服务器上运行Backbone.js应用。越来越多的企业开始对项目采用Node.js,在客户端和服务器之间共享代码变成一种更普遍自然的选择。这一趋势通过库(如)共享模版得到增强。
var bs={ versions:function(){ var u = navigator.userAgent, app = navigator.appV return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') & -1, //IE内核 presto: u.indexOf('Presto') & -1, //opera内核 webKit: u.indexOf('AppleWebKit') & -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') & -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/)||!!u.match(/AppleWebKit/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') & -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') & -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') & -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; }(), language:(navigator.browserLanguage || navigator.language).toLowerCase()}//if(bs.versions.mobile){if(bs.versions.android||bs.versions.iPhone||bs.versions.iPad){ //do something}//}
并发连接数是指服务器当前时刻一共维持了多少TCP连接,而这些连接上是否有数据通讯并不关注,例如一台消息推送服务器上可能维持了百万的设备连接,由于连接上很少有数据通讯,所以这台服务器上负载可能几乎为0,只要内存足够,还可以继续接受连接。并发请求数一般用QPS(服务器每秒处理多少请求)来衡量,而当前时刻服务器上有多少个tcp连接并不十分关注。例如一台服务器只有10个客户端连接,每个客户端连接上每秒有1W个请求,那么要求服务端需要至少能支撑10*1W=10W每秒的吞吐量(QPS)。假设10W吞吐量每秒是这台服务器的极限,如果每个客户端每秒发送1个请求给服务端,那么这台服务器能够支撑10W个客户端。并发连接数受限于服务器内存,一般24G内存workerman服务器可以支持大概120W并发连接。并发请求数受限于服务器cpu处理能力,一台24核workerman服务器可以达到45W每秒的吞吐量(QPS),实际值根据业务复杂度以及代码质量有所变化。
node有一个模块叫n(这名字可够短的。。。),是专门用来管理node.js的版本的。首先***n模块:npm install -g n 第二步:升级node.js到最新稳定版n stable 是不是很简单?!n后面也可以跟随版本号比如:n v0.10.26 或n 0.10.26 就这么简单,这可怎么办??!!另外分享几个npm的常用命令npm -v #显示版本,检查npm 是否正确***。 npm install express #***express模块 npm install -g express #全局***express模块 npm list #列出已***模块 npm show express #显示模块详情 npm update #升级当前目录下的项目的所有模块 npm update express #升级当前目录下的项目的指定模块 npm update -g express #升级全局***的express模块 npm uninstall express #删除指定的模块
一、***运行环境1、***JDK:2、***Android SDK:可以单独***Android SDK,也可以通过Eclipse ADT或者Android Studio一并***3、***C++环境4、***node.js:二、创建React Native项目1、先设置npm镜像,不然npm下载不了东西: npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/dist 2、创建并初始化项目 react-native init&MyProject&三、运行 进行项目目录 react-native&start然后浏览器里就可以看到东西了:http://localhost:8081/debugger-ui&说白了环境搭好后,只需要上面红色两条命令就完事了
德国几个牌子的不锈钢锅(包括双立人,菲仕乐,WMF,SUS 等),材质是一模一样的。锅体是18/10 医用不锈钢,中间是夹的纯铝来导热,而锅底是18/0不锈钢(为了电磁炉用)。这些锅具由于中间有夹铝,受热均匀,中小火烹饪,都不易起油烟的。使用方法和效果都类似,区别主要是品牌,造型,和加工精度。加工精度来看,菲仕乐要略胜一筹。由于菲仕乐是德国产比较昂贵,所以显然是上海产的双立人更具性价比。所以:预算低,考虑双立人。预算中,考虑菲仕乐和WMF。预算丰富,可以考虑德国SUS米技牌锅子,因为锅底是夹铜的,导热性比铝还好。预算更丰富,考虑Silit(WMF旗下高端品牌),因为Silit 锅体内表面是特种陶瓷的,比起上述不锈钢锅具,此锅内表面不怕强电解质腐蚀(强酸性,高盐食物),可以隔夜存放任何汤水,可以熬煮中药。这些都是不锈钢锅所不能的。
http://www3.xitek.com/bingqiku/canon/body-age.htm
这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型、list类型和set类型的数据,需要的朋友可以参考下&redis的操作很多的,以前看到一个比较全的博客,但是现在找不到了。查个东西搜半天,下面整理一下php处理redis的例子,个人觉得常用一些例子。下面的例子都是基于php-redis这个扩展的。1,connect描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE示例:代码如下:&?php&&$redis = new redis();&&$result = $redis-&connect('127.0.0.1', 6379);&&var_dump($result); //结果:bool(true)&&?&&&2,set描述:设置key和value的值参数:Key Value返回值:BOOL 成功返回:TRUE;失败返回:FALSE示例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$result = $redis-&set('test',"");&&var_dump($result);&&& //结果:bool(true)&&?&&&3,get描述:获取有关指定键的值参数:key返回值:string或BOOL 如果键不存在,则返回 FALSE。否则,返回指定键对应的value值。范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$result = $redis-&get('test');&&var_dump($result);&& //结果:string(11) ""&&?&&&4,delete描述:删除指定的键参数:一个键,或不确定数目的参数,每一个关键的数组:key1 key2 key3 … keyN返回值:删除的项数范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test',"1");&&echo $redis-&get('test');&& //结果:1&&$redis-&delete('test');&&var_dump($redis-&get('test'));& //结果:bool(false)&&?&&&5,setnx描述:如果在数据库中不存在该键,设置关键值参数参数:key value返回值:BOOL 成功返回:TRUE;失败返回:FALSE范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test',"1");&&$redis-&setnx('test',"");&&echo $redis-&get('test');& //结果:1&&$redis-&delete('test');&&$redis-&setnx('test',"");&&echo $redis-&get('test');& //结果:&&?&&&6,exists描述:验证指定的键是否存在参数key返回值:Bool 成功返回:TRUE;失败返回:FALSE范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test',"1");&&var_dump($redis-&exists('test'));& //结果:bool(true)&&?&&&7,incr描述:数字递增存储键值键.参数:key value:将被添加到键的值返回值:INT the new value实例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test',"123");&&var_dump($redis-&incr("test"));& //结果:int(124)&&var_dump($redis-&incr("test"));& //结果:int(125)&&?&&&8,decr描述:数字递减存储键值。参数:key value:将被添加到键的值返回值:INT the new value实例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test',"123");&&var_dump($redis-&decr("test"));& //结果:int(122)&&var_dump($redis-&decr("test"));& //结果:int(121)&&?&9,getMultiple描述:取得所有指定键的值。如果一个或多个键不存在,该数组中该键的值为假参数:其中包含键值的列表数组返回值:返回包含所有键的值的数组实例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&set('test1',"1");&&$redis-&set('test2',"2");&&$result = $redis-&getMultiple(array('test1','test2'));&&print_r($result);&& //结果:Array ( [0] =& 1 [1] =& 2 )&&?&&10,lpush描述:由列表头部添加字符串值。如果不存在该键则创建该列表。如果该键存在,而且不是一个列表,返回FALSE。参数:key,value返回值:成功返回数组长度,失败false实例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&var_dump($redis-&lpush("test","111"));&& //结果:int(1)&&var_dump($redis-&lpush("test","222"));&& //结果:int(2)&&?&&11,rpush描述:由列表尾部添加字符串值。如果不存在该键则创建该列表。如果该键存在,而且不是一个列表,返回FALSE。参数:key,value返回值:成功返回数组长度,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&var_dump($redis-&lpush("test","111"));&& //结果:int(1)&&var_dump($redis-&lpush("test","222"));&& //结果:int(2)&&var_dump($redis-&rpush("test","333"));&& //结果:int(3)&&var_dump($redis-&rpush("test","444"));&& //结果:int(4)&&?&&12,lpop描述:返回和移除列表的第一个元素参数:key返回值:成功返回第一个元素的值 ,失败返回false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush("test","111");&&$redis-&lpush("test","222");&&$redis-&rpush("test","333");&&$redis-&rpush("test","444");&&var_dump($redis-&lpop("test"));& //结果:string(3) "222"&&?&&13,lsize,llen描述:返回的列表的长度。如果列表不存在或为空,该命令返回0。如果该键不是列表,该命令返回FALSE。参数:Key返回值:成功返回数组长度,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush("test","111");&&$redis-&lpush("test","222");&&$redis-&rpush("test","333");&&$redis-&rpush("test","444");&&var_dump($redis-&lsize("test"));& //结果:int(4)&&?&&14,lget描述:返回指定键存储在列表中指定的元素。 0第一个元素,1第二个… -1最后一个元素,-2的倒数第二…错误的索引或键不指向列表则返回FALSE。参数:key index返回值:成功返回指定元素的值,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush("test","111");&&$redis-&lpush("test","222");&&$redis-&rpush("test","333");&&$redis-&rpush("test","444");&&var_dump($redis-&lget("test",3));& //结果:string(3) "444"&&?&&15,lset描述:为列表指定的索引赋新的值,若不存在该索引返回false.参数:key index value返回值:成功返回true,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush("test","111");&&$redis-&lpush("test","222");&&var_dump($redis-&lget("test",1));& //结果:string(3) "111"&&var_dump($redis-&lset("test",1,"333"));& //结果:bool(true)&&var_dump($redis-&lget("test",1));& //结果:string(3) "333"&&?&&16,lgetrange描述:返回在该区域中的指定键列表中开始到结束存储的指定元素,lGetRange(key, start, end)。0第一个元素,1第二个元素… -1最后一个元素,-2的倒数第二…参数:key start end返回值:成功返回查找的值,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush("test","111");&&$redis-&lpush("test","222");&&print_r($redis-&lgetrange("test",0,-1));& //结果:Array ( [0] =& 222 [1] =& 111 )&&?&&17,lremove描述:从列表中从头部开始移除count个匹配的值。如果count为零,所有匹配的元素都被删除。如果count是负数,内容从尾部开始删除。参数:key count value返回值:成功返回删除的个数,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&lpush('test','a');&&$redis-&lpush('test','b');&&$redis-&lpush('test','c');&&$redis-&rpush('test','a');&&print_r($redis-&lgetrange('test', 0, -1)); //结果:Array ( [0] =& c [1] =& b [2] =& a [3] =& a )&&var_dump($redis-&lremove('test','a',2));&& //结果:int(2)&&print_r($redis-&lgetrange('test', 0, -1)); //结果:Array ( [0] =& c [1] =& b )&&?&&18,sadd描述:为一个Key添加一个值。如果这个值已经在这个Key中,则返回FALSE。参数:key value返回值:成功返回true,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&var_dump($redis-&sadd('test','111'));&& //结果:bool(true)&&var_dump($redis-&sadd('test','333'));&& //结果:bool(true)&&print_r($redis-&sort('test')); //结果:Array ( [0] =& 111 [1] =& 333 )&&?&&19,sremove描述:删除Key中指定的value值参数:key member返回值:true or false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd('test','111');&&$redis-&sadd('test','333');&&$redis-&sremove('test','111');&&print_r($redis-&sort('test'));&&& //结果:Array ( [0] =& 333 )&&?&&20,smove描述:将Key1中的value移动到Key2中参数:srcKey dstKey member返回值:true or false范例代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&delete('test1');&&$redis-&sadd('test','111');&&$redis-&sadd('test','333');&&$redis-&sadd('test1','222');&&$redis-&sadd('test1','444');&&$redis-&smove('test',"test1",'111');&&print_r($redis-&sort('test1'));&&& //结果:Array ( [0] =& 111 [1] =& 222 [2] =& 444 )&&?&&21,scontains描述:检查集合中是否存在指定的值。参数:key value返回值:true or false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd('test','111');&&$redis-&sadd('test','112');&&$redis-&sadd('test','113');&&var_dump($redis-&scontains('test', '111')); //结果:bool(true)&&?&&22,ssize描述:返回集合中存储值的数量参数:key返回值:成功返回数组个数,失败0范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd('test','111');&&$redis-&sadd('test','112');&&echo $redis-&ssize('test');&& //结果:2&&?&&&23,spop描述:随机移除并返回key中的一个值参数:key返回值:成功返回删除的值,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&var_dump($redis-&spop("test"));& //结果:string(3) "333"&&?&&24,sinter描述:返回一个所有指定键的交集。如果只指定一个键,那么这个命令生成这个集合的成员。如果不存在某个键,则返回FALSE。参数:key1, key2, keyN返回值:成功返回数组交集,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&var_dump($redis-&sinter("test","test1"));& //结果:array(1) { [0]=& string(3) "111" }&&?&&25,sinterstore描述:执行sInter命令并把结果储存到新建的变量中。参数:Key: dstkey, the key to store the diff into.Keys: key1, key2… keyN. key1..keyN are intersected as in sInter.返回值:成功返回,交集的个数,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&var_dump($redis-&sinterstore('new',"test","test1"));& //结果:int(1)&&var_dump($redis-&smembers('new'));& //结果:array(1) { [0]=& string(3) "111" }&&?&&26,sunion描述:返回一个所有指定键的并集参数:Keys: key1, key2, … , keyN返回值:成功返回合并后的集,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&print_r($redis-&sunion("test","test1"));& //结果:Array ( [0] =& 111 [1] =& 222 [2] =& 333 [3] =& 444 )&&?&&27,sunionstore描述:执行sunion命令并把结果储存到新建的变量中。参数:Key: dstkey, the key to store the diff into.Keys: key1, key2… keyN. key1..keyN are intersected as in sInter.返回值:成功返回,交集的个数,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&var_dump($redis-&sinterstore('new',"test","test1"));& //结果:int(4)&&print_r($redis-&smembers('new'));& //结果:Array ( [0] =& 111 [1] =& 222 [2] =& 333 [3] =& 444 )&&?&&28,sdiff描述:返回第一个集合中存在并在其他所有集合中不存在的结果参数:Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis.返回值:成功返回数组,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&print_r($redis-&sdiff("test","test1"));& //结果:Array ( [0] =& 222 [1] =& 333 )&&?&&&29,sdiffstore描述:执行sdiff命令并把结果储存到新建的变量中。参数:Key: dstkey, the key to store the diff into.Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis返回值:成功返回数字,失败false范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&$redis-&sadd("test","333");&&$redis-&sadd("test1","111");&&$redis-&sadd("test1","444");&&var_dump($redis-&sdiffstore('new',"test","test1"));& //结果:int(2)&&print_r($redis-&smembers('new'));& //结果:Array ( [0] =& 222 [1] =& 333 )&&?&&30,smembers, sgetmembers描述:返回集合的内容参数:Key: key返回值:An array of elements, the contents of the set.范例:代码如下:&?php&&$redis = new redis();&&$redis-&connect('127.0.0.1', 6379);&&$redis-&delete('test');&&$redis-&sadd("test","111");&&$redis-&sadd("test","222");&&print_r($redis-&smembers('test'));& //结果:Array ( [0] =& 111 [1] =& 222 )&&?&&&php-redis当中,有很多不同名字,但是功能一样的函数,例如:lrem和lremove,这里就不例举了。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:seamon链接:http://www.zhihu.com/question//answer/来源:知乎mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。相比memcached:1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。2、redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中。4、redis原生支持的数据类型更多,使用的想象空间更大。5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更加强大。6、redis更多优点,请移步官方网站查询。MongoDB不多说,不是一个类型的东西,Redis相对Memcached来说功能和特性上的优势已经很明显了。而对于性能,Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。为什么这么说呢,理由就是Redis是单线程运行的。因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。而就内存使用上来说,目前Redis结合了tcmalloc和jemalloc两个内存分配器,基本上和Memcached不相伯仲。如果是简单且有规律的key value存储,那么用Redis的hash结构来做,内存使用上会惊人的变小,优势是很明显的。redis可以代替memcached,并且在效率方面可能比memcached更高一点。两者都是典型的key value store,且都是内存型数据库。由于redis可以持久化到文件系统,在缓存方面可以比memcached做的更好。现在的项目中完全用redis取代了memcached,效果良好。项目是rails的,使用redis-store代替memcache-store。
A级锁:目前市面上A级防盗锁钥匙主要有一字钥匙和十字钥匙。A级锁芯内部结构非常简单,仅限于弹子的变化,弹子槽少而浅。防技术性开启时间1分钟内,互开率极高。弹子结构为单排弹子或十字锁。B级锁:B级锁钥匙为平板钥匙,有双排弹子槽,跟A级锁不同的地方在于钥匙面多了一排弯弯曲曲不规则的线条。锁芯主要类型为3种,电脑双排锁芯、双排月牙锁芯、双面叶片锁芯。防技术性开启时间5分钟内,互开率高。通过强扭工具,1分钟内可以开启锁芯。超B级锁(C级):钥匙形状为单面叶片内铣槽或外铣槽钥匙,锁芯类型为边柱锁芯;经公安部检测270分钟无法技术开启,区域互开率为零(一千六百万分之一)。弹子结构为双排叶片加V型边柱锁定;如果用强扭工具开启锁芯,锁芯内部破坏,自爆锁死,导致无法开启。
一、OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源。由于用户的账号密码并不与本APP直接交互,而是与官方服务器交互,因而它是安全的。图示:流程: 1、获取未授权的Request Token。 url:request token url。 param:appKey/appSecret,签名方法/签名(如HMAC-SHA1),timeStamp(时间戳:距/0/0/0的秒数),nonce(随机生成的string,防止重复请求) response:Oauth_Token/Oauth_Secret 2、获取用户授权的Request Token。 url:user authorizition url。 param:Oauth_Token(上个步骤返回的令牌),callback_url(授权成功后返回的地址) response:Oauth_Token(被用户授权或否决的令牌) 3、用已授权的Request Token换取AccessToken。 url:access token url。 param:appKey,Oauth_Token(上个步骤返回的令牌),签名,TimeStamp,nonce response:Access_Token/Secret&二、SSO授权技术 全称:Single Sign On,用户只需登陆一次即可访问相互信任的子系统。用户访问系统1时,登陆成功后会返回一个ticket,当用户访问系统2时,会把ticket带上,待验证合法后即可访问系统2。听起来跟cookie有点像,没错,Web-SSO便有基于cookie的实现方案。 以新浪微博为例,很多手机APP在点击新浪授权时,会跳到新浪客户端的登陆页面,这里就用到SSO技术啦。在本APP授权新浪微博时,会先检测手机是否***了新浪微博客户端。 [[UIApplicationsharedApplication]&openURL:xxx]可以打开另一个APP。这里sinaweibosso://login为客户端的url并传递三个参数,AppKey,RedirectURI,ssoCallbackScheme。 ssoCallbackScheme是返回的App Url地址,即自己定义的sinaweibosso.appKey。 登陆成功后,客户端会直接把AccessToken返回给本App,就完成了一次授权
心情随笔列表加载中...
this.p={b:2,n:5,r:'http://xbj126.blog.163.com/blog/#m=1&c=',mset:'000',mcon:'',srk:-100};
{if defined('fl')&&fl.length>0} {list fl as x}
${x.content|xescape:x.id,x.moveFrom} ${x.publishTime|xtime}
{if x.moveFrom&&x.moveFrom=='wap'} && {/if} {if x.moveFrom&&x.moveFrom=='mobile'} && {/if}
{/list} {else} 暂无心情随笔记录! {/if}
列表加载中...
this.p={b:2,cn:15};
最后登录加载中...
this.p={b:2,ua:-1, ub:'http://img.bimg.126.net/photo/ovyAqMaPs7e0Q4LzIsz0Fg==/098281.jpg',us:'他', friendstatus:'none',followstatus:'unFollow',hmcon:'1',aShowT:'1',guideId:6};
积分 ${data.totalScore} 分,距离下一等级还有 ${data.nextGradeNeedScore}分
模块内容加载中...
this.p={b:2,maxb:5,maxp:6}
{if !defined('b')} 日志更新列表加载中... {elseif !b.length} 没有日志更新! {else} {list b as x}·{/list} {/if}
{if !defined('p')} 相片更新列表加载中... {elseif !p.length} 没有相片更新! {else} {list p as x}{/list} {/if}
{list 0..6 as x}${dv[x]}{/list} {list 1..6 as x}{list 1..7 as y}{/list}{/list}
{list df..dt as x}{/list}
模块内容加载中...
this.p={b:2,c:'59287',r:'http://b.bst.126.net/common/weather/'};
{if defined('w')} ${w.province}{if w.province!=w.cityName},${w.cityName}{/if}
{var ne = w.weatherFromCode!=w.weatherToCode}
{if ne}{/if}
今:${w.temperatureLow}℃~${w.temperatureHigh}℃
{var ne = w.weatherFromCode48!=w.weatherToCode48}
{if ne}{/if}
明:${w.temperatureLow48}℃~${w.temperatureHigh48}℃
{else} 天气服务器当前不可用! {/if}
我的关注列表加载中...
this.p={b:2,m:1};
& & & & & &
网易公司版权所有&&
{list x.l as y}
{/list} {/list}
{if defined('wl')} {list wl as x}{/list} {/if}