缓存,消息队列

Posted 麟工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存,消息队列相关的知识,希望对你有一定的参考价值。

在这篇推文出来之前,我是基于上一篇推文继续写的,有一定技术的延续性,当然也和大家分享一下我最近的成果

那么我们今天还是基于上次提出的那些问题做更深一步的了解吧

同时期待大家指出我的错误观点的地方,这样有利于更好的与大家技术交流


一、SESSION真的合适?

对于session最好的解释就是,存储在服务器的客户端内存空间,如果理解jdbc连接数据库的方式的朋友应该都知道,session其实可以看成是一个客户端与这台服务器连接所开出的内存空间,了解socket编程的人应该都知道,B/S架构是基于HTTP协议的,而HTTP协议本身就是socket上的协议封装,所以本质还是socket(如果不能理解的朋友可以效仿我这种方式,我曾在学校的教室里面试过,写一个socket服务器监听,让后让浏览器请求访问我监听的端口,你会发现你会收到一个字符串,分为头部和内容体部分)我为什么要说这个呢?因为当大量的反复的socket创建请求,以及一些重复HTTP参数的传递会占用大量的带宽,这样会降低通信的效率,那么如果我只连接一次,让服务器记住这个用户的通信的话,这样我可以节省很多不必要的通信内容。因为这个所以产生了session,这就是最典型客户浏览器->服务器模式

那么我今天要说的是这个吗?当然不是,这里只是一个抛砖引玉

当人们发现session是可以独有的,每个浏览器访问都有独一无二的session后,就开始往session里面存放东西了,比如你用于登陆验证的账号密码,你的传递的参数,你的需要长时间保存的东西等等。。。。。这样下去你的session也会越来越大,如果这个时候你的服务器要经历大量的请求访问,会不停的开辟你的内存空间直到你的内存开辟的一点不剩,这样服务器就瘫痪了,而且尤其是在今天的restfu api提供的时代,大量的Ajax交互分分钟能炸你的服务器,而且还有一个问题我之前也提到过,对!就是负载均衡

因为服务器和服务器直接的session不是共享的所以这也是制约的原因之一,如果你在上大学经历过学校的抢课现象,你应该能理解服务器奔溃是什么样的感觉(尤其是方正教务系统,使用ASP.net技术栈)

所以人们的第一步目标是,摆脱session的依赖,把战场转移到别的地方去



二、redis隆重登场

 鸟儿没了羽毛还剩什么?当WEB摆脱session还剩什么?摆脱了session依赖的web几乎无力,于是人们开始寻求新的方式,能有什么东西可以和session一样在内存里面并且能支持key-value键值对存储,还能横向拓展呢?

Redis就这样走进大家的视野里面,Rdies无疑是最好的选择之一,基于内存的键值对存储,支持集群,而且有很高的安全性,以及稳定,于是使用redis的方式就这样出现了(详情可以了解我的上一篇技术文:?)

redis让大量的工作变的简易起来,而且让服务器有越来越多的内存空间提供业务服务,以及准确的服务器,但是我们只能算是优化了服务器,并没有从源头解决服务器奔溃的问题,如果服务器这时候接触到更大的请求量,还是一样会奔溃的,那么如果我从源头上限制呢?我给一个极限,如果请求量超出这个极限我把这些请求都抛弃,不处理,这样能保证服务器的安全稳定,不会奔溃



三、救星消息队列

不知道大家学习数据结构的时候是否想起这个数据结构:队列,队列的特点是先进先出,后进后出,而且队列是有长度限制的,当队列超过长度之后,就无法入队

如果我们把每个用户请求放入到消息队列里面,设置一个合理的MAX值,那么当队列的满的时候,抛弃所有请求这样就能保护服务器了,当然这个只是消息队列的冰山一角,消息队列还提供订阅的模式方式这些新的方式能让你业务更加强悍。

未完待续。。。。。。


以上是关于缓存,消息队列的主要内容,如果未能解决你的问题,请参考以下文章

面试官心理分析+面试题剖析:消息队列+Redis 缓存+分布式系统等

第十一篇:消息队列缓存

12. Redis中的消息队列

缓存,队列(Redis,RabbitMQ)

接收订单用redis做缓存好还是rabbit做消息队列好

谈谈消息队列