Redis擴展方法和PHP連接Redis的多種方案
  • 一、Redis擴展方法
  • 二、php操作Redis語法
  • 三、PHP連接Redis
  • 1.PHP中使用帶密碼的連接Redis
  • 2.PHP連接Redis拋出異常
  • 3.PHP連接Redis:$redis->ping()
  • 4.PHP連接Redis 條件語句寫法
  • 四、避坑指南
  • NOAUTH Authentication required 錯誤

PHP 中使用 Redis 前, 我們需要確保已經安裝了 redis 服務及 PHP redis 驅動,且你的機器上能正常使用 PHP:

echo phpinfo();

php操作redis數據庫常見方法實例總結_php技巧_#php


出現上面提示,代表可以正常使用PHP操作Redis。

一、Redis擴展方法

Redis擴展提供了一系列方法用於與Redis服務器進行交互。以下是一些常用的$redis對象可用的方法:

  1. 連接和關閉連接:
  • connect($host, $port, $timeout): 連接到Redis服務器。
  • close(): 關閉Redis連接。
  1. 數據操作:
  • set($key, $value): 設置指定鍵的值。
  • get($key): 獲取指定鍵的值。
  • del($key1, $key2, ...): 刪除一個或多個鍵。
  • incr($key): 增加鍵對應的值。
  • decr($key): 減少鍵對應的值。
  • exists($key): 檢查鍵是否存在。
  • 其他諸如appendstrlenmsetmget等等。
  1. 列表操作:
  • lpush($key, $value1, $value2, ...): 在列表左側插入一個或多個值。
  • rpush($key, $value1, $value2, ...): 在列表右側插入一個或多個值。
  • lpop($key): 彈出列表左側的值。
  • rpop($key): 彈出列表右側的值。
  • llen($key): 獲取列表長度。
  • 其他諸如lindexlrangeltrim等等。
  1. 哈希操作:
  • hset($key, $field, $value): 設置哈希中指定字段的值。
  • hget($key, $field): 獲取哈希中指定字段的值。
  • hdel($key, $field1, $field2, ...): 刪除一個或多個哈希字段。
  • hgetall($key): 獲取哈希中所有字段和對應的值。
  • 其他諸如hincrbyhkeyshvals等等。
  1. 集合操作:
  • sadd($key, $member1, $member2, ...): 向集合添加一個或多個成員。
  • srem($key, $member1, $member2, ...): 從集合中移除一個或多個成員。
  • smembers($key): 獲取集合的所有成員。
  • sismember($key, $member): 檢查成員是否存在於集合中。
  • 其他諸如sintersunionsdiff等等。

這只是Redis提供的一些常見操作方法的示例列表,還有更多其他方法可供使用。具體可以參考Redis擴展的文檔或官方網站來了解更多關於Redis操作的詳細信息。

二、php操作Redis語法

在PHP中,可以使用Redis擴展來操作Redis服務器。下面是一些常用的PHP操作Redis的語法示例:

  1. 連接到Redis服務器:
1. $redis = new Redis();
 $redis->connect(‘127.0.0.1’, 6379);
// 或者使用連接池連接
 $redis = new Redis();
 $redis->pconnect(‘127.0.0.1’, 6379);2. 設置和獲取鍵值對:
// 設置鍵的值
 $redis->set(‘key’, ‘value’);
// 獲取鍵的值
 $value = $redis->get(‘key’);3. 刪除鍵:
$redis->del(‘key’);4. 判斷鍵是否存在:
if ($redis->exists(‘key’)) {
 // 鍵存在的處理邏輯
 } else {
 // 鍵不存在的處理邏輯
 }5. 進行哈希操作:
// 設置哈希表字段的值
 $redis->hset(‘hash_key’, ‘field’, ‘value’);
// 獲取哈希表字段的值
 $value = $redis->hget(‘hash_key’, ‘field’);
// 刪除哈希表字段
 $redis->hdel(‘hash_key’, ‘field’);6. 進行列表操作:
// 在列表左側插入值
 $redis->lpush(‘list_key’, ‘value1’, ‘value2’);
// 在列表右側插入值
 $redis->rpush(‘list_key’, ‘value3’, ‘value4’);
// 彈出列表左側的值
 $value = $redis->lpop(‘list_key’);
// 彈出列表右側的值
 $value = $redis->rpop(‘list_key’);7. 進行集合操作:
// 向集合添加成員
 $redis->sadd(‘set_key’, ‘member1’, ‘member2’);
// 從集合中移除成員
 $redis->srem(‘set_key’, ‘member1’);
// 檢查成員是否存在於集合中
 if ($redis->sismember(‘set_key’, ‘member1’)) {
 // 成員存在的處理邏輯
 } else {
 // 成員不存在的處理邏輯
 }
  1. 鍵設置過期時間
    在Redis中,你可以使用EXPIRE命令為一個鍵設置過期時間,從而控制該鍵的有效期。以下是一些在Redis中設置鍵的有效期的方法:
  2. EXPIRE key seconds:設置key的過期時間為seconds秒。當seconds秒鐘過去後,鍵將會自動過期並被刪除。

例如,下面的代碼將名為mykey的鍵設置為過期時間為60秒:

$redis->expire('mykey', 60);
  1. PEXPIRE key milliseconds:類似於EXPIRE命令,但時間以毫秒為單位。

例如,下面的代碼將名為mykey的鍵設置為過期時間為3000毫秒(即3秒):

$redis->pexpire('mykey', 3000);
  1. EXPIREAT key timestamp:設置key的過期時間戳,以秒為單位。timestamp參數是一個UNIX時間戳,表示鍵的過期時間點。

例如,下面的代碼將名為mykey的鍵設置為在1612266625秒之後過期:

$redis->expireat('mykey', 1612266625);
  1. PEXPIREAT key milliseconds-timestamp:類似於EXPIREAT命令,但時間戳以毫秒為單位。

例如,下面的代碼將名為mykey的鍵設置為在1654123456789毫秒之後過期:

$redis->pexpireat('mykey', 1654123456789);

這些命令可用於設置Redis中鍵的過期時間。一旦過期時間到達,鍵將被自動刪除。注意,只有在鍵被設置為字符串、哈希表、列表等類型時,過期設置才有效。

另外,如果你想獲取鍵的剩餘過期時間,你可以使用TTL命令或PTTL命令。如ttl('mykey')返回鍵mykey的剩餘過期時間(以秒為單位),pttl('mykey')返回鍵mykey的剩餘過期時間(以毫秒為單位)。如果鍵已過期或不存在,這些命令返回負數。

這些是一些常用的Redis操作示例,你可以根據具體的業務需求,使用相應的方法來進行操作。記得在操作完成後,及時關閉Redis連接,以釋放資源。

三、PHP連接Redis

1.PHP中使用帶密碼的連接Redis

若要在PHP中使用帶密碼的連接Redis,你可以使用Redis擴展的auth方法進行身份驗證。以下是設置密碼並連接到Redis服務器的示例代碼:

<?php
$redis = new Redis();

// 連接到Redis服務器
$redis->connect('127.0.0.1', 6379);

// 身份驗證
$redis->auth('your_password');

// 執行一些操作
$redis->set('key', 'value');
$value = $redis->get('key');

echo $value; // 輸出 'value'
?>

在上述代碼中,your_password是在Redis服務器上設置的密碼。使用auth方法將密碼傳遞給Redis實例進行身份驗證。如果密碼不正確或與服務器配置不匹配,將會引發REDIS_AUTH異常。因此,確保提供正確的密碼以及與服務器配置相匹配的密碼。

同樣地,如果在使用Laravel框架,你可以在config/database.php文件中配置Redis連接的密碼。在對應的'redis'配置數組中添加'password' => 'your_password'以設置密碼。

記得使用適當的安全措施來保護Redis密碼,如避免將密碼明文存儲在代碼中或通過不安全的方式傳輸密碼。

2.PHP連接Redis拋出異常

try {
    $redis = new Redis();

    // 連接到Redis服務器
    $redis->connect('127.0.0.1', 6379);

    // 身份驗證
    $redis->auth('kYABzc8u3zNs7cq');

    // 執行一些操作
    $redis->set('key', 'lockdata');
    $value = $redis->get('key');

    echo $value; // 輸出 'value'

    // 關閉Redis連接
    $redis->close();
} catch (RedisException $e) {
    echo "連接Redis時發生異常:" . $e->getMessage();
}

3.PHP連接Redis:$redis->ping()

$redis->ping()是Redis擴展提供的一個方法,用於檢測與Redis服務器的連接是否存活。

它的使用很簡單,只需要調用$redis->ping()方法即可。若連接正常且服務器可響應,則該方法返回字符串PONG。若連接異常或服務器未響應,則會拋出RedisException異常。

以下是一個示例:

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

try {
    $response = $redis->ping();

    if ($response === 'PONG') {
        echo "Redis連接正常";
    } else {
        echo "Redis連接異常或服務器未響應";
    }
} catch (RedisException $e) {
    echo "Redis連接異常:" . $e->getMessage();
}

$redis->close();

在上述示例中,我們首先創建一個Redis對象,然後使用connect()方法連接到Redis服務器。接下來,我們調用ping()方法來檢測連接狀態,並通過返回的響應值進行判斷。如果返回值為PONG,則表示連接正常;如果返回值為其他內容,或拋出了異常,則表示連接異常或服務器未響應。

記得在使用ping()方法前確保已經成功建立了與Redis服務器的連接,並在使用完成後及時關閉連接以釋放資源。

4.PHP連接Redis 條件語句寫法

如果你不想使用try語句來捕獲異常,你可以通過檢查連接和操作返回的結果來判斷是否發生了異常。以下是一個示例代碼:

$redis = new Redis();

// 連接到Redis服務器
$connected = $redis->connect('127.0.0.1', 6379);

if ($connected === false) {
    echo "無法連接到Redis服務器";
} else {
    // 執行一些操作
    $setResult = $redis->set('key', 'value');
    if ($setResult === false) {
        echo "設置鍵值對發生了異常";
    } else {
        $value = $redis->get('key');
        if ($value === false) {
            echo "獲取鍵值對發生了異常";
        } else {
            echo $value; // 輸出 'value'
        }
    }
    // 關閉Redis連接
    $redis->close();
}

在上述示例中,我們首先檢查$redis->connect()方法的返回值來確定是否成功連接到Redis服務器。如果連接失敗,我們可以輸出相應的錯誤信息。如果連接成功,我們再執行一些操作,如$redis->set()$redis->get()等,並檢查每個操作的返回結果來判斷是否發生了異常。

使用這種寫法,你可以根據返回結果進行邏輯判斷和處理,而無需使用trycatch塊來捕獲異常。這種寫法相對簡單,但在處理多個操作和嵌套邏輯時可能會導致代碼變得複雜。

記得在代碼中適當處理連接和操作過程中的異常,確保你的程序具備健壯性並能正確處理錯誤情況。

四、避坑指南

NOAUTH Authentication required 錯誤

Fatal error: Uncaught exception ‘RedisException’ with message ‘NOAUTH Authentication required.’ in /www/wwwroot/redis.lockdata.cn/index.php:12 Stack trace: #0 /www/wwwroot/redis.lockdata.cn/index.php(12): Redis->set(‘key1’, ‘value1’) #1 {main} thrown in /www/wwwroot/redis.lockdata.cn/index.php on line 12

**原因:**未配置Redis密碼導致。

// 身份驗證
$redis->auth('kYABzc8u3zNs7cq');

@漏刻有時