Redis函式

carrot發表於2018-11-30

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萬里內的其他成員集合

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`就不會劇烈抬升,但是掃描的時間會變長。

相關文章