Laravel - Redis 緩存三部曲 (一) 初識Predis


本篇為基礎篇

Redis的使用場景想必大家多多少少都了解一些了。比如新浪的首頁那么多模塊,那么多文章,如果讀數據庫是不是壓力特別大,反應是不是特別慢?但是為什么新浪為什么能很快的響應頁面?其中一部分功勞就是靠的Reids的緩存技術。相比較Memcached筆者還是更喜歡Redis一點。

下面簡單的分析一下,歡迎拍磚!

  • Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。

  • Redis支持數據的備份,即master-slave模式的數據備份。

  • Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。

Laravel中 使用的Redis

Redis 是一款開源且先進的鍵值對數據庫。由於它可用的鍵包含了字符串、哈希、列表、集合 和 有序集合,因此常被稱作數據結構服務器。在使用 Redis 之前,你必須通過 Composer 安裝 predis/predis 擴展包(~1.0)。

安裝predis組件

composer require "predis/predis:~1.0"  

配置 應用程序的 Redis 設置都在 config/database.php 配置文件中。在這個文件里,你可以看到 redis 數組里面包含了應用程序使用的 Redis 服務器:

'redis' => [

    'cluster' => false,

    'default' => [
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ],

],

默認的服務器配置對於開發來說應該足夠了。然而,你也可以根據使用的環境來隨意更改數組。只需給每個 Redis 指定名稱以及在服務器中使用的 host 和 port 即可。

基本使用方法


STRING類型 - 寫入字符串類型的redis

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'STRING:TEST';
        $value = 'Hello-World';
        // 寫入一個字符串類型的redis
        $info = \Redis::Set($key,$value);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/1.png)

  • 讀取相應的字符串

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'STRING:TEST';
        // 讀取一個字符串類型的redis
        $info = \Redis::get($key);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![123](/content/images/2017/01/2.png)

和redis語法同樣的 字串也有incr和decr等遞增、遞減...


LIST類型

  • 寫入隊列
class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'LIST:TEST:R';
        $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python'];
        // 從右往左壓入隊列
        $info = \Redis::rpush($key,$names);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 (寫入的數量) ![](/content/images/2017/01/3.png)

  • 寫入隊列

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'LIST:TEST:R';
        $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python'];
        // 獲取隊列內容(0到-1 所有 0到0是一位 0到1是兩位)
        $info = \Redis::lrange($key,0,-1);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 (數組) ![](/content/images/2017/01/4.png)

  • 從左往右塞入隊列 連貫方法

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'LIST:TEST:L';
        $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python'];
        // 從左往右存數據
        \Redis::lpush($key,$names);
        // 取出數據
        $info = \Redis::lrange($key,0,-1);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 (數組 是不是正好和上面的相反?) ![](/content/images/2017/01/5.png)

HASH類型

  • 存數據
class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'HASH:TEST';
        $names = ['id'=>'99',
                  'name'=>'AXiBa',
                  'age'=>'23',
                  'tel'=>'13995578699',
                  'addtime'=>'1231231233'];
        // 將數據寫入hash
        $info = \Redis::hMset($key,$names);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/6.png)

  • 取數據(取所有)

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'HASH:TEST';
        $names = ['id'=>'99',
                  'name'=>'AXiBa',
                  'age'=>'23',
                  'tel'=>'13995578699',
                  'addtime'=>'1231231233'];
        // 取出hash里的數據
        $info = \Redis::hGetall($key);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/7.png)

  • 取數據(取個別字段)

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'HASH:TEST';
        $names = ['id'=>'99',
                  'name'=>'AXiBa',
                  'age'=>'23',
                  'tel'=>'13995578699',
                  'addtime'=>'1231231233'];
        // 取出hash里的 某一個字段的數據
        $info = \Redis::hGet($key,'name');
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/8.png)
// 判斷這個redis key是否存在
\Redis::exists($key);

SET類型

  • 寫入一個無序集合(數據插入無順序)
class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'SET:TEST';
        $value = ['a','b','c','d','e'];
        $info = \Redis::sadd($key,$value);
         $info = \Redis::smembers($key);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/9.png)

  • 求兩個集合的交集

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'SET:TEST';
        $key1 = 'SET:TEST:1';
        $value = ['a','b','c','d','e'];
        $value1 = ['a','b','c','1','2'];
        // 寫入另一個集合
        \Redis::sadd($key1,$value1);
        // 交集
        $info = \Redis::sinter($key,$key1);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/10.png)

  • 求兩個集合的並集

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'SET:TEST';
        $key1 = 'SET:TEST:1';
        $value = ['a','b','c','d','e'];
        $value1 = ['a','b','c','1','2'];
        // 並集
        $info = \Redis::sunion($key,$key1);
        dd($info);
        return view('test');
    }
}
  • 頁面響應 ![](/content/images/2017/01/11.png)

  • 求兩個集合的差集

class PhotoController extends Controller  
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        $key = 'SET:TEST';
        $key1 = 'SET:TEST:1';
        $value = ['a','b','c','d','e'];
        $value1 = ['a','b','c','1','2'];
        // 差集
        $info = \Redis::sdiff($key,$key1);
        dd($info);
        return view('test');
    }
}

哪個key在前,就以哪個key的值為基准。。

  • 頁面響應 ![](/content/images/2017/01/12.png)

當然了,這里只是一些最基本的Redis緩存demo,其實他的強大遠遠不止這些,操作也不止這些,比如隊列里的彈出,比如集合與集合之間的復雜關系運用...如何將非關系型的Redis運用成關系型數據庫那樣??Redis的一些實用場景又是那一些??敬請查看下一篇--"Redis 三部曲之第二部 Redis 基本的數據隔離"。

[原文地址](http://www.blog8090.com/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM