# 1.什么是redis
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如
下:
- 字符串類型
- 散列類型
- 列表類型
- 集合類型
- 有序集合類型。
# 2.redis的應用場景
- 緩存(數據查詢、短連接、新聞內容、商品內容等等)。(最多使用)
- 分布式集群架構中的session分離。
- 聊天室的在線好友列表。
- 任務隊列。(秒殺、搶購、12306等等)
- 應用排行榜。
- 網站訪問統計。
- 數據過期處理(可以精確到毫秒)
## redis緩存的數據格式
大概思路:
根據請求的url來判斷:
1.請求的url hash 后在redis中有記錄,則直接返回redis中的數據。
2.請求的url hash 后在redis中無記錄,則查詢數據庫(mysql),保存到redis中,并返回。
url格式: 模塊,控制器,操作(action),page
redis緩存的數據格式:
分為兩種:
一種是html標簽,也就是框架渲染完成的html頁面。
另一種是josn數據,這部分是ajax請求所需的數據。
```php
public function Cache($name, $arguments)
{
// 因為我們主要是根據方法名的后綴決定具體操作,
// 所以如果傳入的 $name 長度小于5,可以直接報錯
if (strlen($name) < 5) {
exit('Method does not exist.');
}
// 接著,我們截取 $name,獲取原方法和要執行的動作,
// 是cache、clear還是flush,這里我們取了個巧,動作
// 的名稱都是5個字符,這樣截取就非常高效。
$method = substr($name, 0, -5);
$action = substr($name, -5);
// 當前調用的類名稱,包括命名空間的名稱
$class = get_class();
// 生成緩存鍵名,$arguments稍后再加上
$key = sprintf('%s:%s:', str_replace('\\', '_', $class), $method);
// 都用小寫好看點
$key = strtolower($key);
switch ($action) {
case 'Cache':
// 緩存鍵名加上$arguments
$key = $key . md5(json_encode($arguments));
// 從Redis中讀取數據
$data = Common::redis()->get($key);
// 如果Redis中有數據
if ($data !== false) {
$decodeData = json_decode($data, JSON_UNESCAPED_UNICODE);
// 如果不是JSON格式的數據,直接返回,否則返回json解析后的數據
return $decodeData === null ? $data : $decodeData;
}
// 如果Redis中沒有數據則繼續往下執行
// 如果原方法不存在
if (method_exists($this, $method) === false) {
exit('Method does not exist.');
}
// 調用原方法獲取數據
$data = call_user_func_array([$this, $method], $arguments);
// 保存數據到Redis中以便下次使用
Common::redis()->set($key, json_encode($data), 3600);
// 結束執行并返回數據
return $data;
break;
case 'Clear':
// 緩存鍵名加上$arguments
$key = $key . md5(json_encode($arguments));
return Common::redis()->del($key);
break;
case 'Flush':
$key = $key . '*';
// 獲取所有符合 $class:$method:* 規則的緩存鍵名
$keys = Common::redis()->keys($key);
return Common::redis()->del($keys);
break;
default:
exit('Method does not exist.');
}
}
```
任務隊列。(秒殺、搶購、12306等等) 使用 列表
```php
public function LPUSH(){
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
try {
$redis->LPUSH('click',$user_id);
}
catch(Exception $e) {
echo $e->getMessage();
}
}
public function LPOP(){
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
while(1) {
try{
$value = $redis->LPOP('click');
/**
利用$value進行邏輯和數據處理
*/
}
catch(Exception $e) {
echo $e->getMessage();
}
}
}
```
應用排行榜。 使用 鍵(key)和有序集合
```php
<?php
namespace Leaderboard;
/**
* 使用rediszset的的商品排行榜
* @author yiwang
*
*/
class RedisLeaderboard
{
/**
*
* @var object redis client
*/
private $redis;
/**
*
* @var string 放置排行榜的key
*/
private $leaderboard;
/**
* 構造函數
* @param object $redis 已連接redis的phpredis的對象
* @param string $leaderboard 字符串,排行榜的key名
*/
public function __construct($redis = [], $leaderboard = '')
{
if ($redis) {
$this->redis = $redis;
} else {
$this->redis = new \Redis();
$this->redis->connect('127.0.0.1');
}
if ($leaderboard) {
//這里不會檢查當前的key值是否存在,是為了方便重新訪問對應的排行榜
$this->leaderboard = $leaderboard;
} else {
$this->leaderboard = 'leaderboard:' . mt(1, 100000);
while (!empty($this->redis->exists($this->leaderboard))) {
$this->leaderboard = 'leaderboard:' . mt(1, 100000);
}
}
}
/**
* 獲取當前的排行榜的key名
* @return string
*/
public function getLeaderboard()
{
return $this->leaderboard;
}
/**
* 將對應的值填入到排行榜中
* @param $node 對應的需要填入的值(比如商品的id)
* @param number $count 對應的分數,默認值為1
* @return Long 1 if the element is added. 0 otherwise.
*/
public function addLeaderboard($node, $count = 1)
{
return $this->redis->zAdd($this->leaderboard, $count, $node);
}
/**
* 給出對應的排行榜
* @param int $number 需要給出排行榜數目
* @param bool $asc 排序順序 true為按照高分為第0
* @param bool $withscores 是否需要分數
* @param callback $callback 用于處理排行榜的回調函數
* @return [] 對應排行榜
*/
public function getLeadboard($number, $asc = true, $withscores = false,$callback = null)
{
if ($asc) {
$nowLeadboard = $this->redis->zRevRange($this->leaderboard, 0, $number -1, $withscores);//按照高分數順序排行;
} else {
$nowLeadboard = $this->redis->zRange($this->leaderboard, 0, $number -1, $withscores);//按照低分數順序排行;
}
if ($callback) {
//使用回調處理
return $callback($nowLeadboard);
} else {
return $nowLeadboard;
}
}
/**
* 獲取給定節點的排名
* @param string $node 對應的節點的key名
* @param string $asc 是否按照分數大小正序排名, true的情況下分數越大,排名越高
* @return 節點排名,根據$asc排序,true的話,第一高分為0,false的話第一低分為0
*/
public function getNodeRank($node, $asc = true)
{
if ($asc) {
//zRevRank 分數最高的排行為0,所以需要加1位
return $this->redis->zRevRank($this->leaderboard, $node);
} else {
return $this->redis->zRank($this->leaderboard, $node);
}
}
}
```
網站訪問統計。 使用 鍵(key)
```php
header("Content-Type:text/html;charset=utf-8");
include 'lib/mysql.class.php';
$mysql_obj = mysql::getConn();
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
if(isset($_SERVER['HTTP_REFERER'])){
$url_md5 = md5($_SERVER['HTTP_REFERER']);
}
$adve_key = 'adve';
$adve_key_exists = 'adve_exists';
if(!$redis->exists($adve_key_exists)){
$list = $mysql_obj->fetch_array("select * from user_online_adve");
if($list){
foreach ($list as $key => $value) {
$url_hash = md5($value['adve_url']);
$adve_hash_key = $adve_key.":".$url_hash;
$id = $value['id'];
$redis->set($adve_hash_key,$id);
$redis->set($adve_key_exists,true);
//$redis->hmset($adve_hash_key, array('id' =>$id));
//print_r($redis->get($adve_hash_key));
}
}
}
$adve_new_key = $adve_key.':'.$url_md5;
if($redis->exists($adve_new_key)){
$adve_plus = $adve_new_key.":plus" ;
if(!$redis->exists($adve_plus)){
$redis->set($adve_plus,1);
}else{
$redis->incr($adve_plus);
$num = $redis->get($adve_plus);
if($num >10){
$id = $redis->get($adve_new_key);
// insert to sql;
$mysql_obj->query("update user_online_adve set adve_num=adve_num+$num where id=$id");
$redis->set($adve_plus,1);
}
}
}
header('HTTP/1.0 301 Moved Permanently');
header('Location: https://itunes.apple.com/cn/app/san-guo-zhi15-ba-wangno-da-lu/id694974270?mt=8');
```
分布式集群架構中的session分離。
聊天室的在線好友列表。
數據過期處理(可以精確到毫秒)
redis的所有操作
**setex 帶生存時間的寫入值**
```php
$redis->setex('key', 3600, 'value');
```
**setnx 判斷是否重復的,寫入值,如存在了不修改返回0,不存在就添加返回1**
```php
$redis->setnx('key', 'value');
```
**返回已經刪除key**
```php
$redis->delete('key1'); 成功返回1失敗返回0
$redis->delete('key1','key2'); 刪除兩個鍵成功返回1失敗返回0
```
**查詢生存時間**
```php
$redis->ttl('key1'); 持久化的返回-1,有生存時間的返回時間(單位秒)
```
**同時給多個key賦值,同時設置key0和key1**
```php
$redis->mset(array('key0' => 'value0', 'key1' => 'value1'));
```
**key中的值進行自增1,如果填寫了第二個參數,者自增第二個參數所填的值**
```php
$redis->incr('key1');
$redis->incrBy('key1', 10);
```
**減法跟加法一樣**
```php
$redis->decr("key1"); 減少1
$redis->decrBy("key1",5) 減少5
```
## **list相關操作,連表操作**
**lPush**
```php
$redis->lPush("list", "888");
$id = $redis->lpush('list','HHHHHHH');echo $id;返回鏈表的元素個數
$redi->lrange('list',0,-1); 返回全部數據,數組形式
$redis->lrange('list',0,2); 返回連表0-2坐標的三個元素
```
**lPushx/rPushx**
```php
$redis->lPushx(key, value);
```
**在名稱為key的list左邊(頭)/右邊(尾)添加一個值為value的元素,如果value已經存在,則不添加**
```php
$redis->lpop('list');輸出鏈表最左邊的ksy的值,輸出后刪除掉這個key
$redis->rpop('list');輸出鏈表最右邊的ksy的值,輸出后刪除掉這個key
$redis->lset('list',7,"update"); 修改坐標為7的值,成功返回1
```
**集合:sadd,sadd是無序的集合,每次插入集合的時候都可能會弄亂里面集合的排序**
sadd s1 zhangsan
sadd s1 lisi
sadd s1 wangwu
sadd t1 yangxingyi
sadd t1 lilei
sadd t1 zhangsan
smembers s1 s1的所有集合內容
sdiff s1 t1 s1有的,t1沒有的,差集
```php
$redis->sinter('s1','t1');返回s1和t1兩個集合都有的,數組形式
```
**scard s1 返回s1集合里面的個數,有多少個就返回多少個,沒有從0開始的,坐標才從0開始的**
spop抽獎場景,返回集合里面隨機的數
spop s1 默認返回1個,返回后就刪除這個數,中獎了就不能再中了
```php
$i = $redis->spop('s1');var_dump($i); 返回一個數,返回后刪除這個數
$i = $redis->spop('s1',2);var_dump($i);不能返回兩個的,提示錯誤的
```
**隨機返回集合里面的一個元素,但不刪除,重復中獎**
```php
$i = $redis->srandmember('s1');echo $i;
```
**sismember s1 zhangsan 查詢張三在不在集合里面,在1,不在false**
```php
$i = $redis->sismember('s1','zhangsan2');echo $i;在1,不在false
```
zadd key 2 value 有序集合
zadd y1 1 zhangsan;
zadd y1 3 lisi;
zadd y1 2 wangwu;
zrange y1 0 -1; 排序就是,根據插入的時候的排序從小到達zhangsan,wangwu,lisi
```php
$i = $redis->zrange('y1',0,-1);var_dump($i);
```
返回數組,鍵值不是插入時候給的鍵,是從0開始的新鍵
zrevrange y1 0 -1; 反轉排序,插入的時候鍵值越高,排序越優先
zcard y1 ;獲取有序集合里面的個數,有多少個就返回多少個,沒有從0開始的,坐標才從0開始的
無序就scard,有序就zcard,有z沒有s
sInterStore
求交集并將交集保存到output的集合
```php
$redis->sInterStore('output', 'key1', 'key2', 'key3')
```
## Hash操作
**hSet 向名稱為h的hash中添加元素key1—>hello**
```php
$redis->hSet('h', 'key1', 'hello');
```
**hGet 返回名稱為h的hash中key1對應的value(hello)**
```php
$redis->hGet('h', 'key1');
```
hLen 返回名稱為h的hash中元素個數
```php
$redis->hLen('h');
```
hDel 刪除名稱為h的hash中鍵為key1的域
```php
$redis->hDel('h', 'key1');
```
hKeys 返回名稱為key的hash中所有鍵
```php
$redis->hKeys('h');
```
hVals 返回名稱為h的hash中所有鍵對應的value
```php
$redis->hVals('h')
```
hGetAll 返回名稱為h的hash中所有的鍵(field)及其對應的value
```php
$redis->hGetAll('h');
```
hExists名稱為h的hash中是否存在鍵名字為a的域
```php
$redis->hExists('h', 'a');
```
hIncrBy將名稱為h的hash中x的value增加2
```php
$redis->hIncrBy('h', 'x', 2);
```
hMset 向名稱為key的hash中批量添加元素
```php
$redis->hMset('user:1', array('name' => 'Joe', 'salary' => 2000));
```
hMGet 返回名稱為h的hash中field1,field2對應的value
```php
$redis->hmGet('h', array('field1', 'field2'));
```
其他
```php
redis 操作相關
flushDB
清空當前數據庫
flushAll
清空所有數據庫
randomKey
隨機返回key空間的一個key
$key = $redis->randomKey();
select
選擇一個數據庫
move
轉移一個key到另外一個數據庫
$redis->select(0); // switch to DB 0
$redis->set('x', '42'); // write 42 to x
$redis->move('x', 1); // move to DB 1
$redis->select(1); // switch to DB 1
$redis->get('x'); // will return 42
rename, renameKey
給key重命名
$redis->set('x', '42');
$redis->rename('x', 'y');
$redis->get('y'); // → 42
$redis->get('x'); // → `FALSE`
renameNx
與remane類似,但是,如果重新命名的名字已經存在,不會替換成功
setTimeout, expire
設定一個key的活動時間(s)
$redis->setTimeout('x', 3);
expireAt
key存活到一個unix時間戳時間
$redis->expireAt('x', time() + 3);
keys, getKeys
返回滿足給定pattern的所有key
$keyWithUserPrefix = $redis->keys('user*');
dbSize
查看現在數據庫有多少key
$count = $redis->dbSize();
auth
密碼認證
$redis->auth('foobared');
bgrewriteaof
使用aof來進行數據庫持久化
$redis->bgrewriteaof();
slaveof
選擇從服務器
$redis->slaveof('10.0.1.7', 6379);
save
將數據同步保存到磁盤
bgsave
將數據異步保存到磁盤
lastSave
返回上次成功將數據保存到磁盤的Unix時戳
info
返回redis的版本信息等詳情
Redis::__construct構造函數
$redis = new Redis();
connect, open 鏈接redis服務
參數
host: string,服務地址
port: int,端口號
timeout: float,鏈接時長 (可選, 默認為 0 ,不限鏈接時間)
注: 在redis.conf中也有時間,默認為300
pconnect, popen 不會主動關閉的鏈接
參考上面
setOption 設置redis模式
getOption 查看redis設置的模式
ping 查看連接狀態
get 得到某個key的值(string值)
如果該key不存在,return false
set 寫入key 和 value(string值)
如果寫入成功,return ture
setex 帶生存時間的寫入值
$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.
setnx 判斷是否重復的,寫入值
$redis->setnx('key', 'value');
$redis->setnx('key', 'value');
delete 刪除指定key的值
返回已經刪除key的個數(長整數)
$redis->delete('key1', 'key2');
$redis->delete(array('key3', 'key4', 'key5'));
ttl
得到一個key的生存時間
persist
移除生存時間到期的key
如果key到期 true 如果不到期 false
mset (redis版本1.1以上才可以用)
同時給多個key賦值
$redis->mset(array('key0' => 'value0', 'key1' => 'value1'));
multi, exec, discard
進入或者退出事務模式
參數可選Redis::MULTI或Redis::PIPELINE. 默認是 Redis::MULTI
Redis::MULTI:將多個操作當成一個事務執行
Redis::PIPELINE:讓(多條)執行命令簡單的,更加快速的發送給服務器,但是沒有任何原子性的保證
discard:刪除一個事務
返回值
multi(),返回一個redis對象,并進入multi-mode模式,一旦進入multi-mode模式,以后調用的所有方法都會返回相同的對象,只到exec()方法被調用。
watch, unwatch (代碼測試后,不能達到所說的效果)
監測一個key的值是否被其它的程序更改。如果這個key在watch 和 exec (方法)間被修改,這個 MULTI/EXEC 事務的執行將失敗(return false)
unwatch 取消被這個程序監測的所有key
參數,一對key的列表
$redis->watch('x');
$ret = $redis->multi() ->incr('x') ->exec();
subscribe *
方法回調。注意,該方法可能在未來里發生改變
publish *
發表內容到某一個通道。注意,該方法可能在未來里發生改變
exists
判斷key是否存在。存在 true 不在 false
incr, incrBy
key中的值進行自增1,如果填寫了第二個參數,者自增第二個參數所填的值
$redis->incr('key1');
$redis->incrBy('key1', 10);
decr, decrBy
做減法,使用方法同incr
getMultiple
傳參
由key組成的數組
返回參數
如果key存在返回value,不存在返回false
$redis->set('key1', 'value1'); $redis->set('key2', 'value2'); $redis->set('key3', 'value3'); $redis->getMultiple(array('key1', 'key2', 'key3'));
$redis->lRem('key1', 'A', 2);
$redis->lRange('key1', 0, -1);
list相關操作
lPush
$redis->lPush(key, value);
在名稱為key的list左邊(頭)添加一個值為value的 元素
rPush
$redis->rPush(key, value);
在名稱為key的list右邊(尾)添加一個值為value的 元素
lPushx/rPushx
$redis->lPushx(key, value);
在名稱為key的list左邊(頭)/右邊(尾)添加一個值為value的元素,如果value已經存在,則不添加
lPop/rPop
$redis->lPop('key');
輸出名稱為key的list左(頭)起/右(尾)起的第一個元素,刪除該元素
blPop/brPop
$redis->blPop('key1', 'key2', 10);
lpop命令的block版本。即當timeout為0時,若遇到名稱為key i的list不存在或該list為空,則命令結束。如果timeout>0,則遇到上述情況時,等待timeout秒,如果問題沒有解決,則對keyi+1開始的list執行pop操作
lSize
$redis->lSize('key');
返回名稱為key的list有多少個元素
lIndex, lGet
$redis->lGet('key', 0);
返回名稱為key的list中index位置的元素
lSet
$redis->lSet('key', 0, 'X');
給名稱為key的list中index位置的元素賦值為value
lRange, lGetRange
$redis->lRange('key1', 0, -1);
返回名稱為key的list中start至end之間的元素(end為 -1 ,返回所有)
lTrim, listTrim
$redis->lTrim('key', start, end);
截取名稱為key的list,保留start至end之間的元素
lRem, lRemove
$redis->lRem('key', 'A', 2);
刪除count個名稱為key的list中值為value的元素。count為0,刪除所有值為value的元素,count>0從頭至尾刪除count個值為value的元素,count<0從尾到頭刪除|count|個值為value的元素
lInsert
在名稱為為key的list中,找到值為pivot 的value,并根據參數Redis::BEFORE | Redis::AFTER,來確定,newvalue 是放在 pivot 的前面,或者后面。如果key不存在,不會插入,如果 pivot不存在,return -1
$redis->delete('key1'); $redis->lInsert('key1', Redis::AFTER, 'A', 'X'); $redis->lPush('key1', 'A'); $redis->lPush('key1', 'B'); $redis->lPush('key1', 'C'); $redis->lInsert('key1', Redis::BEFORE, 'C', 'X');
$redis->lRange('key1', 0, -1);
$redis->lInsert('key1', Redis::AFTER, 'C', 'Y');
$redis->lRange('key1', 0, -1);
$redis->lInsert('key1', Redis::AFTER, 'W', 'value');
rpoplpush
返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部
$redis->delete('x', 'y');
$redis->lPush('x', 'abc'); $redis->lPush('x', 'def'); $redis->lPush('y', '123'); $redis->lPush('y', '456'); // move the last of x to the front of y. var_dump($redis->rpoplpush('x', 'y'));
var_dump($redis->lRange('x', 0, -1));
var_dump($redis->lRange('y', 0, -1));
string(3) "abc"
array(1) { [0]=> string(3) "def" }
array(3) { [0]=> string(3) "abc" [1]=> string(3) "456" [2]=> string(3) "123" }
SET操作相關
sAdd
向名稱為key的set中添加元素value,如果value存在,不寫入,return false
$redis->sAdd(key , value);
sRem, sRemove
刪除名稱為key的set中的元素value
$redis->sAdd('key1' , 'set1');
$redis->sAdd('key1' , 'set2');
$redis->sAdd('key1' , 'set3');
$redis->sRem('key1', 'set2');
sMove
將value元素從名稱為srckey的集合移到名稱為dstkey的集合
$redis->sMove(seckey, dstkey, value);
sIsMember, sContains
名稱為key的集合中查找是否有value元素,有ture 沒有 false
$redis->sIsMember(key, value);
sCard, sSize
返回名稱為key的set的元素個數
sPop
隨機返回并刪除名稱為key的set中一個元素
sRandMember
隨機返回名稱為key的set中一個元素,不刪除
sInter
求交集
sInterStore
求交集并將交集保存到output的集合
$redis->sInterStore('output', 'key1', 'key2', 'key3')
sUnion
求并集
$redis->sUnion('s0', 's1', 's2');
s0,s1,s2 同時求并集
sUnionStore
求并集并將并集保存到output的集合
$redis->sUnionStore('output', 'key1', 'key2', 'key3');
sDiff
求差集
sDiffStore
求差集并將差集保存到output的集合
sMembers, sGetMembers
返回名稱為key的set的所有元素
sort
排序,分頁等
參數
'by' => 'some_pattern_*',
'limit' => array(0, 1),
'get' => 'some_other_pattern_*' or an array of patterns,
'sort' => 'asc' or 'desc',
'alpha' => TRUE,
'store' => 'external-key'
例子
$redis->delete('s'); $redis->sadd('s', 5); $redis->sadd('s', 4); $redis->sadd('s', 2); $redis->sadd('s', 1); $redis->sadd('s', 3);
var_dump($redis->sort('s')); // 1,2,3,4,5
var_dump($redis->sort('s', array('sort' => 'desc'))); // 5,4,3,2,1
var_dump($redis->sort('s', array('sort' => 'desc', 'store' => 'out'))); // (int)5
string命令
getSet
返回原來key中的值,并將value寫入key
$redis->set('x', '42');
$exValue = $redis->getSet('x', 'lol'); // return '42', replaces x by 'lol'
$newValue = $redis->get('x')' // return 'lol'
append
string,名稱為key的string的值在后面加上value
$redis->set('key', 'value1');
$redis->append('key', 'value2');
$redis->get('key');
getRange (方法不存在)
返回名稱為key的string中start至end之間的字符
$redis->set('key', 'string value');
$redis->getRange('key', 0, 5);
$redis->getRange('key', -5, -1);
setRange (方法不存在)
改變key的string中start至end之間的字符為value
$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis");
$redis->get('key');
strlen
得到key的string的長度
$redis->strlen('key');
getBit/setBit
返回2進制信息
zset(sorted set)操作相關
zAdd(key, score, member):向名稱為key的zset中添加元素member,score用于排序。如果該元素已經存在,則根據score更新該元素的順序。
$redis->zAdd('key', 1, 'val1');
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 5, 'val5');
$redis->zRange('key', 0, -1); // array(val0, val1, val5)
zRange(key, start, end,withscores):返回名稱為key的zset(元素已按score從小到大排序)中的index從start到end的所有元素
$redis->zAdd('key1', 0, 'val0');
$redis->zAdd('key1', 2, 'val2');
$redis->zAdd('key1', 10, 'val10');
$redis->zRange('key1', 0, -1); // with scores $redis->zRange('key1', 0, -1, true);
zDelete, zRem
zRem(key, member) :刪除名稱為key的zset中的元素member
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zDelete('key', 'val2');
$redis->zRange('key', 0, -1);
zRevRange(key, start, end,withscores):返回名稱為key的zset(元素已按score從大到小排序)中的index從start到end的所有元素.withscores: 是否輸出socre的值,默認false,不輸出
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRevRange('key', 0, -1); // with scores $redis->zRevRange('key', 0, -1, true);
zRangeByScore, zRevRangeByScore
$redis->zRangeByScore(key, star, end, array(withscores, limit ));
返回名稱為key的zset中score >= star且score <= end的所有元素
zCount
$redis->zCount(key, star, end);
返回名稱為key的zset中score >= star且score <= end的所有元素的個數
zRemRangeByScore, zDeleteRangeByScore
$redis->zRemRangeByScore('key', star, end);
刪除名稱為key的zset中score >= star且score <= end的所有元素,返回刪除個數
zSize, zCard
返回名稱為key的zset的所有元素的個數
zScore
$redis->zScore(key, val2);
返回名稱為key的zset中元素val2的score
zRank, zRevRank
$redis->zRevRank(key, val);
返回名稱為key的zset(元素已按score從小到大排序)中val元素的rank(即index,從0開始),若沒有val元素,返回“null”。zRevRank 是從大到小排序
zIncrBy
$redis->zIncrBy('key', increment, 'member');
如果在名稱為key的zset中已經存在元素member,則該元素的score增加increment;否則向集合中添加該元素,其score的值為increment
zUnion/zInter
參數
keyOutput
arrayZSetKeys
arrayWeights
aggregateFunction Either "SUM", "MIN", or "MAX": defines the behaviour to use on duplicate entries during the zUnion.
對N個zset求并集和交集,并將最后的集合保存在dstkeyN中。對于集合中每一個元素的score,在進行AGGREGATE運算前,都要乘以對于的WEIGHT參數。如果沒有提供WEIGHT,默認為1。默認的AGGREGATE是SUM,即結果集合中元素的score是所有集合對應元素進行SUM運算的值,而MIN和MAX是指,結果集合中元素的score是所有集合對應元素中最小值和最大值
```
- 服務器購買到搭建寶塔
- 結構規范
- php基礎
- php簡介
- php是什么
- PHP 能做什么
- PHP 如何運行
- 如何了解弱語言
- 安裝環境
- 安裝LNMP
- 寶塔
- phpstudy
- PHP基本語法
- PHP 標記
- 從 HTML 中分離
- 指令分隔符
- 注釋
- php 數據類型
- 類型檢測
- 四種標量類型
- boolean(布爾型)
- Integer 整型
- Float 浮點型
- String 字符串類型
- 兩種復合類型
- array(數組)
- object(對象)
- 兩種特殊類型
- resource(資源)
- NULL(無類型)
- 類型轉換
- 變量
- 變量定義和命名規范
- 傳值和引用
- 預定義變量
- php預定義變量
- $_SERVER詳解
- 變量范圍
- 全局變量
- 靜態變量
- 可變變量
- 常量
- 常量簡介
- 常量定義
- 相比變量
- 魔術常量
- 運算符
- 運算符簡介
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增(減)運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 新增操作符
- 控制結構
- 控制簡介
- if 語句
- while 語句
- for 語句
- foreach 語句
- break 語句
- continue 語句
- switch 語句
- declare 語句
- return 語句
- include 語句
- PHP 函數
- 函數簡介
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部函數
- 匿名函數
- PHP 的類和對象
- PHP 的類和對象簡介
- 基本概念
- 對象繼承
- 屬性
- 類常量
- 自動加載對象
- 構造和析構函數
- 訪問控制
- 范圍解析操作符(::)
- 靜態static
- Static 關鍵字
- 抽象類
- 接口
- 匿名類
- 面向對象其他特性
- const關鍵字
- final關鍵字
- abstract用于定義抽象方法和抽象類。
- self、$this、parent::關鍵字
- 接口(interface)
- trait關鍵字
- instanceof關鍵字
- 魔術方法
- 構造函數和析構函數
- 私有屬性的設置獲取
- __toString()方法
- __clone()方法
- __call()方法
- 類的自動加載
- 會話控制
- cookie
- PHP 操作 cookie
- 項目實戰
- SESSION
- Session 的初步介紹與實驗準備
- PHP 操作 session
- 項目實戰2
- http
- 特點
- 工作過程
- request
- response
- HTTP狀態碼
- URL
- GET和POST的區別
- HTTPS
- 常用函數
- 常用的字符串函數
- 常用的數組函數
- 常用文件函數
- 常用時間函數
- 常用日歷函數
- 常用url函數
- 面試題常見
- 時間戳
- 技術類文檔
- 技術開發文檔
- 開發環境
- 開發規范
- 注釋規范
- 開發目錄結構
- 數據庫字典
- 路由
- 定時任務
- 獲取系統配置
- 系統常用函數
- 后臺表單
- 消息隊列
- 第三方類庫標注
- 需求文檔
- 數據庫
- MYSQL
- 事務(重點)
- 索引
- 存儲過程
- 觸發器
- 視圖
- 導入導出數據庫
- 優化mysql數據庫的方法
- MyISAM與InnoDB區別
- 外連接、內連接的區別
- 物理文件結構
- MongoDB
- Redis
- 運用場景和實例
- pgsql
- 服務器
- Nginx
- 正向代理和反向代理
- 負載均衡
- Linux常用命令
- 基本目錄和命令
- php開發工具
- phpStorm編輯器
- 安裝和漢化
- 鏈接ftp
- 常用操作
- 常用快捷鍵
- 自定義快捷鍵
- 使用快捷鍵新建目錄和文件
- 使用快捷鍵快速查找文件、類、方法
- 多文件切換
- 快速搜索設置項
- 多點編輯
- 方法重構
- 自定義文件模板和代碼片段
- 自定義文件模板
- 自定義代碼片段
- Xdebug 調試插件
- 安裝Xdebug 調試插件
- 在PHPStorm 中使用 Xdebug 插件調試代碼
- Vi Box虛擬機
- Vi Box 虛擬機 Oracle VM VirtualBox
- 虛擬機輔助工具一-Vagrant
- 華碩主板BIOS設置中VT虛擬化技術選項怎么開啟 Oracle VM VirtualBox
- 溝通工具
- 文檔分享
- 流程圖
- 任務分配
- 代碼托管
- 缺陷管理
- 設計圖
- gitLab
- 安裝
- 漢化
- Gitlab 用戶和項目管理
- Gitlab 持續集成與自動構建實踐
- PHP進階
- 大流量解決方案
- PSR規范
- RESTFUL規范
- 設計模式
- 單例模式
- 策略模式
- 工廠模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 外觀模式
- 享元模式
- 代理模式
- 命令模式
- 中介者模式
- 觀察者模式
- 狀態模式
- 建筑者模式
- 適配器模式
- 橋接模式
- 裝飾器模式
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希爾排序算法
- 選擇排序算法
- 快速排序算法
- 常見網絡攻擊類型
- CSRF攻擊
- XSS攻擊
- SQL注入
- Cookie攻擊
- thinkphp
- thinkphp5命令行
- git
- Git 常用命令操作和基礎學習
- 傻瓜與白癡的筆記本
- 學習
- 一、Git 與 GitHub 的來歷
- 二、在 GitHub 上創建倉庫
- 三、安裝
- Windows 上安裝 Git
- 安裝2
- 四、克隆 GitHub 上的倉庫到本地
- 五、GIT基本操作哦
- 六、Git 分支操作
- 一、添加SSH關聯授權
- 二、為 Git 命令設置別名
- 三、Git 分支管理
- 七、多人協作 GitHub 部分
- 八、多人協作 Git 部分
- 九、Git tag 和 GitHub releases
- composer
- Composer 基礎使用
- 安裝和使用
- 在項目中集成PHPmailer
- 認識composer.json和composer.lock文件
- composer的其他命令操作
- 本地創建composer包
- 提交自己的依賴包到composer Packagist
- crontab計劃任務
- Linux任務計劃crontab
- php 的 計劃任務——Crontab
- bootstrap前端框架
- 入門
- 實戰技巧
- 后臺模板樣式——admin
- 第三方接口對接
- 微信
- 敏感詞過濾
- 微信圖片檢測
- 短信類型
- 阿里云短信
- 容聯云短信
- 飛鴿短信
- 媒體
- 新聞接口測試
- 免費新聞
- 免費視頻
- nba賽事,未測試
- 豆瓣電影接口
- 音樂接口
- 網易短視頻接口
- 知乎微信接口
- 百度ai
- 百度語音
- 圖片識別
- 騰訊
- 騰訊im
- 騰訊云直播
- 騰訊滑動驗證
- 物流快遞
- 快遞鳥、快遞100
- 推送
- 極光推送
- 地圖&天氣
- 獲取城市和天氣預報
- 地址獲取和定位
- 地址轉換經緯度
- 圖片類型
- 360新聞圖片
- 多平臺翻譯
- 實名認證
- 七牛云
- 云合同
- 多站點收錄查詢接口
- 打印機
- 第三方登錄
- 微信登錄
- 支付
- 支付寶app支付
- 微信提現+退款
- 微信app支付
- 微信支付公式
- 類庫
- 圖片類
- phpqrcode實戰:生成二維碼
- 圖片處理類
- 驗證碼類
- 消息類
- PHPMailer
- 分詞類
- ik
- PHPAnalysis
- 自己封裝的方法
- GD庫
- 自動獲取圖片主題顏色
- 圖片轉素描
- 生成海報
- 圖片轉字符
- 驗證碼
- 圖片轉黑白灰
- GD庫實現圖片水印與縮略圖
- Imagick擴展
- 將一張image圖片轉化為字符串的形式
- 基本方法
- 圖片路徑轉base64
- 生成文件后綴圖片
- url路徑判斷拼接
- 防篡改入口文件
- php中文姓名判斷
- 可控抽獎
- 特殊截取
- 銀行卡位(特殊卡號不支持)
- 微信紅包計算
- 數組和對象互轉
- php批量更新修改數據庫
- base64_img上傳
- 刪庫刪目錄————跑路
- 字符串特殊符號過濾
- 首字母轉成默認頭像
- 生成隨機字符串
- 根據id轉 邀請碼
- 日志寫入
- 字符串截取,超出顯示省略號
- 清除html標簽+清除html標簽,字符串截取
- 計算時間差的函數和演示
- php判斷路徑是否是絕對路徑,如果不是拼接至絕對路徑
- sql 參數過濾
- php敏感詞過濾
- 省市區分別截取
- 生成csv
- 無限極分類
- api接口返回封裝的方法函數
- xml和數組互轉
- 獲取thinkph5下控制器和方法名
- 過濾
- 獲取服務器信息
- php隨機顏色
- 創建多級目錄
- 推廣碼
- 跨域檢測
- 二維碼
- 文檔類
- word
- PHPWord
- tcPdf
- MPDF
- dompdf
- FPDF、Fpdi類庫
- excel
- PhpSpreadsheet導入
- phpExcel
- 時間
- PHP-農歷+節氣+節日等類庫
- 時間類庫
- 最好用的是人性化時間差
- 文件管理類
- 文件操作類
- 文件夾操作
- php操作ftp的類庫
- curl
- 數據庫操作類
- Db擴展函數
- 數據庫備份
- 仿tp5的Db庫
- 不常用mysql
- 自動生成數據庫字典
- 字符串
- 字符串操作helper/Str
- 隨機生成姓名
- 隨機生成類
- php字符串類
- 中文轉拼音的類庫
- 分類
- 緩存
- 數據驗證
- 身份證相關操作
- 安全類
- 表單生成類
- 自動生成表單,未完待續中