本文的目的是介绍php–通过SSL的LaravelRedis缓存?的详细情况,特别关注phpcurlssl的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解php–通过
本文的目的是介绍php – 通过SSL的Laravel Redis缓存?的详细情况,特别关注php curl ssl的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解php – 通过SSL的Laravel Redis缓存?的机会,同时也不会遗漏关于Laravel - Redis 缓存三部曲 (一) 初识Predis、Laravel - Redis 缓存三部曲 (二) Predis -基本数据隔离、Laravel Homestead Redis缓存无法正常工作、Laravel Redis-工匠缓存:清除-连接被拒绝[unix:/path/.redis/redis.sock]的知识。
本文目录一览:- php – 通过SSL的Laravel Redis缓存?(php curl ssl)
- Laravel - Redis 缓存三部曲 (一) 初识Predis
- Laravel - Redis 缓存三部曲 (二) Predis -基本数据隔离
- Laravel Homestead Redis缓存无法正常工作
- Laravel Redis-工匠缓存:清除-连接被拒绝[unix:/path/.redis/redis.sock]
php – 通过SSL的Laravel Redis缓存?(php curl ssl)
我正在尝试使用信息https://github.com/nrk/predis连接到具有predis 1.1和SSL的Redis,其中在示例中使用以下配置:
// Named array of connection parameters:
$client = new Predis\Client([
'scheme' => 'tls',
'ssl' => ['cafile' => 'private.pem', 'verify_peer' => true],
]);
我的Laravel配置如下所示:
'redis' => [
'client' => 'predis',
'cluster' => env('REdis_CLUSTER', false),
'default' => [
'host' => env('REdis_HOST', 'localhost'),
'password' => env('REdis_PASSWORD', null),
'port' => env('REdis_PORT', 6379),
'database' => 0,
],
'options' => [
'cluster' => 'redis',
'parameters' => ['password' => env('REdis_PASSWORD', null)],
'scheme' => 'tls',
'ssl' => ['verify_peer' => false],
],
],
由于我没有用于SSL的密钥,因此我禁用了对等验证(根据http://php.net/manual/en/context.ssl.php).
不幸的是我收到以下错误:
ConnectionException in AbstractConnection.PHP line 155:
Error while reading line from the server. [tcp://MY_REdis_SERVER_URL:6380]
建议表示赞赏:)
解决方法:
我能够让它上班!
您需要将’scheme’从’options’移动到’default’:
我的工作配置:
'redis' => [
'client' => 'predis',
'cluster' => env('REdis_CLUSTER', false),
'default' => [
'scheme' => 'tls',
'host' => env('REdis_HOST', 'localhost'),
'password' => env('REdis_PASSWORD', null),
'port' => env('REdis_PORT', 6379),
'database' => 0,
],
'options' => [
'parameters' => ['password' => env('REdis_PASSWORD', null)],
'ssl' => ['verify_peer' => false],
],
],
注意:我还从’options’中删除了’cluster’选项,但我不怀疑这是这个问题的成败.
在我的最终决赛配置中,我将其更改为:’scheme’=> env(‘REdis_SCHEME’,’tcp’),然后在我的env文件中定义REdis_SCHEME = tls.
使用启用了TLS的AWS ElastiCache进行测试.
编辑:
以上配置仅适用于单节点redis.如果您碰巧启用了群集和TLS,那么您将完全需要不同的配置.
'redis' => [
'client' => 'predis',
'cluster' => env('REdis_CLUSTER', false),
// Note! for single redis nodes, the default is defined here.
// keeping it here for clusters will actually prevent the cluster config
// from being used, it'll assume single node only.
//'default' => [
// ...
//],
// #pro-tip, you can use the Cluster config even for single instances!
'clusters' => [
'default' => [
[
'scheme' => env('REdis_SCHEME', 'tcp'),
'host' => env('REdis_HOST', 'localhost'),
'password' => env('REdis_PASSWORD', null),
'port' => env('REdis_PORT', 6379),
'database' => env('REdis_DATABASE', 0),
],
],
'options' => [ // Clustering specific options
'cluster' => 'redis', // This tells Redis Client lib to follow redirects (from cluster)
]
],
'options' => [
'parameters' => [ // Parameters provide defaults for the Connection Factory
'password' => env('REdis_PASSWORD', null), // Redirects need PW for the other nodes
'scheme' => env('REdis_SCHEME', 'tcp'), // Redirects also must match scheme
],
'ssl' => ['verify_peer' => false], // Since we dont have TLS cert to verify
]
]
解释上述内容:
>’client’=> ‘predis’:这指定要使用的PHP Library Redis驱动程序(predis).
>’cluster’=> ‘redis’:这告诉Predis假设服务器端集群.这只是意味着“跟随重定向”(例如-MOVED响应).使用群集运行时,节点将使用-MOVED响应您必须要求输入特定密钥的节点.
>如果没有使用Redis群集启用此功能,Laravel将抛出-MOVED异常1 / n次,n是Redis群集中的节点数(它会很幸运并且每隔一段时间就会询问正确的节点)
>’clusters’=> […]:指定一个节点列表,但只设置一个’default’并将其指向AWS ‘Configuration endpoint’将让它动态找到任何/所有其他节点(推荐用于Elasticache,因为你不知道节点何时出现’或goin’).
>’options’:对于Laravel,可以在顶级,集群级和节点选项中指定. (他们在被传递到Predis之前被合并在Illuminate中)
>’parameters’:这些’覆盖’Predis用于新连接的默认连接设置/假设.由于我们明确地为“默认”连接设置它们,因此不使用它们.但对于群集设置,它们至关重要. “主”节点可以发回重定向(-MOVED),除非为密码和方案设置参数,否则它将假设默认值,并且与新节点的新连接将失败.
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'');
}
}
-
页面响应 
-
读取相应的字符串
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'');
}
}
- 页面响应 
和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'');
}
}
-
页面响应 (写入的数量) 
-
写入队列
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'');
}
}
-
页面响应 (数组) 
-
从左往右塞入队列 连贯方法
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'');
}
}
- 页面响应 (数组 是不是正好和上面的相反?) 
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'');
}
}
-
页面响应 
-
取数据(取所有)
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'');
}
}
-
页面响应 
-
取数据(取个别字段)
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'');
}
}
- 页面响应 
// 判断这个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'');
}
}
-
页面响应 
-
求两个集合的交集
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'');
}
}
-
页面响应 
-
求两个集合的并集
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'');
}
}
-
页面响应 
-
求两个集合的差集
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的值为基准。。
- 页面响应 
当然了,这里只是一些最基本的Redis缓存demo,其实他的强大远远不止这些,操作也不止这些,比如队列里的弹出,比如集合与集合之间的复杂关系运用...如何将非关系型的Redis运用成关系型数据库那样??Redis的一些实用场景又是那一些??敬请查看下一篇--"Redis 三部曲之第二部 Redis 基本的数据隔离"。
[原文地址](http://www.blog8090.com/)
Laravel - Redis 缓存三部曲 (二) Predis -基本数据隔离
Laravel - Redis 缓存三部曲 (二) Predis -基本数据隔离
上一篇 Redis三部曲(一)介绍了Laravel中Predis的几种基本数据类型的使用和Redis的概念,但是就算会写了,然而缓存什么时候使用呢???
下面就结合上一篇的内容给大家说说Predis的一些组合用法,队列如何配合STRING类型或者HASH类型来组合使用,甚至把非关系变成和MySQl一样成为关系型的。
队列与哈希的组合使用 - 实现数据关系化
思路 :利用队列里的值来做需要取数据的唯一索引,利用哈希的key的后缀名做原型数据的唯一索引
队列和哈希的组合使用优势是,取出来可以直接使用,劣势在于内存占用相比较字符串而言要大
- 实例:因为Redis只能存数组而我们实例为了方便直接用DB类来写的,如果是ORM可以直接返回数组的
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() { // $where = [''status''=>''1'']; $obj = \DB::table(''data_admin_login'')->where($where)->get(); $array = $this->objectToArray($obj); dd($array); }
打印的数据如下:
- 接下来 我们要把从数据库取出来的数据存入Redis,用什么样的方法存,用什么样的方法取,这些东西都得考虑好;下面实例如下:
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() { // $where = [''status''=>''1'']; $obj = \DB::table(''data_admin_login'')->where($where)->get(); $array = $this->objectToArray($obj); // 定义Redis的key $listKey = ''LIST:TEST:ADMIN''; $hashKey = ''HASH:TEST:ADMIN:''; // 遍历时写入Redis list为索引 hash为数据 foreach($array as $v){ \Redis::rpush($listKey,$v[''guid'']); \Redis::hMset($hashKey.$v[''guid''],$v); } return ''缓存写入成功''; }
- 查看下redis里面的情况 第一个 查看所有key 发现有1个队列和16个哈希
第二个 取LIST:TEST:ADMIN 整个队列 发现有16个 唯一识别ID的数据(而且顺序和从数据库取出来的顺序是一样的)
第三个取出其中一个哈希查看数据
- 可以看出来 我们想要的数据已经存入了redis中,接下来,如果我想通过redis直接获取MySQL中管理员的列表数据怎么使用呢?
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() { // // 定义Redis的key $listKey = ''LIST:TEST:ADMIN''; $hashKey = ''HASH:TEST:ADMIN:''; // 取出admin队列的唯一识别id数组 $list = \Redis::lrange($listKey,0,-1); $array = null; foreach($list as $v){ // 取出哈希里的数据写入大数组中 $array[] = \Redis::hGetall($hashKey.$v); } dd($array); }
- 我们来看看打印的结果
这样取出来的数据是不是一样可以遍历到模版上?
- 最后来完整的做一个例子
思路:我们的目的是从redis里面取出想要输出到模版上的数据,但是redis大家也知道,只是缓存服务器重启了,就没了(除非做磁盘持久化),但是我要做的是如果Redis里面没有我要从MySQL里面取,取到了然后写入Redis,保证对MySQL的请求大大减少。
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index() { // // 定义Redis的key $listKey = ''LIST:TEST:ADMIN''; $hashKey = ''HASH:TEST:ADMIN:''; // 查看key是否存在? if(empty(\Redis::exists($listKey))){ // 如果Redis不存在 读数据库然后写入redis $where = [''status''=>''1'']; $obj = \DB::table(''data_admin_login'')->where($where)->get(); $array = $this->objectToArray($obj); // 遍历时写入Redis list为索引 hash为数据 foreach($array as $v){ \Redis::rpush($listKey,$v[''guid'']); \Redis::hMset($hashKey.$v[''guid''],$v); } return $array; } // 如果redis存在 直接读redis的数据 // 取出admin队列的唯一识别id数组 $list = \Redis::lrange($listKey,0,-1); $array = null; foreach($list as $v){ $array[] = \Redis::hGetall($hashKey.$v); } return $array; }
- 不管我把
redis
的key
手动删除还是redis
的key
存在 我们输出的都是这个(这是我的浏览器插件json-handle的效果)
- 删除
redis
的key
效果依旧
那么肯定有人又要问了 你这只是在读数据库 如果我增 删 改 后 redis
不同步了哇
是这样的,所以一般我们在实际商业项目中 做一个大型的redis
数据隔离都需要把mysql
的增删改 绑上同步的redis
操作,这样下来,我每次读redis
既大大的提升了性能,也保障了数据的同步性
下面拿添加
做一个实例,如何MySQL
与redis
数据同步
restfulApi 添加方法
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create() { // // 定义Redis的key $listKey = ''LIST:TEST:ADMIN''; $hashKey = ''HASH:TEST:ADMIN:''; $data = [ ''guid''=> ''12341234123412341234123412341234'', ''email''=> ''adminadmin@163.com'', ''password''=> ''111dcfeb6d42b320d9b885f1b8fa498a'', ''status''=> ''1'', ''sroce''=> ''0'', ''addtime''=> time(), ''logintime''=> '''', ''ip''=> '''' ]; $temp = \DB::table(''data_admin_login'')->insert($data); if($temp){ \Redis::rpush($listKey,$data[''guid'']); \Redis::hMset($hashKey.$data[''guid''],$data); return ''写入成功''; } return ''写入失败''; }
- 页面响应
- redis查看一下有没有同步写入
我们发现数据同步进入了redis
- index方法代码不变 再请求一次 数据也明显同步了
以上讲的就是最基本的redis隔离技术,当然为了提现的简单点,直接都写在控制器里面了,并没有做过多的分层调用,RedisKey也没有做配置话,而是反复在用;实际项目中Redis是可以单独做一个模块的,架构的层级分化明确了也可以大大的提升Redis的复用性;当然这些只是建议和思路,主要还是看当前每个人手头的架构为主。
其他组合关系型方法
至于其他的关系型的组合方法就在下面简要做做介绍了,纯手码写得也挺累,望大家体谅。。
- 队列和字符串类型
队列和字符串类型一样可以把数据关系型
思路:同样的list存索引的key(ID或唯一识别ID),字符串存json字符串,字符串的key同样后缀加唯一识别ID来进行区分。当需要输出到页面上的时候json_decode过来就行了
队列和字符串的优点是存储的空间小,劣势在于存的时候要解析成字符串,取的时候要解析为数组或对象
- 集合和字符串类型
集合和字符串类型一样可以把数据关系型
思路:大家应该都知道 redis集合有有序集合和无序集合之分,在有些场景中,其实用集合的形势反而更灵活(多维度集合控制),比如
关注我的人、我关注的人、同时互相关注的、QQ中的''可能认识的人''、异步写入时分区间
等等等...
- 集合和哈希类型
思路其实就是和上面差不多,也就是存储方便,消耗内存相比较而言较大。
其实我本人确实推荐博客中能来些实例,在加上一些思想引导的写法,来给大家帮助,因为这正是我当初成长时希望看到的博客,而不是全部都是一些理论性的知识铺天盖地而来;希望上面所写,能够帮助正在工作中奋斗的你。。。
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处. 如转载但不标明来源,后果自负。
Laravel Homestead Redis缓存无法正常工作
如何解决Laravel Homestead Redis缓存无法正常工作?
Laravel 7 homestead redis缓存现在出现问题。这是.env
CACHE_DRIVER=redis
REdis_HOST=127.0.0.1
REdis_PASSWORD=null
REdis_PORT=6379
缓存代码
$cache_key = $key.''_home_random''; //I pass the key
$expiresAt = Now()->addHours(24);
$posts = Post::where($where)->inRandomOrder()->paginate(3);
Cache::add($cache_key,$posts,$expiresAt);
//tried Cache::put too
检查数据是否在缓存中
if (Cache::has(''books_category_home_random''))
{
echo ''yes<br>'';
$value = Cache::get(''books_category_home_random'');
print_r($value);
}
我可以正确打印数据。我使用redis-cli monitor
,控制台中已经存在缓存,但是缓存中不显示页面,并且数据不断变化。在注释掉缓存过程后检查缓存时,我发现没有缓存,因此它缓存了数据,然后当我重新加载页面缓存时,它被删除并被新数据覆盖。这是什么问题,为什么在我指定的时间段内未保存缓存?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Laravel Redis-工匠缓存:清除-连接被拒绝[unix:/path/.redis/redis.sock]
REDIS_HOST应该指向Redis服务器的托管地址,无论它是托管在本地计算机还是云服务上。如下所示:
REDIS_HOST=12.0.0.1
REDIS_PASSWORD=password
REDIS_PORT=6379
,
设置REDIS_HOST=127.0.0.1
或您的主机地址
尝试使用以下配置。
.env
CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_SCHEME=unix
REDIS_PATH=/path/.redis/redis.sock
REDIS_CACHE_DB=0
REDIS_SESSION_DB=1
config.database.php
'redis' => [
'client' => env('REDIS_CLIENT','predis'),'cluster' => true,'options' => [
'cluster' => env('REDIS_CLUSTER','prefix' => Str::slug(env('APP_NAME'),'_').'_','parameters' => ['password' => null],],'default' => [
'scheme' => env('REDIS_SCHEME'),'path' => env('REDIS_PATH'),'database' => env('REDIS_CACHE_DB',0)
],'cache' => [
'scheme' => env('REDIS_SCHEME'),0),'session' => [
'scheme' => env('REDIS_SCHEME'),'database' => env('REDIS_SESSION_DB',1),]
]
今天关于php – 通过SSL的Laravel Redis缓存?和php curl ssl的介绍到此结束,谢谢您的阅读,有关Laravel - Redis 缓存三部曲 (一) 初识Predis、Laravel - Redis 缓存三部曲 (二) Predis -基本数据隔离、Laravel Homestead Redis缓存无法正常工作、Laravel Redis-工匠缓存:清除-连接被拒绝[unix:/path/.redis/redis.sock]等更多相关知识的信息可以在本站进行查询。
本文标签: