redis操作類

weixin_34127717發表於2016-10-06

1.程式碼示例

<?php
namespace extend\drive;

use \Redis;
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 16-10-6
 * Time: 下午2:27
 */
class RedisCache
{
    protected static $_instance = null;
    private $rCache;
    const CACHE_KEY = 'redisDefaultKey2016';

    /**
     * 單例模式
     * @author mmy
     * @param $dbHost
     * @param $port
     * @return RedisCache|null
     */
    public static function getInstance($dbHost, $port)
    {
        if(self::$_instance === null)
        {
            self::$_instance = new self($dbHost,$port);

        }
        var_dump(self::$_instance);
        return self::$_instance;
    }

    /**
     * 建構函式
     * @author mmy
     * @param string $host
     * @param string $port
     */
    public function __construct($host='127.0.0.1',$port='6379')
    {
        if($this->rCache)
        {
            return $this->rCache;
        }
        $this->rCache = new Redis();
        $this->rCache->connect($host,$port);
    }

    /**
     * 獲取key值
     * @author mmy
     * @param $key
     * @return bool|string
     */
    public function get($key)
    {
        $res = md5(static::CACHE_KEY.$key);
        return $this->rCache->get($res);
    }

    /**
     * 設定key值方法
     * @author mmy
     * @param $key
     * @param $value
     * @param int $timeout
     * @return bool
     */
    public function set($key,$value,$timeout=0)
    {
        $key = md5(static::CACHE_KEY.$key);
        if($timeout===0)
        {
            $res = $this->rCache->set($key,$value);
        }
        else
        {
            $res = $this->rCache->set($key,$value,$timeout);
        }
        return $res;
    }

    /**
     * 佇列插入值
     * @author mmy
     * @param $key
     * @param $string
     * @param int $limit
     */
    public function push($key,$string,$limit = 0)
    {
        $key = md5(static::CACHE_KEY.$key);
        $result = $this->rCache->lPush($key,$string);
        //執行lTrim方法 保證佇列中只有$limit條資料
        if($limit>1)
        {
            $result = $this->rCache->lTrim($key,0,$limit);// 0:從最先進的資料開始算,-1:從最後進的資料計算
        }

        return $result;
    }

    /**
     * 獲取訊息列表內容
     * @author mmy
     * @param $key
     * @return array
     */
    public function range($key)
    {
        $key = md5(static::CACHE_KEY.$key);
        return $this->rCache->lRange($key,0,-1);
    }


}

2.檢測

 $rest = $redis->push($message_data['userid'],$message_data['name']);
                echo '-----------------------';
                 print_r( $redis->range($message_data['userid']));
                echo $rest;

圖片描述

3.redis linux

1》Linux下安裝Reids
http://redis.io/download

wget http://download.redis.io/releases/redis-3.0.1.tar.gz 下載
tar -xzvf redis-3.0.1.tar.gz 解壓
cd redis-3.0.1 進入解壓目錄
make 編譯 安裝
make install

2》在bin下可執行的程式
redis-server:Redis伺服器
redis-cli:命令列客戶端
redis-benchmark:Redis的效能測試工具
redis-check-aof:AOF檔案修復工具
redis-check-dump:RDB檔案檢測工具

redis.conf是Redis的配置檔案
將配置檔案中daemonize yes 以守護程式的方式來使用

3》啟動和停止Redis

直接啟動
    redis-server
    redis-server /ect/redis.conf
停止Redis
    shutdown
    結束Redis的程式也可以

aof,rdb是兩種 Redis持久化的機制。用於crash(崩潰)後,redis的恢復。

aof:Append-only file
        將“操作 + 資料”以格式化指令的方式追加到操作日誌檔案的尾部,在append操作返回後(已經寫入到檔案或
者即將寫入),才進行實際的資料變更,“日誌檔案”儲存了歷史所有的操作過程;當server需要資料恢復時,可以直接
replay此日誌檔案,即可還原所有的操作過程。AOF相對可靠,它和MySQL中bin.log、pache.log、zookeeper中txn-log簡直異曲同工。AOF檔案內容是字串,非常容易閱讀和解析。 

rdb:

RDB預設開啟,redis.conf中的具體配置引數如下;

#dbfilename:持久化資料儲存在本地的檔案
dbfilename dump.rdb
#dir:持久化資料儲存在本地的路徑,如果是在/redis/redis-3.0.6/src下啟動的redis-cli,則資料會儲存在當前src目錄下
dir ./
##snapshot觸發的時機,save <seconds> <changes>  
##如下為900秒後,至少有一個變更操作,才會snapshot  
##對於此值的設定,需要謹慎,評估系統的變更操作密集程度  
##可以通過“save “””來關閉snapshot功能  
#save時間,以下分別表示更改了1個key時間隔900s進行持久化儲存;更改了10個key300s進行儲存;更改10000個
key60s進行儲存。
save 900 1
save 300 10
save 60 10000
##當snapshot時出現錯誤無法繼續時,是否阻塞客戶端“變更操作”,“錯誤”可能因為磁碟已滿/磁碟故障/OS級別異常
等  
stop-writes-on-bgsave-error yes  
##是否啟用rdb檔案壓縮,預設為“yes”,壓縮往往意味著“額外的cpu消耗”,同時也意味這較小的檔案尺寸以及較短
的網路傳輸時間  
rdbcompression yes 
客戶端使用命令進行持久化save儲存:

./redis-cli -h ip -p port save
./redis-cli -h ip -p port bgsave
aof優缺點:

    優點:
       可以保持更高的資料完整性,如果設定追加file的時間是1s,如果redis發生故障,最多會丟失1s的資料;且如果日誌寫入不完整支援redis-check-aof來進行日誌修復;AOF檔案沒被rewrite之前(檔案過大時會對命令進行合併重寫),可以刪除其中的某些命令(比如誤操作的flushall)。 
    缺點:
       AOF檔案比RDB檔案大,且恢復速度慢。
    
rdb優缺點:
   RDB是在某個時間點將資料寫入一個臨時檔案,持久化結束後,用這個臨時檔案替換上次持久化的檔案,達到資料恢復。 

優點:
   使用單獨子程式來進行持久化,主程式不會進行任何IO操作,保證了redis的高效能 
缺點:
   RDB是間隔一段時間進行持久化,如果持久化之間redis發生故障,會發生資料丟失。所以這種方式更適合資料要求不嚴謹的時候
    
1) AOF更加安全,可以將資料更加及時的同步到檔案中,但是AOF需要較多的磁碟IO開支,AOF檔案尺寸較大,檔案內
容恢復數度相對較慢。 
2) snapshot,安全性較差,它是“正常時期”資料備份以及master-slave資料同步的最佳手段,檔案尺寸較小,恢復
數度較快。

redis 其他埠開放服務

/etc/init.d/redis-server-------------redis的可執行程式
/etc/redis/redis.conf----------------redis的配置檔案
/usr/bin/redis-server---------------redis的自啟動檔案

如果是單例項執行redis的話,那麼到這裡就不需要關心了,如果你想執行多個redis的例項,那麼就需要對redis檔案進行操作。
首先我們要知道redis一個例項就是一個節點,每個節點分配一個埠號,每個節點對應一個redis.conf配置檔案。
redis預設配置的埠號是6379,假設現在要多配置一個6380,我們可以直接複製redis.conf命名為redis6380.conf,並且編輯配置檔案
cp /etc/redis/redis.conf /etc/redis/redis6380.conf

vi /etc/redis/redis6380.conf
需要修改幾個引數
pidfile /var/run/redis/redis6380-server.pid
port 6380

logfile /var/log/redis/redis6380-server.log

dbfilename dump6380.rdb

然後儲存,直接啟動這個配置檔案就行了
redis-server /etc/redis/redis6380.conf

我們可以檢視下程式
ps auxf | grep redis-server

殺掉程式 
kill -9 +程式號

相關文章