一、redis对象操作setTimeout(),在哪里可以查到用法
redis对象操作setTimeout()的用法如下:
$redis->setTimeout('x', 3);
有关redis的一系列set操作总结如下:
$redis->sadd("myset",$i+rand(10,99));
$bool=$redis->srem("myset",16);
//smove将value元素从名称为srckey的集合移到名称为dstkey的集合
$bool=$redis->smove("myset","myset1", 35);
$data=$redis->smembers("myset");
// sIsmember, sContains名称为key的集合中查找是否有value元素,有ture没有 false
$bool=$redis->sismember("myset",555);
//scard ssize集合key元素的个数
echo$redis->scard("myset");
//求交集并将交集保存到output的集合
//$redis->sInterStore('output','key1','key2','key3')
$redis->sinterstore("output","myset","myset1");
$data=$redis->smembers("output");
// sUnionStore求并集并将并集保存到output的集合
//$redis->sUnionStore('output','key1','key2','key3');
$redis->sunionstore("uoutput","myset","myset1");
$data=$redis->smembers("uoutput");
//'by'=>'some_pattern_*',
//'limit'=> array(0, 1),
//'get'=>'some_other_pattern_*' or an array of patterns,
//'sort'=>'asc' or'desc',
//'store'=>'external-key'
$data=$redis->sort("myset",array("sort"=>"desc"));
//zadd添加元素 zAdd(key, score, member):
$redis->zadd("zset",$i+rand(10,99),$i+rand(100,999));
//zrange zRange(key, start, end,withscores)返回指定范围的元素
//zRevRange(key, start, end,withscores):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素.withscores:是否输出socre的值,默认false,不输出
//zRangeByScore, zRevRangeByScore
//$redis->zRangeByScore(key, star, end, array(withscores, limit));
//返回名称为key的zset中score>= star且score<= end的所有元素
$data=$redis->zrange("zset",0,3,"withscores");//end-1返回所有元素加withscores withscores做值使用
//zRem(key, member):删除名称为key的zset中的元素member
//$redis->zCount(key, star, end);
//返回名称为key的zset中score>= star且score<= end的所有元素的个数
echo$redis->zcount("zset",10,50);
//zRemRangeByScore, zDeleteRangeByScore
$redis->zRemRangeByScore('key', star, end);//zremrangebyscore删除 socre大于star score小于 end d的元素
//删除名称为key的zset中score>= star且score<= end的所有元素,返回删除个数
//zScore返回名称为key的zset中元素val2的score
echo$redis->zScore("zset", 503);
//zRank, zRevRank zrank("set",value)返回value在集合中的位置索引从0开始
echo$redis->zrank("zset",723);
//$redis->zIncrBy('key', increment,'member');
//如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
//zUnion/zInter就集合的合集和交集
$redis->hset("myhash",$i,rand(10,99)+$i);
//hget("myhash","key1")返回哈希 myhash中键为key1的对应的数值
echo$redis->hget("myhash","0");
//hLen返回名称为h的hash中元素个数
echo$redis->hlen('myhash');
//hDel删除名称为h的hash中键为key1的域
echo$redis->hdel("myhash","0");
// hKeys返回名称为key的hash中所有键
$data=$redis->hkeys('myhash');
//hVals返回名称为h的hash中所有键对应的value
$data=$redis->hvals("myhash");
//hGetAll返回名称为h的hash中所有的键(field)及其对应的value
$data=$redis->hgetall("myhash");
//hExists判断某个hash的对应的键是否存在
echo$redis->hexists("myhash","0");
//hMset向名称为key的hash中批量添加元素
$redis->hmset("user:1",array("name1"=>"name1","name2"=>"Joe2"));
//hMGet返回名称为h的hash中field1,field2对应的value
$data=$redis->hmget('user:1', array('name','salary'));
//rename, renameKey给key从新命名
//renameNx与remane类似,但是,如果重新命名的名字已经存在,不会替换成功
//setTimeout, expire设置key的生命时间
$redis->settimeout("user:1",10);
//expireat指定一个key的生命时间为一个时间戳
//expireAt key存活到一个unix时间戳时间
$redis->expireat("myhash",time()+ 10);
//dbSize查看现在数据库有多少key
$redis->auth('foobared');
//bgrewriteaof使用aof来进行数据库持久化
//slaveof通过执行 SLAVEOF host port命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。
$redis->slaveof('10.0.1.7', 6379);
//lastSave返回上次成功将数据保存到磁盘的Unix时戳
//info返回redis的版本信息等详情
//string: Redis::REDIS_STRING 1
//other: Redis::REDIS_NOT_FOUND 6
echo$redis->type("myset");//2
二、AS3 setTimeOut,setInterval,Timer 的区别和用法
1、setTimeout:一般只是一次使用。
2、但是如果有需要,三个类都可以达到彼此的功能,比如说,timer可以设置成一次使用,或者是无限次使用,但是从开发的简洁程度来说,不建议这样写。
3、setimeout和setinerval是不支持继承的,而timer具有良好的扩张性,像在很多游戏中的心跳机制都是用timer的功能来写的。所以在复杂功能的时候一般都是用timer。
4、最重要的是,这三个方法,使用之后都要回收。不然会引发一些乱七八糟的bug,比如说内存溢出等等。
三、okhttp Timeout 超时设置与用法解释
这个都知道,一搜一大把,但是没人讲这三种timeout有什么区别...
TCP协议(握手/挥手/发包/丢包重传/滑动窗口/拥塞控制等细节)以及socket属于前置知识,若不太了解,建议先恶补一下。
以下的源码探究就是罗列记录一下自己的探究过程,嫌啰嗦可以忽略~
我们知道 okhttp采用了责任链的设计模式,用一条抽象的 Chain将一堆 Interceptor串起来,从发出request到接收response的路径类似于 node.js中 koa2的“洋葱模型”(图1),而 okhttp的 Interceptor作用就相当于 koa2中的 middleware.
“洋葱”的每一层都是一个 Interceptor,每一层都专注于自己的事情(单一职责),比如日志、mock api,弱网模拟,统一header,APP层缓存、通讯加密等,功能拆分,互不影响,从框架层面来讲也是对AOP思想的具体实践。(AOP可不仅仅是传统意义上的字节码插桩)
okhttp本身已经提供了几个 Interceptor的默认实现,比如 CacheInterceptor就是对于http1.1缓存机制的具体实现(cache-controll等); ConnectInterceptor专门负责创建/复用TCP连接,里面的 ConnectionPool就是对 http1.1中 keep-alive(TCP连接复用)和 pipline机制(用多条TCP连接实现并发请求)的具体实现。而超时相关的设置也是从这里切入。
上面的 StreamAllocation#newStream方法就做了两件事,
StreamAllocation#findConnection主要做了两件事,先是从连接池中复用或者创建一个新的连接(RealConnection),然后调用 RealConnection#connect方法完成 TCP+ TLS握手,其中TCP握手是在
RealConnection#connectSocket(connectTimeout, readTimeout, call, eventListener);中发起的。
关于 socket.setSoTimeout,以下是原文档说明的个人翻译及理解
关于 socket.connect(address, connectTimeout);
RealConnection#newCodec()根据 connection创建httpCodec(Encodes HTTP requests and decodes HTTP responses.)
当然还有一个地方是在 connectTunnel()用到,但是这个前提是走http代理的时候,这个暂且不详细探究;
具体是什么鬼,看一下source和sink的创建就是知道了
还是RealConnection的connectSocket方法
Okio.buffer(Source source)就是 new RealBufferedSource(source);
那么下面主要来看 Okio.source(rawSocket)
同样主要看 Okio.sink(rawSocket)的实现
如果你还想了解更多这方面的信息,记得收藏关注本站。