1
互联网发展以及影响
中国互联网已经形成规模,互联网应用走向多元化。互联网越来越深刻地改变着学习、工作以及生活方式,甚至影响着整个社会进程。
互联网对于各行业的深刻影响,以天猫为例,从2009年以来,11月11日这个日子在中国互联网界甚至整个中国社会,都被赋予了新的意义。2012年11月11日,淘宝和天猫举行了网上购物狂欢,从凌晨零点开始,天猫商城在1分钟内涌入超过千万用户,中午13点时销售额已经突破百亿,当天共有2.13亿用户参与,创下了当日191亿元销售额的历史纪录;去年,更是达到了令人无法想象的912亿销售额。
互联网发展的同时,也引领着相关技术的发展与变革。比如:集群、高并发、负载均衡、高可用、海量数据的处理、系统安全、分布式缓存等各方面的相关技术。这里我们谈谈分布式缓存技术。
2
分布式缓存介绍
分布式缓存是为了解决数据库服务器和web服务器之间的瓶颈。如果一个网站的流量很大,这个瓶颈将会非常明显,每次数据库查询耗费的时间将不容乐观。对于更新速度不是很快的网站,我们可以用静态化来避免过多的数据库查询,比如可以使用Freemarker或者Velocity来实现页面静态化。对于更新数据以秒级的网站,静态化也不会太理想,可以通过分布式缓存系统来解决,比如:Redis、MEMCache、SSDB等。
分布式缓存系统出现的原因:
1、在互联网或者电商应用系统中,业务需求复杂,必须对整个的业务系统进行垂直拆分,保证各个业务模块清晰并且对外提供服务;
2、用户的群体广泛,就必然存在着高并发的问题,如果将应用系统部署在单个节点服务器上,势必会对单个服务器造成巨大的访问压力,因此我们需要将应用系统部署到不同的节点上,同时我们也要将不同的数据分散到不同的节点上;
3、互联网时代,即大数据时代,数据为王。马云曾经在一次演讲中说道:“人类正从IT时代走向DT时代”。正是因为数据量大,我们才要对数据进行分布式处理。
既然上面提到了数据,那我就会想到数据库,目前主流的数据库存储方案无非分为两个方向:关系型数据库,例如:Oracle、MySQL、DB2、MSSQL;非关系型数据库,例如:MongoDB、HBase、Redis、LevelDB、CouchDB等。
关系型数据库和非关系型数据库的区别,如下图:
在web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。Redis就是一个高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。下图就是一个简单的分布式缓存系统。在用户第一次发送请求时,从RDBMS中获取数据并返回,同时将该数据保存分布式缓存系统中;当用户再次发送请求时直接从缓存中获取,提高性能。同时我们这里的Redis做集群并且做主从策略,实现高可用架构。下图就是一个简单的分布式缓存系统:
3
分布式缓存产品介绍
3.1 主流产品介绍
在实际开方中,我们经常使用的分布式缓存系统主要有Redis、MemCache、SSDB。这三者都是k-v存储方案,各自都会有优缺点,但是Redis的使用较其他产品更为广泛。Redis特点突出,支持多种数据类型,如String、Hash、Set、List、StoredSet,并且有高可用的解决方案和集群方案,支持水平扩容。也就是说满足大部分企业的需求,MemCache、SSDB相对解决方案不算那么完善。
3.2 redis与MemCache区别
1) redis只使用单核,而MemCache使用多核;即 redis属于单线程操作,而MEMCache属于多线程操作。也就是说在多个用户同时请求时,Redis是处理完一个请求后在处理另一请求,而MemCache可以同时处理多个请求。
2) 数据结构:redis不仅仅支持简单的k/v类型的数据,同时还提供list、set、hash等数据结构的存储。
3) 数据安全性:Redis和MEMCache都是将数据存储在内存中,都属于内存数据库。MEMCache服务宕机或重启后,数据不可恢复;Redis服务宕机或重启后可以恢复,因为Redis可以做持久化,将内存数据定期保存到磁盘中,而且提供了两种持久策略,默认支持的是RDM持久化,还有需要手动开启的AOF持久化。而MemCache仅仅将数据存储在内存中。
4) 数据备份:Redis支持数据备份,即需要开启master-slave策略。
5)过期策略:memcache在set时就指定了过期时间;而redis可以通过expire设定key的过期时间
6) 内存回收:memcache有内存回收机制,就是当程序里给它设定的内存大小,一旦存储的数据超过该分配的内存大小的时候,就会去自动回收,也就是释放,不然就会出现内存溢出的情况,因为memcache的数据都是存储在内存中的,但是redis不会,因为redis可以将数据持久化到磁盘上。
3.3 redis与SSDB的区别
SSDB是基于Google性能极高的LevelDB作为存储引擎去架构的,特性与Redis基本一致,而且与Redis可以完美整合。它可以完全替换Redis,而且与Redis的API兼容,支持Redis的客户端,即redis-cli的所有操作在SSDB中同样适用。由于SSDB高性能的写特性,所以很多时候我们可以通过Redis+SSDB实现分布式缓存的策略。即:使用SSDB写(存储)特性,使用Redis读特性。
4
redis介绍
Redis是一个开源的,面向“键/值”(Key/Value)对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。因此,可以说Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且还提供了多种语言的API。缺点同样也很明显,对事务的处理很弱,也无法做到太复杂的关系型数据库中的模型。Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。
与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步(数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。)。因此,Redis的出现,很大程度补偿了Memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
5
Redis在项目中的应用
5.1 新巴巴运动网介绍
新巴巴运动网是传智播客javaEE课程体系中的一个实战项目。该网站是一个综合性的B2C平台,类似京东商城、天猫商城。会员可以在商城浏览商品、下订单,以及参加各种活动。管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。客服可以在后台管理系统中处理用户的询问以及投诉。
分布式缓存技术在项目中该如何应用呢?那么在新巴巴运动网中有多处应用场景。在该网站中,我们使用比较流行的Redis作为我们的分布式缓存系统的。并且对Redis做了集群部署。我们项目中有多个场景中使用到了Redis,这里我们只列举两个分别是:缓存用户的信息和缓存用户的购物车信息。
5.2 缓存用户信息
5.2.1 设计思路
一、目的
在公司里,一般有很多业务系统,在访问这些业务系统时如果每次都需要登录将是一件很无趣的的事情,因此在这一堆的业务系统中,之需要用户的登录一个系统即可,再次访问其他系统时,无需登录,也就是我们经常讲到的SSO(单点登录)。通过将用户信息保存到Redis中,实现单点登录。
二、最初方案
用户名保存到当前服务器分析:
1、当用户访问业务系统A的某些资源时,需要判断用户是否登录,如果用户未登录需要将提示用户登录,并且将用户信息保存到A服务器上;
2、如果当用户访问业务系统B的某些资源时,同样需要判断用户是否登录,如果用户未登录需要将提示用户登录,并且将用户信息保存到B服务器上;
3、同理,用户访问业务系统C时,也需要用户登录;
综上,每次访问就需要登录一次,那么在每台服务器上都需要保存一份用户信息,如果有100台机器,那么该100台机器都有用户信息;如果有十万用户的访问量呢,每个机器都有10万个相同的用户信息,明显是一种资源的浪费。
经过分析:将用户信息保存到当前服务器明显是不合适的:1、用户体验差;2、资源浪费
三、优化后方案
将用户信息保存到分布式缓存系统Redis中,实现在各个业务系统一次登录,到处使用。
1、 用户在访问任何业务系统时,首先判断分布式缓存系统中是否有用户信息,如果没有则登录并且将登录信息保存到该分布式缓存系统中;
2、 当用户在访问其他的业务系统时,同理判读分布式缓存系统中是否有用户登录信息,如果有则无需再次登录。
综上:解决了用户体验差而且减少了资源的浪费。
四、按照我们的设计思路,用户信息应该在Redis中的存储结果
5.2.2 部分核心代码
5.3 缓存购物车信息
5.3.1 设计思路
购物车实现的思路分析:分为登录和为登录两种状态。
1、 用户未登录,我们将购物车信息保存到本地的Cookie中;
2、 当用户登录时,我们将本地的Cookie中购物车同步到Redis中,这样实现了跨机访问。
3、 按照我们的分析,购物车信息在Redis中存储的结果如下图:
5.3.2 部分核心代码
关于:中科研拓
深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供很好的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com