Laravel中Redis的使用

安装

Composer 安装 predis/predis 包:

1
composer require predis/predis

配置

redis的配置文件是:config/database.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
'redis' => [

'client' => env('REDIS_CLIENT', 'phpredis'),

'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],

'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],

'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],

],

.env配置cache

1
2
3
4
5
6
7
8
9
BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

config/cache.php:

1
2
3
4
5
6
'default' => env('CACHE_DRIVER', 'redis'),

'redis' => [
'driver' => 'redis',
'connection' => 'cache',
],

config/database.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
'redis' => [

...

'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],

],

测试

创建一个控制器:

1
php artisan make:controller RedisTest\RedisController

路由配置:

1
2
3
4
// use App\Http\Controllers\RedisTest\RedisController;

// Route::get('/testRedis',[RedisController::class,'testRedis']);
Route::get('/testRedis', 'RedisTest\RedisController@testRedis');

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace App\Http\Controllers\RedisTest;

use App\Http\Controllers\Controller;
use App\Models\Users;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redis;

class RedisController extends Controller
{
public function testRedis()
{
Redis::set('name', 'lisi');
$values = Redis::get('name');
//输出:"lisi"
$userinfo = Users::find(1)->toArray();
Redis::set('user_key', json_encode($userinfo));
if (Redis::exists('user_key')) {
$values = Redis::get('user_key');
dd(json_decode($values));
} else {
$values = Users::find(1);
dd($values);
}

}
}

参考:laravel缓存系统

缓存的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public function index()
{
$key = 'lisi';
$values1 = Cache::get($key); //直接读取cache,无数据则返回null
$values2 = Cache::get($key, 'default'); //直接读取cache,无数据默认返回default

if (Cache::has($key)) { //检查缓存项是否存在
$data = Cache::get($key);
dd('缓存中的数据:', $data[0]);
} else { //数据在缓存中不存在,则查询数据库,并储存到缓存
$data = Users::all()->where('name', 'lisi')->toArray();
Cache::forever($key, $data); //储存缓存
dd('数据库中的数据:', $data[0]);
}
if (!Cache::has($key)) {
Cache::forever('a_num', 10);
}

//递增与递减值,调整缓存中整数项的值
$c = Cache::increment('a_num');
$d = Cache::increment('a_num', 1);
$c = Cache::decrement('a_num');
$d = Cache::decrement('a_num', 2);

//获取和删除(从缓存中获取到数据之后再删除它)
$value = Cache::pull('users');

//获取和存储(从缓存中获取一个数据,而当请求的缓存项不存在时,程序能为你存储一个默认值) rememberForever 永久储存
$value = Cache::remember('users', 100, function () {
return Users::all()->where('name', 'lisi')->toArray();
});

//在缓存中存储数据
$value = 'bfxsz...';
Cache::put($key, $value, 10); //缓存存在10s
Cache::put('uid1995', '1分钟后删除', now()->addMinutes(1)); //根据特定时间实现缓存到期时间
Cache::forever('uid2020', '数据永远保存:【Cache::forever(\'uid2020\', \'数据永久储存:【】\')】'); //永久储存

//存储没有的数据
Cache::add('users_ad', '123456', 100);

//删除缓存
Cache::forget('key');

//清空所有缓存
Cache::flush();

$value = config('app.timezone'); //访问配置值
}

原子锁(使用原子锁来确保在一台服务器上每次只有一个远程任务在执行)

1
2
3
4
5
6
7
8
9
10
$lock = Cache::lock('fo', 10);
if ($lock->get()) {
//获取锁定10秒
$lock->release();
}

//get 方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁
Cache::lock('foo')->get(function () {
// 获取无限期锁并自动释放...
});
1
2
3
4
5
6
7
8
9
10
11
12
try {
$lock->block(5);
// 等待最多5秒后获取的锁...
} catch (LockTimeoutException $e) {
// 无法获取锁...
} finally {
optional($lock)->release();
}

Cache::lock('foo', 10)->block(5, function () {
// 等待最多5秒后获取的锁...
});