Redis


Pengenalan

Redis ialah sumber terbuka, pangkalan data simpanan pasangan nilai kunci termaju. Memandangkan ia mengandungi String , Hash , List , Set , dan Ordered Set jenis data ini, ia sering dipanggil pelayan struktur data.

Sebelum menggunakan Laravel's Redis, anda perlu memasang pakej sambungan predis/predis melalui Composer: predis/predis 扩展包:

composer require predis/predis

或者,你也可以通过 PECL 安装 PhpRedis PHP 扩展。这个扩展安装起来比较复杂,但对于大量使用 Redis 的应用程序来说可能会产生更好的性能。

配置

Laravel 应用的 Redis 配置都在配置文件 config/database.php 中。在这个文件里,你可以看到 redis 数组里包含了应用程序使用的 Redis 服务器信息:

'redis' => [ 
   'client' => 'predis',    
   'default' => [     
      'host' => env('REDIS_HOST', '127.0.0.1'),        
      'password' => env('REDIS_PASSWORD', null),        
      'port' => env('REDIS_PORT', 6379),        
      'database' => env('REDIS_DB', 0),   
      ],    
    'cache' => [     
       'host' => env('REDIS_HOST', '127.0.0.1'),        
       'password' => env('REDIS_PASSWORD', null),        
       'port' => env('REDIS_PORT', 6379),        
       'database' => env('REDIS_CACHE_DB', 1),    
      ],
  ],

默认的服务器配置应该足以进行开发。当然,你也可以根据使用的环境来随意更改这个数组。只需在配置文件中给每个 Redis 服务器指定名称、host(主机)和 port(端口)即可。

集群配置

如果你的应用使用 Redis 服务器集群,你应该在 Redis 配置文件中使用 clusters 键来定义这些集群:

'redis' => [
    'client' => 'predis',    
    'clusters' => [    
        'default' => [         
           [             
              'host' => env('REDIS_HOST', 'localhost'),                
              'password' => env('REDIS_PASSWORD', null),                
              'port' => env('REDIS_PORT', 6379),                
              'database' => 0,          
            ],       
          ],  
       ],
    ],

默认情况下,集群可以在节点上实现客户端分片,允许你实现节点池以及创建大量可用内存。这里要注意,客户端共享不会处理失败的情况;因此,这个功能主要适用于从另一个主数据库获取的缓存数据。如果要使用 Redis 原生集群,需要在配置文件下的 options 键中做出如下指定:

'redis' => [ 
   'client' => 'predis',    
   'options' => [     
      'cluster' => 'redis',   
     ],    
   'clusters' => [   
        // ...   
     ],
  ],

Predis

除了默认的 host, port, database, 和 password 这些服务配置选项外,Predis 还支持为每个 Redis 服务器定义其它的链接参数 connection parameters 。如果要使用这些额外的配置选项,可以将以下配置添加到 Redis 服务器的配置文件 config/database.php

'default' => [
    'host' => env('REDIS_HOST', 'localhost'),    
    'password' => env('REDIS_PASSWORD', null),    
    'port' => env('REDIS_PORT', 6379),    
    'database' => 0,    
    'read_write_timeout' => 60,
  ],

Atau, anda juga boleh memasangnya melalui PECL PhpRedis

sambungan PHP. Sambungan ini lebih kompleks untuk dipasang, tetapi mungkin menghasilkan prestasi yang lebih baik untuk aplikasi yang banyak menggunakan Redis.

Konfigurasi

🎜Konfigurasi Redis aplikasi Laravel berada dalam fail konfigurasi config /database.php. Dalam fail ini, anda boleh melihat tatasusunan redis mengandungi maklumat tentang pelayan Redis yang digunakan oleh aplikasi: 🎜
'redis' => [ 
   'client' => 'phpredis',    
   // 其余的Redis配置...
 ],
🎜Konfigurasi pelayan lalai sepatutnya mencukupi untuk pembangunan. Sudah tentu, anda juga boleh menukar tatasusunan ini sesuka hati mengikut persekitaran yang digunakan. Hanya tentukan nama, hos dan port untuk setiap pelayan Redis dalam fail konfigurasi. 🎜
🎜

Konfigurasi kluster

🎜Jika aplikasi anda menggunakan kluster pelayan Redis, anda harus menggunakan kluster kunci untuk mentakrifkan kluster ini: 🎜
'default' => [
    'host' => env('REDIS_HOST', 'localhost'),    
    'password' => env('REDIS_PASSWORD', null),    
    'port' => env('REDIS_PORT', 6379),    
    'database' => 0,    
    'read_timeout' => 60,
  ],
🎜 Secara lalai, kluster boleh melaksanakan sharding sisi klien pada nod, membolehkan anda melaksanakan kumpulan nod dan mencipta sejumlah besar memori percuma. Perhatikan di sini bahawa perkongsian pihak pelanggan tidak mengendalikan kes kegagalan, oleh itu, ciri ini sesuai terutamanya untuk data cache yang diperoleh daripada pangkalan data induk yang lain. Jika anda ingin menggunakan kluster asli Redis, anda perlu menentukan perkara berikut dalam kekunci options di bawah fail konfigurasi: 🎜
<?php
    namespace App\Http\Controllers;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Redis;
    class UserController extends Controller{   
     /**
     * 显示给定用户的配置文件。
     *
     * @param  int  $id
     * @return Response
     */   
    public function showProfile($id)   
     {     
        $user = Redis::get('user:profile:'.$id);        
        return view('user.profile', ['user' => $user]);    
      }
   }
🎜
🎜🎜
🎜

Predis

🎜Selain daripada host lalai, port, database, dan kata laluan Selain pilihan konfigurasi perkhidmatan ini, Predis juga menyokong penentuan parameter sambungan lain untuk setiap pelayan Redis
parameter sambungan 🎜 . Jika anda ingin menggunakan pilihan konfigurasi tambahan ini, anda boleh menambah konfigurasi berikut pada fail konfigurasi pelayan Redis config/database.php: 🎜
Redis::set('name', 'Taylor');
$values = Redis::lrange('names', 5, 10);
🎜🎜🎜🎜🎜🎜

PhpRedis

Untuk menggunakan sambungan PhpRedis, anda perlu menukar pilihan client konfigurasi Redis dalam fail konfigurasi config/database.php kepada phpredis< /code>: config/database.php 中 Redis 配置的 client 选项修改为 phpredis

$values = Redis::command('lrange', ['name', 5, 10]);

除了默认的 hostportdatabasepassword 这些服务配置选项外,PhpRedis 还支持以下几个额外的连接参数: persistentprefixread_timeouttimeout 。你可以将这些配置选项添加到配置文件 config/database.php 中 Redis 服务配置项下:

$redis = Redis::connection();

Redis 交互

你可以通过调用 Redis facade 上的各种方法来与 Redis 交互。Redis facade 支持动态方法,意味着你可以在 facade 上调用各种 Redis 命令 ,命令将直接传递给 Redis。在示例中,将通过 Redis facade 上的 get 方法来调用 Redis 上的 GET 命令:

$redis = Redis::connection('my-connection');

如上所述,你可以在 Redis facade 上调用任意 Redis 命令。Laravel 使用魔术方法将命令传递给 Redis 服务器,因此只需传递 Redis 命令所需的参数即可:

Redis::pipeline(function ($pipe) { 
   for ($i = 0; $i < 1000; $i++) {     
      $pipe->set("key:$i", $i);   
      }
  });

或者,你也可以使用 command 方法将命令传递给服务器,它接受命令的名称作为其第一个参数,并将值的数组作为其第二个参数:

<?php
    namespace App\Console\Commands;
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\Redis;
    class RedisSubscribe extends Command{  
      /**
     * 控制台命令的名称和签名。
     *
     * @var string
     */ 
      protected $signature = 'redis:subscribe';    
    /**
     * 控制台命令说明。
     *
     * @var string
     */    
    protected $description = 'Subscribe to a Redis channel';    
    /**
     * 执行控制台命令。
     *
     * @return mixed
     */   
      public function handle()  
        {      
          Redis::subscribe(['test-channel'], function ($message) {      
                echo $message;        
               });  
        }
     }

使用多个 Redis 连接

你可以通过 Redis::connection 方法获得 Redis 实例:

Route::get('publish', function () {  
  // 路由...    
  Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});

这会返回一个默认的 Redis 实例。你可以传递连接或者集群名称给 connection 方法来获取在 Redis 配置中特定服务或集群:

Redis::psubscribe(['*'], function ($message, $channel) {
    echo $message;});Redis::psubscribe(['users.*'], function ($message, $channel) {
        echo $message;
     });

管道命令

当你需要在一个操作中给服务器发送很多命令时,推荐你使用管道命令。 pipeline 方法接受一个 Redis 实例的 闭包 rrreee

Selain daripada host lalai, port, pangkalan data dan kata laluan konfigurasi perkhidmatan ini pilihan, PhpRedis juga menyokong Beberapa parameter sambungan tambahan berikut: berterusan, prefix, read_timeout dan timeout. Anda boleh menambah pilihan konfigurasi ini pada fail konfigurasi config/database.php di bawah item konfigurasi perkhidmatan Redis:

rrreee

Interaksi Redis

Anda boleh berinteraksi dengan Redis dengan memanggil pelbagai kaedah pada fasad Redis. Fasad Redis menyokong kaedah dinamik, yang bermaksud anda boleh memanggil pelbagai arahan Redis 🎜 pada fasad dan arahan akan dihantar terus ke Redis. Dalam contoh, arahan GET pada Redis akan dipanggil melalui kaedah get pada fasad Redis: 🎜rrreee🎜Seperti yang dinyatakan di atas, anda boleh Panggil mana-mana arahan Redis pada fasad Redis. Laravel menggunakan kaedah ajaib untuk menghantar arahan kepada pelayan Redis, jadi hanya lulus parameter yang diperlukan oleh arahan Redis: 🎜rrreee🎜 Sebagai alternatif, anda boleh menghantar arahan kepada pelayan menggunakan kaedah command, yang menerima Nama perintah sebagai argumen pertamanya dan tatasusunan nilai sebagai argumen kedua: 🎜rrreee
🎜

Menggunakan berbilang sambungan Redis🎜Anda boleh mendapatkan contoh Redis melalui kaedah Redis::connection: 🎜rrreee🎜Ini akan mengembalikan tika Redis lalai. Anda boleh menghantar sambungan atau nama kluster kepada kaedah sambungan untuk mendapatkan perkhidmatan atau kluster tertentu dalam konfigurasi Redis: 🎜rrreee🎜🎜🎜
🎜🎜Arahan saluran paip🎜🎜Apabila anda perlu menghantar banyak arahan kepada pelayan dalam satu operasi, anda disyorkan untuk menggunakan arahan talian paip. Kaedah talian paip menerima penutupan tika Redis. Anda boleh menghantar semua arahan kepada contoh Redis dan ia akan dilaksanakan dalam satu operasi: 🎜rrreee🎜🎜🎜🎜🎜🎜

Terbitkan dan Langgan

Laravel menyediakan antara muka yang mudah untuk terbitkan dan langgan Redis. Perintah Redis ini membolehkan anda mendengar mesej pada "saluran" tertentu. Anda boleh menerbitkan mesej daripada aplikasi lain ke aplikasi lain, malah menggunakan bahasa pengaturcaraan lain, membenarkan aplikasi dan proses berkomunikasi dengan mudah. publishsubscribe 提供了方便的接口。这些 Redis 命令让你可以监听指定「频道」上的消息。你可以从另一个应用程序发布消息给另一个应用程序,甚至使用其它编程语言,让应用程序和进程之间能够轻松进行通信。

首先,我们使用 subscribe 方法设置频道监听器。我们将这个方法调用放在 Artisan 命令 中,因为调用 subscribe 方法会启动一个长时间运行的进程:

rrreee

现在我们可以使用 publish 方法将消息发布到频道:

rrreee

通配符订阅

使用 psubscribe 方法可以订阅通配符频道,可以用来在所有频道上获取所有消息。 $channel 名称将作为第二个参数传递给提供的回调 闭包

Pertama, kami menggunakan kaedah langgan untuk menyediakan pendengar saluran. Kami meletakkan panggilan kaedah ini dalam arahan Artisan kerana memanggil kaedah subscribe memulakan proses yang lama:
Gunakan kaedah psubscribe untuk melanggan saluran wildcard, yang boleh digunakan dalam Dapatkan semua mesej pada semua saluran. Nama $channel akan dihantar sebagai parameter kedua kepada closure panggilan balik yang disediakan: 🎜rrreee🎜Artikel ini mula-mula muncul di tapak web 🎜LearnKu.com🎜. 🎜🎜