PHPRedis手册
https://github.com/phpredis/p…
连接操作
$redis = new Redis();
$redis->connect("127.0.0.1", 6379, 1); //TCP短连接,1秒超时,返回bool
$redis->connect('/tmp/redis.sock'); //套接字
$redis->connect("127.0.0.1", 6379, 1, NULL, 100);//重新连接之间间隔100毫秒
$redis->pconnect("127.0.0.1", 6379, 1); //长连接,进程结束前,请求关闭结束时连接不释放。线程版不能使用.返回bool
$redis->auth("mima"); //密码,返回bool
$redis->select(0); //选择redis数据库,0-15个库,返回bool
$redis->swapdb(0,1);//原子交换两个数据库,返回bool
$redis->setOption(Redis::OPT_PREFIX, 'myAppName:');//在所有键上使用指定前缀
$redis->_prefix('my');//添加key的前缀,与上一步会合并myAppName:my
$redis->close(); //关闭连接,返回bool
$redis->ping(); //检查连接,返回字符串‘+PONG’
$redis->echo("1"); //发送字符串到redis。redis原值返回
$redis->isConnected(); //连接redis成功与否,返回bool
Server操作
$redis->bgSave(); //异步在后台保存数据到磁盘。返回bool
$redis->save();//同步保存数据到磁盘。返回bool
$redis->bgRewriteAOF(); //启动AOF的后台重写
$redis->config("GET","*max-*-entries*");//获取配置项值
$redis->config("SET","dir","/var/run/redis/dumps/");//设置配置值
$redis->dbSize(); //返回当前库中的key个数
$redis->flushAll();//清空所有库中的所有key。总返回true
$redis->flushDb();//清空当前库中的所有key。总返回true
$redis->info(); //返回redis的所有状态数据。
$redis->info("CPU"); //传参返回指定状态数据
$redis->resetStat(); //重置info中的状态数据。
$redis->lastSave();//返回最后一次保存数据到磁盘的时间戳
$redis->time();//返回当前服务器时间
$redis->slowLog(”get“,10);//获取10条慢日志
$redis->slowLog("reset");//重置慢日志
事务操作
$redis->multi(Redis::MULTI);//开启事务,事务块内支线的多条命令按照先后顺序放进一个队列中,最后由EXEC命令原子执行。
$redis->multi(Redis::PIPELINE);//开启管道,事务块内支线的多条命令按照先后顺序放进一个队列中,最后由EXEC命令原子执行。
.....事务命令块....
$redis->exec();//执行事务块内的命令,事务块内所有命令的返回值,安命令的执行顺序排列,当操作被打断时,返回false
$redis->multi()
->set('key1', 'val1')
->get('key1')
->set('key2', 'val2')
->get('key2')
->exec();//返回每一个命令的返回值的索引数组
Key操作
$redis->delete('key1','key2');//删除指定键,返回删除key个数
$redis->delete(array('key1','key2'));
$redis->unlink('key1','key2');//redis>=4.0.0 异步非阻塞删除。
$redis->unlink(array('key1','key2'));
$redis->exists('key');//验证指定key是否存在,返回bool,redis>4.0.0存在返回1,不存在返回0
$redis->incr('key1');//自增1,返回自增后的整数
$redis->incrBy('key1',10);//增加指定数。
$redis->decr('key');//自减1,返回自减后的整数
$redis->decrBy('key',10);//减少指定数
$redis->mGet(array('key','key2'));//查询多个key的值,不存在的key值为false,返回数组
$redis->getSet('key',2);//设置key一个新值,返回key的设置之前的值
$redis->randomKey();//随机返回一个key名
$redis->move('key',1);//将key移动到1库中,返回bool
$redis->rename('oldkey','newkey');//重命名key
$redis->renameNx('oldkey','newkey');//重命名key,key存在撤销
$redis->expire('key',3);//设置key过期时间,单位秒,返回bool
$redis->setTimeout('key',3);//同上
$redis->expireAt('key',time()+3);//设置key的到期时期时间戳,时间戳为秒
$redis->ttl('key');//返回key的剩余存活秒数,没有设置过期时间返回-1,key不存在返回-2
$redis->persist('key');//删除key的过期时间,返回bool
$redis->keys('key*'); //返回符合匹配模式的key数组或字符串。*为匹配符
$redis->type('key');//返回key的数据类型
$redis->migrate('127.0.0.1',6379,array('key1','key2'),0,3600,true,true);//迁移多个键值到备份redis的0库中,迁移最大时间3600秒,迁移复制替换。redis<3.0.6,只支持单个key迁移
$redis->sort('key',array('sort'=>'desc','limit'=>array(0,1)));//对列表,集合,有序集合的元素进行排序,返回数组
String操作
$redis->get('key');//获取key值,key不存在返回false
$redis->set('key','value');//设置key值,返回bool
$redis->setEx('key',3600,'value');//设置key值和过期时间单位秒
$redis->setNx('key','value');//分布式锁。。redis中不存在key设置key值,存在不操作,返回bool
$redis->append('key','value');//将值追加到指定key的字符串后面,返回新值长度
$redis->getRange('key',0,5);//返回key的值的指定范围的子字符串
$redis->setRange('key',5,'value');//修改替换key的指定位置之后的字符,返回长度
$redis->strLen('key');//获取key的值字符串长度
$redis->setBit('key',10,1);//设置位图指定位的状态值,0或1,返回设置之前的状态0或1
$redis->getBit('key',10);//获取位图指定位的状态值,0或1
$redis->bitCout('key');//统计位图中状态为1的个数
$redis->mSet(array('key1'=>1,'key2'=>2));//批量设置多个key的值,返回bool
Lists 操作
$redis->lIndex('key',0);//返回指定index序号的列表中的元素值,-1倒序第一个,0顺序第一个,位置不存在值返回false
$redis->lRange('key',0,-1);//返回指定开始和结束索引位置范围内的元素数组
$redis->lTrim('key',0,1);//修剪列表,只保留指定索引范围内的元素,返回bool
$redis->lInsert('key',Redis::BEFORE,'a','b');//将值b插入值a前面,Redis::AFTER是后面,指定值不存在返回-1
$redis->lSet('key',0,'value');//设置指定索引位置的值,返回bool,超出范围返回false
$redis->lPop('key');//删除列表第一个元素,并返回值,空列表返回false
$redis->lPush('key','value');//在列表头部添加值,返回列表长度,不存在列表创建,key不是列表类型返回false。
$redis->rPush('key','value);//在列表尾部添加值,返回列表长度,不存在列表创建,key不是列表类型返回false。
$redis->rPop('key');//删除列表末尾的元素,并返回值,空列表返回false
$redis->rpoplpush('key1','key2');//将key1的尾部弹出一个值存入key2列表的头部,并返回这个值,
$redis->lLen('key');//返回列表的元素个数
$redis->lRem('key','a',2);//从头开始删除两个值为a的元素,0,删除全部a元素,负数倒序删除,返回删除个数
Sets 操作
$redis->sAdd('key', '1');//添加值到集合中,值已存在返回false,返回集合当前的元素数量
$redis->sCard('key');//发返集合的元素个数,集合不存在返回0
$redis->sDiff('key1','key2','key3');//返回集合之间的差集,数组
$redis->sDiffStore('stare','key1','key2');//返回集合之间的差集个数,差集元素存储在第一个集合stare中
$redis->sInter('key1','key2','key3');//返回多个集合之间的交集数组,无交集返回空数组
$redis->sInterStore('store','key1','key2');//返回多个集合的交集元素个数,交接结果保存在第一个参数集合中。
$redis->sUnion('key1','key2');//返回多个集合之间的并集数组
$redis->sUnionStore('store','key1','key2');//返回多个集合的并集元素个数,并集结果保存在第一个参数的集合中。
$redis->sContains('key','value');//判断值是否在集合中,返回bool
$redis->sMembers('key');//返回无序的集合所有的元素数组。
$redis->sMove('from','to','value');//从一个集合中移动一个元素到另一个集合,返回bool
$redis->sPop('key1',10);//从集合中随机删除一个元素并返回值。集合为空或不存在返回false;带个数参数,将返回指定个数的元素
$redis->sRandMember('key',10);//从集合中随机返回一个元素的值,如带个数参数,将返回指定个数的元素
$redis->sRemove('key','value1','value2');//删除集合中指定的元素,返回元素个数
Sorted Sets 操作
$redis->zAdd('key',1,'value');//添加元素到有序集合,添加成功返回1,否则0
$redis->zCard('key');//返回集合元素个数,$redis->zSize();
$redis->zCount('key',0,100);//返回指定范围内的集合元素个数
$redis->zIncrBy('key',1,'value');//给指定的元素增加指定数,返回新的值
$redis->zInter('key',array('key2','key3'));//将数组中的多个集合的交集存放在第一个参数的集合中,返回新交集集合的元素个数
$redis->zUnion('key',array('key2','key3'));//将数组中 多个集合的并集存放在第一个参数的集合中,返回新并集的集合元素个数
$redis->zRange('key',0,-1);//返回指定索引范围的元素数组,0表示第一个,-1表示倒数第一个$redis->zRevRange('key',0,-1)反序返回
$redis->zRangeByScore('key',0,10);//返回指定排序值范围内的元素数组。
$redis->zRangeByScore('key',0,10,array('withscores'=>TRUE));//返回值为健名,排序值为健值的数组。
$redis->zRevRangeByScore('key',0,10);//反序zRangeByScore
$redis->zRank('key','value');//返回指定元素的索引位置值
$redis->zScore('key','value');//返回指定元素的排序值
$redis->zDelete('key','value');//删除指定元素,成功返回1,失败返回0
$redis->zDeleteRangeByRank('key',0,1);//按索引的范围删除元素,返回删除个数
$redis->zDeleteRangeByScore('key',0,10);//按排序的范围删除元素,返回删除个数
Hash 操作
$redis->hSet('key','hashKey','value');//设置修改哈希表key中的hashkey对应的值,不存在添加返回1,存在修改返回0,错误返回false
$redis->hGet('key','hashKey');//获取值,不存在返回false
$reids->hSetNx('key','hashKey','value');//锁机制,不存在时设置,存在不设置,不存在设置返回true,存在设置返回false
$redis->hLen('key');//返回hash表元素个数
$redis->hStrLen('key','hashKey');//返回hash表中指定元素值的字符串长度,不存在字段返回0
$redis->hDel('key','hashKey1','hashKey2');//从hash表中删除元素,hash表不存在返回false,hashkey不存在返回0,存在返回删除个数
$redis->hKeys('key');//返回hash表中的key索引数组
$redis->hVals('key');//返回hash表中的value值索引数组
$redis->hGetAll('key');//返回hash表中的key和value组成的关联数组
$redis->hExists('key','hashkey');//验证hashkey是否存在hash表中,返回bool
$redis->hIncrBy('key','hashkey',10);//给hash表中指定的hashkey值增加指定数,返回新值
$redis->hMSet('key',array('a'=>1,'b'=>2));//给hash表中设置多个键值对,元素值为NULL的设置空字符串,非字符串强制转为字符串,返回bool
$redis->hMGet('key',array('a','b'));//获取多个指定的hashkey的值,返回关联数组
Pub/Sub 操作
$redis->publish('chan-1', 'hello, world!');//发布消息到频道
$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f');//订阅频道,并执行回调函数,频道,消息体
function f($redis, $chan, $msg) {
switch($chan) {
case 'chan-1':
...
break;
case 'chan-2':
...
break;
case 'chan-2':
...
break;
}
}
Geocoding地理位置 操作
要求 redis >= 3.2
$redis->geoAdd(
"key",
37.773, -122.431, "San Francisco",
-157.858, 21.315, "Honolulu"
);//添加城市经纬度数据到key,返回添加成功个数
$redis->geoHash("key", "San Francisco");//查询多个成员地理位置编码后的字符串,返回数组
$redis->geoPos("key", "Honolulu", "Maui");//查询多个成员的经纬度,返回二维数组
$redis->geoDist("key", "Honolulu", "Maui", 'km');//查询成员之间的距离,默认单位米m,单位公里km,万里mi,步feet,
$redis->geoRadius("", -157.858, 21.306, 300, 'mi');//返回指定地点经纬度半径300万里内的所有其他成员名的集合,返回数组。判断商圈范围
$redis->geoRadiusByMember("key", "Honolulu", 300, 'mi'));//使用成员名半径300万里内的其他成员集合
其他解决方案:postgresql / gis
Script 操作
$redis->eval('return 1');//执行lua脚本,返回复合类型数据
$redis->getLastError();//返回执行lua脚本后的最后一条错误信息,如无,返回false
迭代大数据键
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久
定位大key
为了避免对线上redis带来卡顿,这就要用到scan指令,对于扫描出来的每一个key,使用type指令获得key的类型,然后使用相应数据结构的size或者len方法来得到它的大小,对于每一种类型,保留大小的前N名作为扫描结果展示出来。
上面这样的过程redis官方已经在redis-cli指令中提供了这样的扫描功能,我们可以直接拿来即用。
redis-cli -h 127.0.0.1 -p 6370 –-bigkeys
如果你担心这个指令会大幅抬升redis的ops导致线上报警,还可以增加一个休眠参数。
redis-cli -h 127.0.0.1 -p 6370 –-bigkeys -i 0.1
上面这个指令每隔100条scan指令就会休眠0.1s,ops`就不会剧烈抬升,但是扫描的时间会变长。