Redis系列三:thinkphp 使用 redis
1、redis服務端配置認證密碼
(1)通過配置檔案進行配置
開啟配置檔案/usr/local/redis/etc/redis.conf找到
#requirepass foobared
去掉行前的註釋,並修改密碼為所需的密碼,儲存檔案
requirepass myRedis
重啟redis
這個時候嘗試登入redis,發現可以登上,但是執行具體命令是提示操作不允許
1. redis-cli -h 127.0.0.1 -p 6379 2. redis 127.0.0.1:6379> 3. redis 127.0.0.1:6379> keys * 4. (error) ERR operation not permitted 5. redis 127.0.0.1:6379> select 1 6. (error) ERR operation not permitted 7. redis 127.0.0.1:6379[1]>
嘗試用密碼登入並執行具體的命令看到可以成功執行
1. redis-cli -h 127.0.0.1 -p 6379 -a myRedis
2. redis 127.0.0.1:6379> keys *
3. 1) "myset"
4. 2) "mysortset"
5. redis 127.0.0.1:6379> select 1
6. OK
7. redis 127.0.0.1:6379[1]> config get requirepass
8. 1) "requirepass"
9. 2) "myRedis"
2、redis服務端配置外部訪問
這說明目前處在保護模式上,檢視Redis的註釋可以瞭解,連線Redis只能通過本地(127.0.0.1)來連線,而不能使用網路IP(192.168.1.x)來連線,如果需要請修改配置檔案redis.conf
解決方案
進入Redis目錄開啟Redis.conf配置檔案
1>註釋掉bind
#bind 127.0.0.1
2>禁用保護模式
protected-mode no
3、配置thinkphp配置redis資訊
'DATA_CACHE_PREFIX' => 'Redis_',//快取字首 'DATA_CACHE_TYPE'=>'Redis',//預設動態快取為Redis 'DATA_CACHE_TIMEOUT'=>'1000', 'REDIS_RW_SEPARATE' => true, //Redis讀寫分離 true 開啟 'REDIS_HOST'=>'IP地址', //redis伺服器ip,多臺用逗號隔開;讀寫分離開啟時,第一臺負責寫,其它[隨機]負責讀; 'REDIS_PORT'=>'6379',//埠號 'REDIS_TIMEOUT'=>'1000',//超時時間 'REDIS_PERSISTENT'=>false,//是否長連線 false=短連線 'REDIS_AUTH_PASSWORD'=>'password',//AUTH認證密碼
4、demo
$Cache = Cache::getInstance('Redis');
$Cache->set('name2','easdfasd',6400); // 快取name資料
$value = $Cache->get('name2'); // 獲取快取的name資料
var_dump( $value);
exit();
錯誤提示:
thinkphp使用redis快取的時候無法使用認證
我在使用thinkphp的時候 發現如果是使用redis快取 設定了認證的redis能連線成功 卻無法 set 操作 ,檢查發現是沒有認證導致的 $redis->auth這一步沒有,那麼官方給出的 Redis.class.php沒有的話,我們可以自己加上,在建構函式第29行 將以前的程式碼改為:
以前程式碼如下:
$options = array_merge(array (
'host' => C('REDIS_HOST') ? : '127.0.0.1',
'port' => C('REDIS_PORT') ? : 6379,
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
'persistent' => false,
),$options);
加一行 'auth' => C('REDIS_AUTH_PASSWORD') ? C('REDIS_AUTH_PASSWORD'):null,//auth認證的密碼 ,改為這樣
$options = array_merge(array (
'host' => C('REDIS_HOST') ? : '127.0.0.1',
'port' => C('REDIS_PORT') ? : 6379,
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
'auth' => C('REDIS_AUTH_PASSWORD') ? C('REDIS_AUTH_PASSWORD'):null,//auth認證的密碼
'persistent' => false,
),$options);
這樣就能在options中讀取到是否啟用認證的密碼了,然後後面加一個判斷
在這段程式碼後面
$this->handler = new \Redis;
$options['timeout'] === false ?
$this->handler->$func($options['host'], $options['port']) :
$this->handler->$func($options['host'], $options['port'], $options['timeout']);
加上一個判斷,判斷是否啟用了認證密碼配置 啟用了就去認證一下
if($this->options['auth']!==null)
{
$this->handler->auth($this->options['auth']); //說明有配置redis的認證配置密碼 需要認證一下
}
總體來看,構造方法被改為了如下:
public function __construct($options=array()) {
if ( !extension_loaded('redis') ) {
E(L('_NOT_SUPPORT_').':redis');
}
$options = array_merge(array (
'host' => C('REDIS_HOST') ? : '127.0.0.1',
'port' => C('REDIS_PORT') ? : 6379,
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
'auth' => C('REDIS_AUTH_PASSWORD') ? C('REDIS_AUTH_PASSWORD'):null,//auth認證的密碼
'persistent' => false,
),$options);
$this->options = $options;
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
$func = $options['persistent'] ? 'pconnect' : 'connect';
$this->handler = new \Redis;
$options['timeout'] === false ?
$this->handler->$func($options['host'], $options['port']) :
$this->handler->$func($options['host'], $options['port'], $options['timeout']);
if($this->options['auth']!=null)
{
$this->handler->auth($this->options['auth']); //說明有配置redis的認證配置密碼 需要認證一下
}
}
然後配置檔案裡面加上 "REDIS_AUTH_PASSWORD"=>"redis認證密碼" 即可