Redis应用场景

Redis的应用场景

1 在购物车中的应用

 我们架构师是这么想的,因为项目会进行横向拓展,以后可能会涉及到多个系统之间服务的调用,我们项目采取的是分布式架构,所以我们购物车是单独的一个系统。

首先,我们购物车是从,商品详情页面进入的,当用户点击“加入购物车”按钮时,

购物车信息就会以表单的形式提交给后台,进行相关数据的处理。

我们是这么处理的,刚开始,我们先把它放在数据库里面,通过表来维护数据,客户必须登录,才能加入购物车。这样虽然操作简单,但是客户体验度很差,有时候客户更愿意把自己的购物车当成收藏中心。

我们就想实现用户在未登录情况下,能进行加入购物车。针对这个想法,我们采取了cookie来进行存储数据。用户在未登录的情况下,把购物车信息存放在cookie里面。登陆后,先判断cookie里面有没有商品信息。有的话和用户原来的购物车进行合并。然后清空cookie里面的信息。  

可是经过测试,在并发操作购物车时,发现响应速度很慢,这个原因主要是,mysql相当于在文件操作。它是经过i/o操作来把数据写在磁盘中,又源于mysql和购物车两个系统交互时我们是通过线程池来实现的,连接数是有限制的,所以有些客户响应就会很慢,甚至连接不到咱们的服务器(链接超时)。客户体验度依然很低,不能支持高并发访问。我们就使用了redis数据库,未登陆时,商品信息存放在cookie里面,登陆后,购物车存放在redis里面,我们采用String这种数据结构。用户的id作为key,购物车信息通过json工具类转换成json数组结构,放在value里面。同理,客户登录后,判断cookie进行合并。

再次进行测试,发现还有个问题,购物车里面商品种类少时,请求速度还好,商品种类很多时,发现前台请求明显变慢,客户加入购物车,修改购物车里面某个商品信息时,发现页面几乎都动不了。通过debug调试,发现后台是通过json工具类,把redis里面的数据通过反射转换成购物车对象的集合,循环遍历,再根据前台传过来的商品id进行equils比较直到找到对应的商品修改后,才返回响应结果。我们就改变了redis的数据结构,因为这里最大的问题就是没法直接定位商品,增大了程序的复杂程度。而redis的hash结构能很好的解决这个问题,hash结构的key是用户的id,filed是商品的id。Value是商品信息。这样当客户修改某个商品时我们就可以通过商品id和用户id直接定位到商品,就可以避免循环操作了。虽然多占了一些内存,但是极大地提高了响应速度。

最后我们也想过这个cookie的问题,因cookie的大小是有限制的,用户不能无限制的给cookie存放购物车信息,请求也会变慢。而且也不安全,很容易造成数据丢失。我的想法是,通过拦截器的方式,实现在未登陆时,把购物车信息也存放在redis里面。就是在点击“加入购物车时”,我们会先进入拦截器,判断当前cookie是否有值,没有的话,我们就会生成一个全局的uuid。存放在cookie里面,然后把它放在request作用域里,有的话,直接放在request作用域里面,放过。接着整合购物车时,先从作用域里面找到cookie去redis里面换取相对应的购物车信息,接着再通过用户id去获取登陆后的购物车信息。直接合并,最后要记住,清空cookie对应的redis信息,最后再清空客户端的cookie。

 

 

1.在用户没有登陆的情况下,在商品详情界面,点击“加入购物车”把商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。

 

此时,点击提交订单按钮,服务器进行拦截,让我们进行强制登陆,登陆成功后,用我们的用户名作为redis中的key,取对应的value,此时的value是我们要在购物车中展示的商品集合。同时从cookie中取我们刚才添加进去的商品。遍历这个集合,把集合中的元素id和cookie的商品id进行比较,若相同,数量+1,若没有相同的,则作为新商品融合进从redis中取出来的value中,融合完毕后,再把这一对key-value重新存入redis中,因为前后两次的key相同,所以会对原来的value进行覆盖,同时,将cookie中的数据清除。然后再展示到购物车列表。

 

2.如果先进行登陆,在登陆的同时,根据用户名取redis中的value,同时取cookie中的数据,如果有的话,进行上述的操作:比较id,相同的加数量,没有相同的,则作为新商品融合进从redis中取出来的value中,融合完毕后,再把这一对key-value重新存入redis中,因为前后两次的key相同,所以会对原来的value进行覆盖,同时,将cookie中的数据清除。此时,

在商品详情界面,点击“加入购物车”把商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息。把商品写入redis中,加入redis之前先从redis中用户名这个key把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。

2 redis在单点登录系统中的应用

单点登录系统(single sign on)sso 是目前比较流行的业务解决方案之一,我们在项目中使用单点登录系统主要是解决用户在一个系统中登录以后就可以访问所有信任的系统,而单点登录系统我们就是用redis+cookie来实现的,用户在单点登录系统登录以后,系统会将用户信息存放到redis中并且给客户端中一个token,这样任何一个需要登录的系统配置一个拦截器人后用提交的token去调取单点登录系统中的用户信息。

 

3 为了实现系统的高可用 redis需要做分片集群

3.1使用redis做缓存

 

3.1.1 redis的安装

Redis 在3.0版本以后才增加了redis集群功能,在安装集群之前需要一些前提条件

1先要安装gcc:yum install gcc-c++

2安装好以后需要下载redis的源码

3把下载好的源码包上传到linux服务器上(alt + p 或者直接拖拽 或者使用FileZilla)

4解压源码包tar -zxvf redis-3.0.0.tar.gz (z压缩格式x解压v显示进度f指定压缩文件)

5进入到解压后的文件夹redis 3.0.0 然后make编译

6 指定安装路劲make install PREFIX=/usr/local/redis

3.1.2redis的启动

1前端启动模式

/usr/local/redis/bin/redis-server

默认是前端启动模式,端口是6379

2后端启动模式

  1. 从redis的源码目录中复制redis.conf到redis的安装目录。

(# cp redis.conf /usr/local/redis/bin/)

  1. 修改配置文件

  1. [root@bogon bin]# ./redis-server redis.conf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值