redis安装
favor1有但是favor2没有的元素
favor2有但是favor1没有的元素
交集 :相同的元素相加输出
并集:不同的元素输出
redis客户端jedis
注意:3.0版本不能设置protected-mode no[3.0.7版本没有这个功能,建议使用3.2版本及以上]
拷贝三份【建立分布式的redis】
问号或者斜杆加下边的内容
package cn.tedu.user.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
/**
* 实现单个节点的连接底层对象
* 分布式的连接实现对象
* @author 在路上
*
*/
public class RedisJedisTest {
/*
* 使用jedis创建一个连接对象,操作6379
*/
@Test
public void connection(){
Jedis jedis=new Jedis("192.168.253.129",6379);
//jedis可以连接到192.168.253.129:6379
//redis-cli -h(host) 192.168.253.129 -p(port)6379
jedis.set("name", "王老师");
System.out.println(jedis.get("name"));
}
}
key值的计算逻辑【保证不同的用户的key值不一样,保证同一个用户登录时间不同key值也不一样】
jedis setex(ticket,60602,userJson)
返回使用过的ticket的值
控制层使用ticket 放到cookie中返回浏览器
usercontroller
//登录功能
@RequestMapping("login")
public SysResult doLogin(User user,HttpServletRequest request,HttpServletResponse response){
//通过业务层返回的数据ticket是否为空判断
//登录逻辑是否正常"" 正常值
String ticket=userService.doLogin(user);
if("".equals(ticket)){
//登录失败
return SysResult.build(201, "", null);
}else{
//ticket不为空,说明登录成功
//返回成功信息之前,要在cookie中定义一个携带ticket的key值
//的头信息 EM_TICKET
CookieUtils.setCookie(request, response, "EM_TICKET", ticket);
return SysResult.ok();
}
}
userservice层
public String doLogin(User user) {
//判断登录的权限检验select where user_name and password
//加密
user.setUserPassword(MD5Util.md5(user.getUserPassword()));
User exist=userMapper.selectUserByUserNameAndPassword(user);
String ticket="";
//判断对象是否存在
if(exist==null){
//登录失败
return ticket;
}else{
//登录成功
//生成ticket redis 的key,生成value userJson
//ticket生成公式:“EM_TICKET”+currentTime+userId
ticket="EM_TICKET"+System.currentTimeMillis()+exist.getUserId();
Jedis jedis=new Jedis("192.168.253.129", 6379);
try {
String userJson=MapperUtil.MP.writeValueAsString(exist);
//设置超时存储
jedis.setex(ticket, 60*60*2, userJson);
} catch (Exception e) {
e.printStackTrace();
return "";
}finally{
jedis.close();
}
//存储在redis,将ticket返回
return ticket;
}
}
windows启动eureka(以可以在eclipse启动)
eclipse启动user
usercontroller
//获取redis中的userJson
@RequestMapping("query/{ticket}")
public SysResult queryTicket(@PathVariable String ticket){
String userJson=userService.queryTicket(ticket);
if(userJson==null){//超过2个小时
return SysResult.build(201, "用户超时", null);
}else{
//登录状态可用
return SysResult.build(200, "登录状态可用", userJson);
}
}
userservice
public String queryTicket(String ticket) {
Jedis jedis=new Jedis("192.168.253.129", 6379);
try {
return jedis.get(ticket);
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
jedis.close();
}
}
测试:【注意:cookie跟着域名走】
windows启动eureka(也可以在eclipse启动),启动nginx
eclipse启动zuul、user
3.登录功能的业务逻辑缺陷
3.1登录能顶替?
顶替逻辑的数据结构
3.2登录突然超时
续约