phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)-阿里云开发者社区

开发者社区> 喵了个咪_> 正文

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

简介:
+关注继续查看

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

前言

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

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

附上:

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

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

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

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. 总结

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java笔记——Redis分布式锁解决方案
我们知道分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、Redis的setnx()命令、Zookeeper(在某个持久节点添加临时有序节点,判断当前节点是否是序列中最小的节点,如果不是则监听比当前节点还要小的节点。
1203 0
使用LRU算法缓存图片,android 3.0
在您的UI中显示单个图片是非常简单的,如果您需要一次显示很多图片就有点复杂了。在很多情况下 (例如使用 ListView, GridView 或者 ViewPager控件), 显示在屏幕上的图片以及即将显示在屏幕上的图片数量是非常大的(例如在图库中浏览大量图片)。 在这些控件中,当一个子控件不显示的时候,系统会重用该控件来循环显示 以便减少对内存的消耗。同时垃圾回收机制还会
1008 0
fbh
Chrome浏览器强制刷新页面(不使用缓存)
在Chrome浏览器中按下F5或 Ctrl+F5 都没用,Chrome总是会强制使用页面缓存进行刷新,如何不使用页面缓存进行刷新? Chrome官方推荐使用如下快捷键,就可以不使用页面缓存进行刷新 Windows和Linu...
3645 0
大量使用临时表带来的问题,替代方案,以及如何擦屁股
以前有使用Greenplum的朋友遇到元表膨胀的问题,总结了原因写了一篇文章如下。建议先阅读这篇文档,再阅读本文,里面有些原理我在本文就不讲了。http://blog.163.com/digoal@126/blog/static/1638770402014616113353555 近日,又有使用P
5679 0
Redis介绍使用及进阶
Redis介绍使用及进阶目录: 一、介绍 二、缓存问题 三、Redis内存滥用 四、键命名规范 五、Redis使用场景 六、持久化操作 七、.Net Core 使用redis 简单介绍 一、介绍 1、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距...
974 0
Spring Cloud进阶篇之Eureka原理分析
Spring cloud Eureka 原理介绍
1311 0
+关注
喵了个咪_
后端程序员,开源PHP框架PhalApi核心开发者,编写录制phalapi教程,phalcon爱好者编写phalcon教程以及zephir文档翻译,热爱交流沟通,喜欢go语言,欢迎大家一起交流沟通,探讨技术,座右铭:代码即真理,你的真理是什么呢?
166
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载