1. 程式人生 > >redis學習 基礎篇(二) php操作redis

redis學習 基礎篇(二) php操作redis

之前的基礎篇(一)已經學習了redis的含義和五種資料結構的操作,訂閱和事務。而我們學習redis就是為了輔助php的,所以這次學習php操作redis 

一,環境配置

系統環境:centos

php版本:5.3.3

php redis擴充套件下載:https://github.com/phpredis/phpredis/releases/tag/3.1.3RC1。此次用的3.1.3

$ cd phpredis-2.2.7                      # 進入 phpredis 目錄
$ /usr/local/php/bin/phpize              # php安裝後的路徑
$ ./configure --with-php-config=/usr/bin/php-config
$ make && make install
然後修改php配置檔案/etc/php.ini,最後一行加上
extension=redis.so

可以通過php -m檢視是否有redis判斷安裝是否成功。

二,php連線redis

新建一個php檔案,寫入

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);//第一個為ip,第二個為埠號
然後執行就可以了。

三,php操作redis

先看一看轉載的操作手冊

String 型別操作

string是redis最基本的型別,而且string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件

$redis->set('key','TK');
$redis->set('number','1');
$redis->setex('key',5,'TK'); //設定有效期為5秒的鍵值
$redis->psetex('key',5000,'TK'); //設定有效期為5000毫秒(同5秒)的鍵值
$redis->setnx('key','XK'); //若鍵值存在返回false 不存在返回true
$redis->delete('key'); 刪除鍵值 可以傳入陣列 array('key1','key2')刪除多個鍵
$redis->getSet('key','XK'); //將鍵key的值設定為XK, 並返回這個鍵值原來的值TK
 $ret = $redis->multi()  //批量事務處理,不保證處理資料的原子性
        ->set('key1', 'val1')
        ->get('key1')
        ->setnx('key', 'val2')
        ->get('key2')
        ->exec();
$redis->watch('key');   // 監控鍵key 是否被其他客戶端修改
                           如果KEY在呼叫watch()和exec()之間被修改,exec失敗
function f($redis, $chan, $msg) {  //頻道訂閱
    switch($chan) {
        case 'chan-1':
            echo $msg;
            break;

        case 'chan-2':
            echo $msg;
            break;

        case 'chan-2':
            echo $msg;
            break;
    }
}

$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f'); // subscribe to 3 chans

$redis->publish('chan-1', 'hello, world!'); // send message. 
$redis->exists('key'); //驗證鍵是否存在,存在返回true
$redis->incr('number'); //鍵值加1
$redis->incrby('number',-10); //鍵值加減10
$redis->incrByFloat('number', +/- 1.5); //鍵值加減小數
$redis->decr('number'); // 鍵值減1
$redis->decrBy('number',10); // 鍵值減10
$mget = $redis->mget(array('number','key')); // 批量獲取鍵值,返回一個數組
$redis->mset(array('key0' => 'value0', 'key1' => 'value1')); // 批量設定鍵值
$redis->msetnx(array('key0' => 'value0', 'key1' => 'value1')); 
                                        // 批量設定鍵值,類似將setnx()方法批量操作
$redis->append('key', '-Smudge'); //原鍵值TK,將值追加到鍵值後面,鍵值為TK-Smudge
$redis->getRange('key', 0, 5); // 鍵值擷取從0位置開始到5位置結束
$redis->getRange('key', -6, -1); // 字串擷取從-6(倒數第6位置)開始到-1(倒數第1位置)結束
$redis->setRange('key', 0, 'Smudge'); 
                                    // 鍵值中替換字串,0表示從0位置開始
                                       有多少個字元替換多少位置,其中漢字佔2個位置
$redis->strlen('key'); //鍵值長度
$redis->getBit('key');
$redis->setBit('key');

list連結串列操作

$redis->delete('list-key'); // 刪除連結串列
$redis->lPush('list-key', 'A'); //插入連結串列頭部/左側,返回連結串列長度
$redis->rPush('list-key', 'B'); //插入連結串列尾部/右側,返回連結串列長度
$redis->lPushx('list-key', 'C'); 
                 // 插入連結串列頭部/左側,連結串列不存在返回0,存在即插入成功,返回當前連結串列長度
$redis->rPushx('list-key', 'C'); 
                 // 插入連結串列尾部/右側,連結串列不存在返回0,存在即插入成功,返回當前連結串列長度
$redis->lPop('list-key'); //返回LIST頂部(左側)的VALUE ,後入先出(棧)
$redis->rPop('list-key'); //返回LIST尾部(右側)的VALUE ,先入先出(佇列)
$redis->blPop();
$redis->brPop();
$redis->lSize('list-key'); 
                    // 如果是連結串列則返回連結串列長度,空連結串列返回0 
                       若不是連結串列或者不為空,則返回false ,判斷非連結串列 " === false "                          
$redis->lGet('list-key',-1); // 通過索引獲取連結串列元素 0獲取左側一個  -1獲取最後一個
$redis->lSet('list-key', 0, 'X'); //0位置元素替換為 X
$redis->lRange('list-key', 0, 3); 
                    //連結串列擷取 從0開始 3位置結束 ,結束位置為-1 獲取開始位置之後的全部
$redis->lTrim('list-key', 0, 1); // 擷取連結串列(不可逆) 從0索引開始 1索引結束 
$redis->lRem('list-key', 'C', 2); //連結串列從左開始刪除元素2個C
$redis->lInsert('list-key', Redis::BEFORE, 'C', 'X'); 
                    // 在C元素前面插入X  , Redis::AfTER(表示後面插入) 
                       連結串列不存在則插入失敗 返回0 若元素不存在返回-1
$redis->rpoplpush('list-key', 'list-key2'); 
                    //從源LIST的最後彈出一個元素
                      並且把這個元素從目標LIST的頂部(左側)壓入目標LIST。 

$redis->brpoplpush();
                    //rpoplpush的阻塞版本,這個版本有第三個引數用於設定阻塞時間
                      即如果源LIST為空,那麼可以阻塞監聽timeout的時間,如果有元素了則執行操作。

Set集合型別

set無序集合 不允許出現重複的元素 服務端可以實現多個 集合操作
$redis->sMembers('key'); //獲取容器key中所有元素
$redis->sAdd('key' , 'TK');
                 // (從左側插入,最後插入的元素在0位置),集合中已經存在TK 則返回false 
                     不存在新增成功 返回true
$redis->sRem('key' , 'TK'); // 移除容器中的TK
$redis->sMove('key','key1','TK'); //將容易key中的元素TK 移動到容器key1  操作成功返回TRUE
$redis->sIsMember('key','TK'); //檢查VALUE是否是SET容器中的成員
$redis->sCard('key'); //返回SET容器的成員數
$redis->sPop('key'); //隨機返回容器中一個元素,並移除該元素
$redis->sRandMember('key');//隨機返回容器中一個元素,不移除該元素
$redis->sInter('key','key1'); 
     // 返回兩個集合的交集 沒有交集返回一個空陣列,若引數只有一個集合,則返回集合對應的完整的陣列
$redis->sInterStore('store','key','key1'); //將集合key和集合key1的交集 存入容器store 成功返回1
$redis->sUnion('key','key1'); //集合key和集合key1的並集  注意即使多個集合有相同元素 只保留一個

$redis->sUnionStore('store','key','key1'); 
            //集合key和集合key1的並集儲存在集合store中,  注意即使多個集合有相同元素 只保留一個
$redis->sDiff('key','key1','key2'); //返回陣列,該陣列元素是存在於key集合而不存在於集合key1 key2

Zset資料型別

**(stored set) 和 set 一樣是字串的集合,不同的是每個元素都會關聯一個 double 型別的 score
redis的list型別其實就是一個每個子元素都是string型別的雙向連結串列。**

$redis->zAdd('tkey', 1, 'A'); 
                           //  插入集合tkey中,A元素關聯一個分數,插入成功返回1
                               同時集合元素不可以重複, 如果元素已經存在返回 0
$redis->zRange('tkey',0,-1); // 獲取集合元素,從0位置 到 -1 位置
$redis->zRange('tkey',0,-1, true); 
                    // 獲取集合元素,從0位置 到 -1 位置, 返回一個關聯陣列 帶分數 
                      array([A] => 0.01,[B] => 0.02,[D] => 0.03) 其中小數來自zAdd方法第二個引數
$redis->zDelete('tkey', 'B'); // 移除集合tkey中元素B  成功返回1 失敗返回 0
$redis->zRevRange('tkey', 0, -1); // 獲取集合元素,從0位置 到 -1 位置,陣列按照score降序處理

$redis->zRevRange('tkey', 0, -1,true); 
                // 獲取集合元素,從0位置 到 -1 位置,陣列按照score降序處理 返回score關聯陣列
$redis->zRangeByScore('tkey', 0, 0.2,array('withscores' => true)); 
            //獲取幾個tkey中score在區間[0,0.2]元素 ,score由低到高排序,
                元素具有相同的score,那麼會按照字典順序排列 , withscores 控制返回關聯陣列
$redis->zRangeByScore('tkey', 0.1, 0.36, array('withscores' => TRUE, 'limit' => array(0, 1)));
             //其中limit中 0和1 表示取符合條件集合中 從0位置開始,向後掃描1個 返回關聯陣列
$redis->zCount('tkey', 2, 10); // 獲取tkey中score在區間[2, 10]元素的個數
$redis->zRemRangeByScore('tkey', 1, 3); // 移除tkey中score在區間[1, 3](含邊界)的元素
$redis->zRemRangeByRank('tkey', 0, 1); 
                         //預設元素score是遞增的,移除tkey中元素 從0開始到-1位置結束
$redis->zSize('tkey');  //返回儲存在key對應的有序集合中的元素的個數
$redis->zScore('tkey', 'A'); // 返回集合tkey中元素A的score值
$redis->zRank('tkey', 'A'); 
                      // 返回集合tkey中元素A的索引值 
                         z集合中元素按照score從低到高進行排列 ,即最低的score index索引為0
$redis->zIncrBy('tkey', 2.5, 'A'); // 將集合tkey中元素A的score值 加 2.5
$redis->zUnion('union', array('tkey', 'tkey1')); 
        // 將集合tkey和集合tkey1元素合併於集合union , 並且新集合中元素不能重複
           返回新集合的元素個數, 如果元素A在tkey和tkey1都存在,則合併後的元素A的score相加
$redis->zUnion('ko2', array('k1', 'k2'), array(5, 2)); 
        // 集合k1和集合k2並集於k02 ,array(5,1)中元素的個數與子集合對應,然後 5 對應k1 
           k1每個元素score都要乘以5 ,同理1對應k2,k2每個元素score乘以1 
           然後元素按照遞增排序,預設相同的元素score(SUM)相加
$redis->zUnion('ko2', array('k1', 'k2'), array(10, 2),'MAX'); 
        // 各個子集乘以因子之後,元素按照遞增排序,相同的元素的score取最大值(MAX)
           也可以設定MIN 取最小值
$redis->zInter('ko1', array('k1', 'k2')); 
        // 集合k1和集合k2取交集於k01 ,且按照score值遞增排序
           如果集合元素相同,則新集合中的元素的score值相加
$redis->zInter('ko1', array('k1', 'k2'), array(5, 1)); 
        //集合k1和集合k2取交集於k01 ,array(5,1)中元素的個數與子集合對應,然後 5 對應k1 
          k1每個元素score都要乘以5 ,同理1對應k2,k2每個元素score乘以1 
          ,然後元素score按照遞增排序,預設相同的元素score(SUM)相加
$redis->zInter('ko1', array('k1', 'k2'), array(5, 1),'MAX'); 
        // 各個子集乘以因子之後,元素score按照遞增排序,相同的元素score取最大值(MAX)
           也可以設定MIN 取最小值

Hash資料型別

redis hash是一個string型別的field和value的對映表.它的新增,刪除操作都是O(1)(平均).hash特別適合用於儲存物件。

$redis->hSet('h', 'name', 'TK'); // 在h表中 新增name欄位 value為TK
$redis->hSetNx('h', 'name', 'TK');
         // 在h表中 新增name欄位 value為TK 如果欄位name的value存在返回false 否則返回 true
$redis->hGet('h', 'name'); // 獲取h表中name欄位value
$redis->hLen('h'); // 獲取h表長度即欄位的個數
$redis->hDel('h','email'); // 刪除h表中email 欄位
$redis->hKeys('h'); // 獲取h表中所有欄位
$redis->hVals('h'); // 獲取h表中所有欄位value
$redis->hGetAll('h'); // 獲取h表中所有欄位和value 返回一個關聯陣列(欄位為鍵值)
$redis->hExists('h', 'email'); //判斷email 欄位是否存在與表h 不存在返回false
$redis->hSet('h', 'age', 28);
$redis->hIncrBy('h', 'age', -2); 
 // 設定h表中age欄位value加(-2) 如果value是個非數值 則返回false 否則,返回操作後的value
$redis->hIncrByFloat('h', 'age', -0.33);  
        // 設定h表中age欄位value加(-2.6) 如果value是個非數值 則返回false 否則
           返回操作後的value(小數點保留15位)
$redis->hMset('h', array('score' => '80', 'salary' => 2000)); // 表h 批量設定欄位和value
$redis->hMGet('h', array('score','salary')); // 表h 批量獲取欄位的value


然後自己嘗試一下

1)string操作

$redis= new Redis();
$redis->connect('127.0.0.1', 7200);

$redis->delete("string1");
$redis->set("string1","111");
$val = $redis->get("string1");
var_dump($val);

$redis->set("string1",5);
$redis->incr("string1",2);
$val = $redis->get("string1");
var_dump($val);
輸出
[[email protected] cood]# php connect.php 
string(3) "111"
string(1) "7"

2)list操作
$redis= new Redis();
$redis->connect('127.0.0.1', 7200);

$redis->lPush("list","A");
$redis->lPush("list","b");
$redis->lPush("list","c");

$val = $redis->rPop("list");
var_dump($val);

輸出
[[email protected] cood]# php connect.php 
string(1) "A"
[[email protected] cood]# php connect.php 
string(1) "b"
[[email protected] cood]# php connect.php 
string(1) "c"

3)set操作
$redis= new Redis();
$redis->connect('127.0.0.1', 7200);
$redis->delete("set1");

$redis->sAdd("set1","A");
$redis->sAdd("set1","c");
$redis->sAdd("set1","C");
$redis->sAdd("set1","C");


$val = $redis->sCard("set1");
var_dump($val);

$val = $redis->smembers("set1");
var_dump($val);
輸出
[[email protected] cood]# php connect.php 
int(3)
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "c"
  [2]=>
  string(1) "C"
}
4)hash操作
$redis= new Redis();
$redis->connect('127.0.0.1', 7200);
$redis->delete("hash1");

$redis->hset("man","name","bill");
$redis->hset("man","age","88");
$redis->hset("man","sex","man");

$val = $redis->hget("man","name");
var_dump($val);

$val = $redis->hmget("man",array("name","age"));
var_dump($val);
輸出
[[email protected] cood]# php connect.php 
string(4) "bill"
array(2) {
  ["name"]=>
  string(4) "bill"
  ["age"]=>
  string(2) "88"
}
5)zset操作 (排序)
$redis= new Redis();
$redis->connect('127.0.0.1', 7200);
$redis->delete("zset1");

$redis->zadd("zset1",100,"bill");
$redis->zadd("zset1",90,"cill");
$redis->zadd("zset1",80,"dill");
$redis->zadd("zset1",60,"eill");

$val = $redis->zrange("zset1",0,-1);
var_dump($val);
輸出
[[email protected] cood]# php connect.php 
array(4) {
  [0]=>
  string(4) "eill"
  [1]=>
  string(4) "dill"
  [2]=>
  string(4) "cill"
  [3]=>
  string(4) "bill"
}
嗯,五種操作都試了一試,挺好用的。以後在實際專案中有機會用到redis再進行補充,這階段redis學習就到這裡了


相關推薦

redis學習 基礎 php操作redis

之前的基礎篇(一)已經學習了redis的含義和五種資料結構的操作,訂閱和事務。而我們學習redis就是為了輔助php的,所以這次學習php操作redis  一,環境配置 系統環境:centos php版本:5.3.3 php redis擴充套件下載:https://gith

numpy學習基礎

影象操作 SciPy提供了一些處理影象的函式。它可以將影象從磁碟讀入numpy陣列,將numpy陣列作為影象寫入磁碟以及調整影象大小的功能。 from scipy.misc import imread,imsave,imresize img=imread("E:\\Desktop\\894

YII2框架學習 基礎 YII2資料庫操作

實際專案中PHP肯定離不開資料庫,YII框架有很多針對資料庫的操作,學習一下。學習YII框架資料庫指令的同時,也可以學到YII框架的資料模型,一石二鳥啊。另外,昨天釋出了第一篇後,發現有幾十個人看了我的http://blog.csdn.net/m0_37645820/art

CCIE 學習 基礎 IPv6 基礎

一、概述延緩IPv4地址耗盡的短期方案之一為NAT(Network Access Translation)。NAT技術在延緩IPv4地址耗盡問題方面非常成功,在大多數網路設計中已經成為一個標準部分。NAT技術的缺陷:把原來具有開放、透明、對等特點的Internet變成了看上去

Redis基礎高效能IO模型

我們經常聽到說Redis是單執行緒的,也會有疑問:為什麼單執行緒的Redis能那麼快? 這裡要明白一點:Redis是單執行緒,主要是指Redis的網路IO和鍵值對讀寫是由一個執行緒來完成的,這也是Redis對外提供鍵值儲存服務的主要流程。但Redis的其他功能,比如持久化、非同步刪除、叢集資料同步等,都是由額

深度學習基礎系列| 常見的Top-1和Top-5有什麽區別?

ack [1] 隨機 排名 array gen spa imp 概率分布   在深度學習過程中,會經常看見各成熟網絡模型在ImageNet上的Top-1準確率和Top-5準確率的介紹,如下圖所示:   那Top-1 Accuracy和Top-5 Accuracy是指什

C語言基礎運算子

導航:   2.1 算數運算子   2.2 邏輯運算子   2.3 位運算   2.4 賦值運算   2.5 記憶體訪問符號 ----->x<------------->x&

linux基礎:基於Redhat7系統的特殊許可權與acl許可權列表

新建目錄和檔案的預設許可權 新建目錄和檔案的預設許可權是由系統中umask值來決定的。 新建FILE許可權:666-umask (對位相減)    由數字法賦許可權的過程中,我們能夠發現,凡是奇數許可權,總是包含執行許可權的。而一個檔案如果預設就包含執行許可權其實是非常危險的。因此如果所

Docker虛擬化實戰學習——基礎

Docker虛擬化實戰學習——基礎篇 2018年05月26日 02:17:24 北緯34度停留 閱讀數:773更多 個人分類: Docker  

機器學習基礎知識

深度神經網路: 深度學習實際指的是基於深度神經網路( deep neural networks, DNN)的 學習,也就是深度人工神經網路所進行的學習過程,或稱作 Deep Learning。   這個 Deep 指 的是神經網路的深度(層數多)。   T

numpy學習基礎

安裝好Numpy模組後,開始在jupyter上執行沒有問題,後來我開了一個pycharm,建立numpy.py這個檔案後,執行開始報如下錯誤:AttributeError: module ‘numpy‘ has no attribute ‘array‘  由於下載的模組名也為numpy.p

深度學習基礎概念科普入門

1、人工智慧(AI)、機器學習(ML)和深度學習(DL): 人工智慧是終極目標,機器學習是實現人工智慧的一種分支,深度學習隸屬於人工神經網路體系,人工神經網路是基於統計的機器學習方法,傳統的神經網路是一種淺層機器學習,深度學習是傳統神經網路發展下的新一代神經網路。深度學習是通

JAVA面試寶典-基礎

11、"=="和equals方法究竟有什麼區別? (單獨把一個東西說清楚,然後再說清楚另一個,這樣,它們的區別自然就出來了,混在一起說,則很難說清楚) ==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==

Unity Editor 基礎:自定義 Inspector 面板

自定義Inspector屬性面板 EditorGUILayout 編輯器介面佈局  這是一個編輯器類,如果想使用它你需要把它放到工程目錄下的Assets/Editor資料夾下。編輯器類在UnityEditor名稱空間下。所以當使用C#指令碼時,你需要在指令碼前面加上

Python自學---基礎變數賦值

2.1 賦值運算子(=),引用傳遞 我們可以直接將一個固定的數值、字串、算術表示式、、甚至函式賦值給一個變數,也可講一個變數賦值給另一個變數。 anInt = 1 aStr = 'abc' aFloat = 4 * 5 * 6 aList = [1, 'who'

Java多執行緒之基礎

上一篇介紹了Java多執行緒的基礎概念和synchronized關鍵字,這篇繼續介紹Java多執行緒的其他關鍵字和重要的方法。 一、volatile關鍵字 1.1 Java記憶體模型

Spring Boot 入門之web基礎

一、前言上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。二、整合模板引擎由於 jsp 不被 SpringBoot 推薦使用,所以模板

docker學習 基礎

備註:博主腦袋一熱,想做個軟體專案託管平臺,於是踏上了不歸路... 1. 前提知識    1.1 強制,熟悉linux命令和相關背景知識    1.2 建議,Git相關知識 2.docker簡介     2.1是什麼 &nb

python 基礎基本資料的運算

加減乘除 #python加減乘除基本運算 # + - * / a = 1; b = 2; c = 6; d = a+b; print(d) d = c-a; print(d) d = b*c; print(d) d = c/b; print(d); 列印後輸出 3 5 12

【002】Python全棧日記-Python基礎

一、Python程式 昨天說了python的基礎資料型別,今天來了解一下Python程式的本質。 Python程式=頂層檔案+模組 通過一個例子來說明一下這個公式的意義,Python最好用的程式設計軟體為PyCharm,但是由於收費,所以這裡推薦新手使用Notepad++,簡潔輕量。 我們