Laravel 为各种后端缓存提供丰富而统一的 API,而其配置信息位于 config/cache.php 文件中,Laravel 默认使用 file 缓存驱动,将序列化的缓存对象保存在文件系统中。

1 Redis的配置

这里仅探讨redis缓存配置的一些内容

1.1 安装PRedis

PRedis是PHP访问redis的扩展包,只需要下载原码即可,不需要安装PHP扩展(如php-redis.so)。我们使用composer安装

composer require predis/predis 1.0.*

1.2 配置

  • 默认情况下,Redis 服务会提供 16 个数据库,Laravel 使用数据库 0 (请见 Redis 文档)作为缓存和 Session 的存储。
  • 当你在执行命令 php artisan cache:clear 的时候,会把 Session 也连带清除了,导致所有用户需要重新登录。
  • 我们的目的是让缓存,也就是默认的 Redis 存储到 0 号数据库,Session 存储在 1 号数据库。('database' => 0,'database' => 1)

1.2.1 配置redis数据库

应用的Redis配置位于config/database.php,你可以基于环境随意修改该数组,只需要给每个Redis服务器一个名字并指定该Redis服务器使用的主机和接口。

'redis' => [

    'cluster' => false,

    //默认的redis服务器
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
], //供session使用的
'session' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
], //配置更多的redis服务器... ],

1.2.2 更改session的配置

  • 方式1 修改 config/session.php
 'driver' => env('SESSION_DRIVER', 'redis'),  //指定session使用的方式
  • 方式2 开发环境下可以修改 .env 文件的配置
SESSION_DRIVER=redis

测试一下,执行以下命令后检查下是否退出登录:

php artisan cache:clear

1.2.3 更改cache配置

修改config/cache.php 文件

'default' => env('CACHE_DRIVER', 'redis'),

'stores' => [
'apc' => [
'driver' => 'apc',
],
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache'),
],
// 其它一些配置省略了...
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
],

分析:

  • 配置文件
//config/database.php文件 配置redis连接

// config/session.php文件 更改session方式
'driver' => env('SESSION_DRIVER', 'redis') //config/cache.php文件 更改缓存方式
'default' => env('CACHE_DRIVER', 'redis')
  • .env文件
CACHE_DRIVER=file
SESSION_DRIVER=redis REDIS_HOST=192.168.1.248
REDIS_PASSWORD=null
REDIS_PORT=6379

.env可以方便的配置我们的开发环境,但是正式环境建议更改对应配置文件

1.3 使用redis

我们可以在Redis门面上以静态方法的方式调用Redis客户端提供的任何命令( Redis命令大全 ),然后Laravel使用魔术方法将命令传递给Redis服务器并返回获取的结果。

使用前提是引入Redis门面

use Illuminate\Support\Facades\Redis;

一些基本使用

Redis::set('key','value');  //存入redis
Redis::get('key'); //获取redis中的值
Redis::lLen('key'); //队列的长度
Redis::rpop('key'); //右侧出队列
Redis::rpush('key','value'); //右侧存入队列
Redis::exists($key) //redis是否存在这个键

2 缓存的使用

你可以使用 Cache facade 来访问缓存

// 通过store方法访问各种缓存存储
$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', 10); // 从缓存中获取数据
$value = Cache::get('key');
$value = Cache::get('key', 'default');
// 你甚至可以传递 Closure 作为默认值。如果指定的数据不存在于缓存中,将返回 Closure 的结果
$value = Cache::get('key', function () {
return DB::table(...)->get();
}); // 确认项目是否存在
Cache::has('key') // 递增与递减值,第二个可选参数,用来指示要递增或递减值的数量
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount); // 有时你可能想从缓存中找出一个数据,而当在请求的数据不存在时,程序能为你存储默认值
$value = Cache::remember('users', $minutes, function () {
return DB::table('users')->get();
}); // 使用 rememberForever 方法从缓存中查找数据或永久存储它
$value = Cache::rememberForever('users', function() {
return DB::table('users')->get();
}); // 从缓存中获取到数据之后再删除它,和 get 方法一样,如果缓存中不存在该数据, 则返回 null
$value = Cache::pull('key'); // put 方法来将数据存储到缓存中,你需要使用第三个参数来设定缓存的过期时间:
Cache::put('key', 'value', $minutes);
// 除了以整数形式传递过期的分钟数,还可以传递一个 DateTime 实例来表示该数据的过期时间:
$expiresAt = Carbon::now()->addMinutes(10);
Cache::put('key', 'value', $expiresAt); // 只存储没有的数据, 果存放成功返回 true ,否则返回 false :
Cache::add('key', 'value', $minutes); // 数据永久存储,这些缓存数据不会过期,所以必须通过 forget 方法从缓存中手动删除它们:
Cache::forever('key', 'value'); // 删除缓存中数据
Cache::forget('key'); // 清空所有缓存,慎用
Cache::flush();

还可以使用cache辅助函数

$value = cache('key');

cache(['key' => 'value'], $minutes);

cache(['key' => 'value'], Carbon::now()->addSeconds(10));

3. 缓存标记

缓存标记并不支持使用 file 或 database 的缓存驱动。

1.写入

所谓的缓存标记,就是对缓存的数据打上相关的标记,以便清空所有被分配指定标记的缓存值。你可以通过传入标记名称的有序数组来为缓存数据写入标记。

Cache::tags(['people', 'artists'])->put('John', $john, $minutes);

Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);

2.访问

若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags 方法,然后调用 get 方法来获取你要检索的键:

$john = Cache::tags(['people', 'artists'])->get('John');

$anne = Cache::tags(['people', 'authors'])->get('Anne');

3.移除

你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会删除被标记为 people、authors 或两者都有的缓存。所以,Anne 与 John 都会从缓存被删除:

Cache::tags(['people', 'authors'])->flush();

相比之下,下面的语句只会删除被标记为 authors 的缓存,所以 Anne 会被移除,但 John 不会:

Cache::tags('authors')->flush();

laravel5.5缓存系统的更多相关文章

  1. Memcache缓存系统构建一

    在如今这个高效率的社会中,怎样将这个高效率应用到自己的程序中,是一个值得追寻和值得探讨的问题.因为这个memcache能够很好的提高检索速度,提升用户体验,而且重要的是减少数据库的访问.这就大大的提高 ...

  2. Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

    mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...

  3. 深入探讨在集群环境中使用 EhCache 缓存系统

    EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用 ...

  4. Memcached 数据缓存系统

    Memcached 数据缓存系统 常用命令及使用:http://www.cnblogs.com/wayne173/p/5652034.html Memcached是一个自由开源的,高性能,分布式内存对 ...

  5. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  6. 分布式缓存系统Memcached简介与实践

    缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...

  7. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  8. 第十七课:js数据缓存系统的原理

    这一章主要讲的是jQuery的缓存系统的历史发展,以及他自己的框架的缓存系统的实现.都是源码解析. 我就挑几个重点讲下: (1)jQuery的缓存机制的原理 jQuery的缓存机制实现的原理是在元素中 ...

  9. 高性能的分布式内存对象缓存系统Memcached

    Memcached概述   什么是Memcached? 先看看下面几个概念: Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所缓存的内容非持久化.对于CPU要求很低,所以常常采 ...

随机推荐

  1. mysql 5.6 zip安装,启动失败,1067错误

    在使用mysql5.6 zip压缩包安装mysql过程中,启动过程,老是卡在1067启动错误上,翻看网上各种解决方案,卸载干净重装,重启,都不管用. 网上各种教程都是新建 my.ini mysql 配 ...

  2. Fiddler-1 官网下载及安装

    1 进入Fiddler官网:http://www.telerik.com/fiddler 点击[Free download]:填写一些信息后就可以下载. 2 双击安装包--下一步dinghanhua下 ...

  3. hdu-2844&&POJ-1742 Coins---多重背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目大意: Tony想要买一个东西,他只有n中硬币每种硬币的面值为a[i]每种硬币的数量为c[ ...

  4. Android(java)学习笔记60:继承中父类 没有无参构造

    1. 继承中父类 没有无参构造: package com.himi.test1; /* 如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢? 报错. 如何解决呢? A:在父类中加一个无参构造 ...

  5. 数据库连接-ADO.NET

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huo065000/article/details/25830291       非常早就知道了ADO ...

  6. 【BZOJ1269】[AHOI2006] 文本编辑器editor(Splay)

    点此看题面 大致题意: 让你维护一个字符串,有插入字符串.删除区间.反转区间和输出单个字符操作. \(Splay\) 这应该是一道比较简单的\(Splay\)题(虽然因为各种细节我调了很久). 我们可 ...

  7. treap数组版

    然而就是将指针的地方换成int引用 就是存个代码 #include<cstdio> #include<iostream> #include<cstdlib> #in ...

  8. 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题

    解决思路 众所周知,MVC中调用的微软的组件JavaScriptSerialer...,格式DateTime类型数据需要在客户端专门解. 还知道,NewtonSoft.json可以“正确”的格式化Da ...

  9. js日期转换Fri Oct 31 18:00:00 UTC+0800 2008转换为yyyy-mm-dd

    Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d ...

  10. cnn中的fp和bp推导

    昨天下午在单位从新推导了一遍fp和bp. 在整个网络的训练中,最关键的就是计算残差. 最后一层残差很容易,那么前面每一层的残差怎么计算呢? 总体来说,有多少权重就需要多少残差项来进行权重更新.每个权重 ...