赞
踩
目录
目录
(一)你说你用了redis缓存,你redis存的是什么格式的数据,是怎么存的
(二)redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?
商城项目是一个b2c项目,基于高并发、海量数据环境进行实现。 是一个分布式项目,分为前后台两套系统实现,前台系统使用Redis实现缓存数据查询,包含首页服务,单点登录服务、购物车服务等。 后台系统包括商品管理,订单管理、权限管理等,主要使用的技术包括spring boot、spring mvc、mybatis plus、rabbitmq、redis等技术实现。
单点登录(Single Sign On),简称SSO. 用户只需要登陆一次就可以访问所有相互信任的应用系统
当⽤户第⼀次访问淘宝的时候,因为还没有登录,会被引导到认证中⼼进⾏登录。
根据⽤户提供的登录信息,认证系统进⾏身份验证,如果通过,则登录成功,并返回给⽤户⼀个认证的凭据(JWT token)。
当⽤户访问天猫时,就会将这个 JWT token 带上,作为⾃⼰认证的凭据。
应⽤系统接收到请求后会把 JWT token 送到认证中⼼进⾏校验。
如果通过校验,⽤户就可以在不⽤再次登录的情况下访问天猫了。
补充:token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 token 给前端。前端可以在每次请求的时候带上 token 证明自己的合法地位。如果这个 token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。
1、token
token是什么: token是按照一定规则生成字符串,字符串可以包含用户信息等
比如: ip#用户名#用户信息 把他们经过加密,得到的字符串。这是一般存储的字符串
用法:
在项目某个模块登陆,登陆后,按照规则生成字符串,把登录之后的信息包含到生成的字符串中,把字符串经过一系列处理(编码+加密),得到它。
把字符串通过cookie返回
再去访问其他模块,在地址栏都带着字符串,在访问模块里面获取到地址栏字符串。
根据字符串获取里面的用户信息,如果可以在cookie中获取到就是登陆成功
2、cookie+ redis实现
在项目的任何一个模块进行登录,登录之后,把数据放到两个地方
redis:在key中:唯一的随机值,在value中:用户数据
cookie:把redis里面生成key的值放到cookie中
访问项目中的其他模块是,发送请求带着cookie进行发送,获取cookie值,拿着cookie做事情
把cookie获取值,到redis进行查询,根据key进行查询,如果查询出来数据就是登陆
1:首先用户输入账号密码登录后在数据库进行对比
2:账号密码错误重新登录,账号密码正确则进行下一步
3:cookie在同一个浏览器中是共享的,在用户登录成功之后,我们使用加密算法进行加密混淆形成一个token存入cookoie中,键为自定义标识字段(比如userSSH),值为token(不要在cookie中存储重要信息,容易被破解,所以在这里我们存入token,这个token就是验证用户信息的媒介)
4:cookie已经形成了,这时候用到了redis,就好比一个验证用户中心数据库一样,我们将形成的cookie的值,就是这个token存入redis中,键为token,值为用户的信息,并设置过期销毁的时间
5:在这里我们已经形成了cookie和redis用户信息,用户使用其他域名访问的时候,首先验证是否有userSSH这个cookie,如果没有,则引导至登录界面
6:如果有这个cookie,则把这个cookie的值token取出,用这个凭证去和redis中的信息对比,凭证生效,用户可以正常操作,并刷新redis中该数据的过期时间,凭证无效,则引导至登录界面
7:至此,redis+cookie实现的单点登录算是完成了,但在实际应用中一定远远比这个复杂,尤其是安全考虑方面
1)cookie机制采用的是在客户端保持 HTTP 状态信息的方案。当浏览器访问WEB服务器的某个资源时,WEB服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件可理解为cookie域(键值对的集合),往后每次访问某个网站时,都会在请求头中带着这个网站的所有cookie值。(至于怎么区分不同网站的cookie的,很简单,每个网站都给他一个唯一标识比如网址等,每次打开某网址时,就查询该网站下的所有cookie值即可。)
2)每一个cookie都有一个name和一个value,且name是唯一的。相同名字时,后者会覆盖掉前者(类似哈希表的key的效果)。
3)一个WEB浏览器也可以存储多个WEB站点提供的Cookie。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果禁用cookie可以使用url中带参数,把token传递给服务端。当然此方法涉及安全性问题,其实在cookie中保存token同样存在安全性问题。推荐使用sso框架CAS实现单点登录。
用户登录后需要在Cookie中保存用户的id。当用户登录时,从当前所有的Cookie中判断是否有此用户id的存在,如果存在的话就把保存此用户id的Cookie销毁。
登录的测试用例设计点汇总
服务端
验证码是否正确 (对应时间戳是否过期)
账户是否存在 (未注册、已注销)
密码是否正确 (记录连续输入错误次数,超过5次,账号锁定4小时。或提升验证等级,采取账号+密码+验证码+短信验证)
返回session、token
功能性用例设计点:
页面测试:
登录页面显示是否正常?文字和图片能否正常显示,相应的提示信息是否正确,按钮的设置和排列是否正常,页面是否简洁壮观等。
页面默认焦点是否定位在用户名的输入框中
首次登录时相应的输入框是否为空?或者如果有默认文案,当点击输入框时默认方案是否消失?
相应的按钮如登录、重置等,是否可用;页面的前进、后退、刷新按钮是否可用?
快捷键Tab,Esc,Enter 等,能否控制使用
兼容性测试:不同浏览器,不同操作系统,不同分辨率下界面是否正常
兼容性测试用例设计点:
安全性测试用例设计点:
性能压力测试的用例设计点:
- 单用户登录系统的响应时间是否符合"3-5-8"原则
- 用户数在临界点时并发登录是否还能符合"3-5-8"原则
- 压力:大量并发用户登录,系统的响应时间是多少?系统会出现宕机、内存泄露、cpu饱和、无法登录吗?
- 稳定性:系统能否处理并发用户数在临界点以内连续登录N个时的场景?
其它测试:
连续输入3次或以上错误密码,是否被锁一定时间(如:15分钟)或者冻结账户?时间内不允许登录,超出时间点是否可以继续登录。
用户session过期后,重新登录是否还能重新返回这前session过期的页面?
用户名和密码输入框是否支持键盘快捷键?如:撤销、复制、粘贴等等
是否允许同名用户同时登录进行操作?考虑web和app同时登录
手机登录时,是否先判断网络可用?
手机登录时,是否先判断app存在新版本?
是否支持单点登录?
是否有埋点接口
把商品添加到购物车(订购)
删除购物车中已订购的商品、
修改购物车中某一商品的订购数量
清空购物车
显示购物车中商品的清单及数量、价格
一个用户对应一个购物车,一个用户不管买多少商品,都会存在属于自己的购物车中,单点登录一定要在购物车之前。用户添加购物车,登录状态会存放在Redis缓存中
当用户点击购物车跳转的时候判断用户是否没有登录的话就跳转到登录页面
当用户登录之后他得用户信息就会被保存下来,我们就可以将用户的username(单点登录的时候将用户对象封装到字符串中放到redis中)取出来(将封装的用户的字符串转换 成对象)作为redis的key,商品的信息作为value存放在redis中。
1、购物车第一步先判断cookie传递过来的值car+取出的redis里面的存储的字符串转化的对象的username(username唯一)
2、然后判断redis是否存在
3、如果不存在的话就创建一个购物车存放在redis中 key为car+username
4、不能用car+uuid因为每次登陆uuid是会变化的所以用不变的就是username
5、获取用户的名字
- //判断是否有购物车
-
- if(dao.exists(key))
-
- {
-
- //若果存在的话 判断集合中是否存在该商品
-
- String redisResult = dao.get(key);
-
- List list = JsonUtils.jsonToList(redisResult, TbItemImages.class);
-
- boolean isExist = false;
- //如果购物车存在但是id不存在就重新添加一个并重新set进去
- //没有key表示没有购物车 将购物车装到redis中
- //查询购物车中的商品 利用tttoken获得redis里面的对象在获得其username
在用户加入购物车的时候,我们需要先看一下 当前商品和规格 在redis里面是否已经存在 如果存在 就直接在数量上面加减 不存在的就直接加入就可以了
- <%@page import="com.ys.cart.entity.Cart"%>
- <%@page import="com.ys.cart.entity.Goods"%>
- <%@page import="com.ys.cart.biz.impl.GoodsBizImpl"%>
- <%@page import="java.util.ArrayList"%>
- <%@page import="java.util.List"%>
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!-- 加入购物车的do处理页面 -->
-
- <!--
- 购物车流程:
- 1.Goods---显示商品信息
- 2.Cart ---购物车中的信息
- 加入购物车 不是将Goods进行存储 而是存储的是Cart实体
- -->
- <%
- //将点击的商品存储到购物车容器中(session)
-
- //设置编码
- request.setCharacterEncoding("utf-8");
- //获取商品编号
- String id = request.getParameter("gid");
- int gid = 0;
- if (null != id) {
- gid = Integer.valueOf(id);
- }
-
- //拿到cid 根据cid获取商品的其它信息
- Goods goods = new GoodsBizImpl().getGoodsByCid(gid);
- //数量默认一件
- //总价格 商品的单价 * 数量(1件)
-
- //将上面获取的信息封装到Cart实体中
- Cart cart = new Cart();
- cart.setGoods(goods);
- cart.setCcount(1);
- cart.setCtotal();
-
- //1.获取购物车
- List<Cart> listCarts = (List<Cart>) session.getAttribute("listCarts");
- //2.判断非空
- boolean flag = true;
- if (null == listCarts) {//说明用户时第一次将商品加入购物车
- //创建购物车
- listCarts = new ArrayList<Cart>();
- } else {//否则 购物车中存在商品
- //遍历所有的购物车中的商品 看该购物车中是否存在刚才点击的cart实体封装
- for (Cart c : listCarts) {
- //判断传递的cid与当前listCarts中的每一个cid进行匹配
- if (gid == c.getGoods().getGid()) {//说明购物车中存在该商品
- flag = false;
- //修改数量
- c.setCcount(c.getCcount() + 1);
- //修改总价格
- c.setCtotal();
- }
- }
- }
- //判断flag标记
- if (flag == true) {//说明购物车中没有该商品
- listCarts.add(cart);
- }
-
- //重新保存购物车
- session.setAttribute("listCarts", listCarts);
-
- response.sendRedirect("cart.jsp");
- %>
购物车设计测试用例----必背_Aimin2020.的博客-CSDN博客_购物车测试用例
redis中存储的都是key-value格式的。拿商品数据来说,key就是商品id,value是商品相关信息的json数据。
1.Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。并且redis的所有的数据都是放到内存中,存取的速度非常快,一般都是用来做缓存使用。
2.项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。
3.在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号。
https://blog.csdn.net/m0_48795607/article/details/115642129
采用AMQP高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。
rabbitmq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用rabbitmq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给rabbitmq。rabbitmq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者。
Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。
异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。
应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。
流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。
日志处理 - 解决大量日志传输。
消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。