1. 程式人生 > >Redis系列三:thinkphp 使用 redis

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)來連線,而不能使用網路IP192.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認證密碼" 即可