phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)

#phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)mysql

##前言## 先在这里感谢phalapi框架创始人@dogstar,为咱们提供了这样一个优秀的开源框架.git

当咱们在开发一个项目时,咱们可能会遇到不少问题,好比消息推送,发送邮件,发送短信,以及并发跟不上,这个时候就该轮到经常使用的缓存出手解救咱们了,咱们接下来来说讲缓存Redis在实际中的使用,解决实际问题.在这里是基于redis的基本知识,和简单看一下PhalApi的redis拓展文档在前来阅读此小节.redis

附上:sql

官网地址:http://www.phalapi.net/shell

开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release数据库

开源中国扩展Git地址:http://git.oschina.net/dogstar/PhalApi-Libraryapi

##1. 能解决什么问题##缓存

当咱们使用一门技术的时候,咱们固然是为了解决问题才去使用它的,那么咱们使用缓存技术Redis能解决什么具体的问题呢?服务器

##1.1 缓存结果集##微信

这里给一个例子你们看一下就会明白缓存结果集是什么意思

//从缓存redis的clubcache库中查询club表where条件是city,city值是$city
$cache = DI()->redis->get_Time('club'.'city'.$city,'clubcache');
//若是查询到了就直接返回缓存的结果
if($cache){
	return $cache;
}
//若是不存在从数据库里面获取结果真后存入redis缓存key的条件和取值时同样,最后一个参数为过时时间
$rs = $this->getORM()->select('*')->where('city',$city)->fetchAll();
DI()->redis->set_Time('club'.'city'.$city,$rs,'clubcache',600);

上面作的事情就是把结果保存600秒,600秒内的再次查询会获取同样的结果

##1.2 队列处理##

Redis运用到时间中有一个比较关键的做用就是他的队列

咱们先过一下几个特殊的redis函数

//写入队列左边
set_lPush
//写入队列左边 若是value已经存在,则不添加 
set_lPushx
//写入队列右边
set_rPush
//写入队列右边 若是value已经存在,则不添加
set_rPushx

//读取队列左边
get_lPop
//读取队列右边
get_rPop
//读取队列左边 若是没有读取到阻塞必定时间
get_blPop
//读取队列右边 若是没有读取到阻塞必定时间
get_brPop

好比咱们在作消息推送,发送邮件,发送短信这类业务的时候,咱们须要请求第三方接口,请求的速度是第三方来决定的,好比微信一个推送接口就是200ms,若是放到咱们的API业务里面就会出现一个巨大的问题,用户访问速度极度降低,解决这类问题的方案就是队列流程以下

当咱们接收到用户的推送请求时
			↓
把推送请求加入到队列API里面不作任何操做(好比加入到左边)
			↓
在后台有一个PHP脚本运行一直在读取队列(读取右边就是后进后出,若是读取左边就是先进先出)
			↓
而后执行响应的推送逻辑

通常咱们的脚本是一个死循环,或者shell定时请求,咱们会采用读取不到数据是阻塞来解决去不到值循环过快的问题

##1.3 临时数据存储##

临时数据就不须要太多的说明了,举个例子就够了

好比咱们获取验证码,咱们须要把验证码存到库中吗,我以为是没有必要的,并且数据库并很差作过时的操做只能咱们本身判断

那么咱们使用redis把验证码存入redis 而后给一个过时时间就很好的解决这个问题了

##1.4 数据库##

把redis做为数据库用算是比较深刻的使用了,这里聊下思想

你们以后service能够分布式,可是对于大部分数据库的分布式并不容易,因此致使了不少系统到后面拼接堆积在数据库,固然可使用缓存存储结果集,可是这种解决方便治标不治本,在和童鞋们探讨的时候得出了一个解决方便,就是把redis做为第一数据库mysql做为元数据库

作了这种操做以后服务器会自动把热数据同步到redis,把冷数据存放到mysql,当使用到冷数据了在存放到redis,用户大部分的操做基本是基于redis进行的操做

看成这样实现的成本比较高要实现redis 数据同步 封装使用 where查询 等等须要很大的精力去作,在后期笔者有打算作一个通用的拓展

##2. 规范化使用##

其实以上的类容已经讲的差很少了,为何还有单独拿出一段来说一讲规范呢,由于缓存不像是数据库当你须要去查看缓存的时候,若是全部的数据都堆积在redis的一个库,你会很是痛苦

可是redis支持多库因此须要一套规范来划分,这里分享一下我这边是如何使用的

0~10库 做为正常业务库,也就是推送队列,临时数据,每个库都只存储一种业务的数据,好比微信推送就存在5库,而邮件推送的数据就存在6库,发送验证码的临时数据存储在3库,一次类推,若是以为10个库还不够用能够根据业务增长

10库以上做为cache库用来存储每张表的结果集数据,或者是其他的数据

全部的key的命名规范必须带有类型+表名+条件

##3. 总结##

看了本小节以后相信你们都对缓存在时间开发中起到了什么样的做用有了个了解,这一小节的完成,咱们的进阶篇也步入尾声了,下一篇是对于进阶篇的总结了,也多谢你们一路的陪伴!

注:笔者能力有限有说的不对的地方但愿你们可以指出,也但愿多多交流!

官网QQ交流群:421032344 欢迎你们的加入!

相关文章
相关标签/搜索