## 1 pub sub
### 1.1 sub 端
~~~
public static function redisSub(){
/**
* redis sub(消息訂閱端)
*/
$redis = new Redis();
$res = $redis->pconnect('127.0.0.1', 6379,0);
$redis->auth('XXX');//密碼
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);//超時時間
$redis->subscribe(array('exampleTopic'), 'callback');
}
// 回調函數,自己的處理邏輯
public static function callback($instance, $channelName, $message)
{
switch ($channelName) {
case 'exampleTopic'://調用自定義的接口,執行業務邏輯
Post('https://xxx.com/Xxx/Xx/xx');
break;
default:
}
}
~~~
### 1.2 pub 端
~~~
//redis發布端
public static function RedisPub(){
$redis = new Redis();
$res = $redis->pconnect('127.0.0.1', 6379,0);
// ... 業務了邏輯
//業務邏輯結束 發布訂閱消息
$redis->PUBLISH('exampleTopic ', '消息');
}
~~~
## 2 、counter
~~~
public static function redisCounter(){
$value = Mod::app()->redis->incr('website_visitors');
Mod::app()->redis->expire('website_visitors', 1);
echo "Total website visitors: " . $value . ".";
}
~~~
## 3 、 set
~~~
public static function RedisS(){
Mod::app()->redis->delete('s');
Mod::app()->redis->sAdd('s', 5);
Mod::app()->redis->sAdd('s', 4);
Mod::app()->redis->sAdd('s', 2);
Mod::app()->redis->sAdd('s', 1);
Mod::app()->redis->sAdd('s', 3);
var_dump(Mod::app()->redis->sort('s')); // 1,2,3,4,5
var_dump(Mod::app()->redis->sort('s', array('sort' => 'desc'))); // 5,4,3,2,1
var_dump(Mod::app()->redis->sort('s', array('sort' => 'desc', 'store' => 'out'))); // (int)5
// SISMEMBER "1" 1是否在s里
}
~~~
## 4、hash
~~~
public static function RedisH(){
Mod::app()->redis->delete('h');
Mod::app()->redis->hSet('h', 'key1', 'hello'); /* 1, 'key1' => 'hello' in the hash at "h" */
Mod::app()->redis->hGet('h', 'key1'); /* returns "hello" */
Mod::app()->redis->hSet('h', 'key1', 'plop'); /* 0, value was replaced. */
Mod::app()->redis->hGet('h', 'key1'); /* returns "plop" */
}
~~~
## 5 list
~~~
public static function RedisList(){
/* Non blocking feature */
Mod::app()->redis->lPush('key1', 'A');
Mod::app()->redis->delete('key2');
Mod::app()->redis->blPop('key1', 'key2', 10); /* array('key1', 'A') */
/* OR */
Mod::app()->redis->blPop(array('key1', 'key2'), 10); /* array('key1', 'A') */
Mod::app()->redis->brPop('key1', 'key2', 10); /* array('key1', 'A') */
/* OR */
Mod::app()->redis->brPop(array('key1', 'key2'), 10); /* array('key1', 'A') */
/* Blocking feature */
/* process 1 */
Mod::app()->redis->delete('key1');
Mod::app()->redis->blPop('key1', 10);
/* blocking for 10 seconds */
/* process 2 */
Mod::app()->redis->lPush('key1', 'A');
/* process 1 */
/* array('key1', 'A') is returned*/
}
~~~
### Redis和Memcached的區別
~~~
* Redis和Memcache都是將數據存放在內存中,都是內存數據庫。但是Memcache還可以緩存其他東西,比如圖片、視頻
*
* Redis不只支持簡單的k/v類型的數據,同時還提供list、set、hash等數據結構的存儲
*
* 虛擬內存,當物理內存用完時Redis可以將一些很久沒有用到的value交換到磁盤
*
*
過期策略,memcache在set時就指定,例如`set key1 0 0 8`即永不過期,redis可以通過expire設定,例如:`expire name 10`
*
*
分布式,設定memcache集群,利用magent做一主多從;redis也可以做一主多從。
*
*
存儲安全,memcache掛掉后,數據沒了;redis可以定期保存在磁盤(持久化)
*
*
災難恢復,memcache掛掉后數據不可恢復;redis數據丟失后可以通過aof恢復
*
*
redis支持數據的備份,即master-slave模式的數據備份
*
*
應用場景不同:redis除了可以做nosql數據庫之外,還能做消息隊列、數據堆棧和數據緩存等。memcache適合于緩存sql語句、數據集、用戶臨時性數據、延遲查詢數據和session等
~~~
### redis有哪些數據結構
* String
~~~
字符串類型是redis最基礎的數據結構,首先鍵是字符串類型,而且其他幾種結構都是在字符串類型基礎上構建的
字符串類型實際上可以是字符串、數字、二進制(圖片、音頻),單最大不能超過512M
~~~
使用場景:
~~~
1. 緩存
字符串最經典的使用場景,redis作為緩存層,mysql作為存儲層,絕大部分請求數據都是redis中獲取,由于redis具有支撐高并發特性,所以緩存通常能起到加速讀寫和降低后端壓力的作用
2. 計數器
許多應用都會使用redis作為技術的基礎工具,它可以實現快速技術、查詢緩存的功能。
3. 共享session
處于負載均衡的考慮,分布式服務會將用戶信息的訪問均衡到不同服務器,用戶刷新一次訪問可訥訥個會需要重新登錄,為了避免這個問題可以使用redis將用戶session集中管理,在這種模式下只要保證redis的高可用和擴展性,每次獲取用戶更新或查詢登錄信息都直接從redis中集中獲取
4. 限速
出于安全考慮,每次進行登錄時讓用戶輸入手機驗證碼,為了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率
~~~
* Hash
在redis中哈希類型是指鍵本身又是一種鍵值對結構,如`value = {{field1,value1}...{fieldn,valuen}}`
使用場景:
1. 哈希結構相對于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。
* list
~~~
列表類型是用來存儲多個有序的字符串,列表的每個字符串成為一個元素,一個列表最多可以存儲2的32次方減1個元素。在redis中,可以對列表插入(push)和彈出(pop),還可以獲取指定范圍的元素列表。列表是一種比較靈活的數據結構,它可以充當棧和隊列的角色。
~~~
使用場景:
1. 消息隊列
redis的`lpush+brpop`命令組合就可以實現阻塞隊列,生產者客戶端是用`lpush`從列表左側插入元素,多個消費者客戶端使用`brpop`命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費的負載均衡的高可用性。
2. 使用技巧列表
~~~
lpush+lpop=Stack(棧)
lpush+rpop=Queue(隊列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息隊列)
~~~
* set
* sortedset