4.4 使用Redis优化登录模块



# 使用Redis优化登录模块

把访问频率比较高,会影响效率的功能使用Redis进行优化

使用Redis存储验证码

在这里插入图片描述

用户第一次访问登录界面,服务器生成随机字符串保存到cookie里,发送给浏览器,同时生成相应的key保存验证码文本到Redis里

  • 因为用户还未登录,所有无法获取用户信息,因此使用临时凭证作为key来存取信息;
  • 用户访问登录页面的时候,先给用户发一个cookie,存储随机生成的字符串,以此字符串作为临时凭证
  • cookie有效时间设置比较短来节省开销,设置为60秒即可;
  • Redis中验证码设置为60秒过期,节省开销;
// 登录验证码
public static String getKaptchaKey(String owner) {
    return PREFIX_KAPTCHA + SPLIT + owner;
}
//生成验证码key保存到cookie
String kaptchaOwner=CommunityUtil.generateUUID();
Cookie cookie=new Cookie("kaptchaOwner",kaptchaOwner);
cookie.setMaxAge(60);
cookie.setPath(contextPath);
httpServletResponse.addCookie(cookie);
//保存验证码到Redis
String redisKey= RedisKeyUtil.getKaptchaKey(kaptchaOwner);
redisTemplate.opsForValue().set(redisKey,text,60, TimeUnit.SECONDS);
 // 检查验证码
// String kaptcha = (String) session.getAttribute("KaptchaCode");
 String kaptcha=null;
 if(StringUtils.isNotBlank(kaptchaOwner))
 {
     String redisKey=RedisKeyUtil.getKaptchaKey(kaptchaOwner);
     kaptcha =(String) redisTemplate.opsForValue().get(redisKey);
 }

使用Redis存储登录凭证

// 登录的凭证
public static String getTicketKey(String ticket) {
    return PREFIX_TICKET + SPLIT + ticket;
}

把之前的LoginTicketMapper设置为不推荐使用

在这里插入图片描述

//使用Redis来存储登录凭证
String redisKey= RedisKeyUtil.getTicketKey(loginTicket.getTicket());
redisTemplate.opsForValue().set(redisKey,loginTicket);

退出的时候把登录凭证的状态设置为1,在重新放入Redis,没有直接删除,因为需要保存用户登录信息

//退出
public void logout(String ticket)
{
    //LoginTicket loginTicket = loginTicketMapper.selectLoginTicket(ticket);
    //System.out.println("退出时候的Expired"+loginTicket.getExpired());
    //loginTicketMapper.updateLoginTicket(ticket,1);
    //使用Redis来修改状态
    String redisKey= RedisKeyUtil.getTicketKey(ticket);
    LoginTicket loginTicket = (LoginTicket)redisTemplate.opsForValue().get(redisKey);
    loginTicket.setStatus(1);
    redisTemplate.opsForValue().set(redisKey,loginTicket);

}
public LoginTicket findLoginTicket(String ticket) {

    //return loginTicketMapper.selectLoginTicket(ticket);
    String redisKey= RedisKeyUtil.getTicketKey(ticket);
    LoginTicket loginTicket = (LoginTicket)redisTemplate.opsForValue().get(redisKey);
    return loginTicket;
}

使用Redis缓存用户信息

1、当查询的时候,优先从缓存中取值;

2、缓存中取不到的时候初始化缓存数据;

3、数据变更时清除缓存数据(如果采取更新缓存中数据的方法可能会带来并发问题,并且比较繁琐);

直接存取user对象,会序列化成Json字符串

 private static final String PREFIX_USER = "user";
// 用户
public static String getUserKey(int userId) {
    return PREFIX_USER + SPLIT + userId;
}
//1、当查询的时候,优先从缓存中取值;
private User getCache(int userId)
{
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    return  (User)redisTemplate.opsForValue().get(redisKey);

}

//2、缓存中取不到的时候初始化缓存数据;
private User initCache(int userId)
{
    User user=userMapper.queryById(userId);
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    redisTemplate.opsForValue().set(redisKey,user,3600, TimeUnit.SECONDS);
    return user;
}

//3、数据变更时清除缓存数据(如果采取更新缓存中数据的方法可能会带来并发问题,并且比较繁琐);
private void clearCache(int userId)
{
    String redisKey=RedisKeyUtil.getUserLikeKey(userId);
    redisTemplate.delete(redisKey);
}
public User queryUserById(int userId) {
    //return userMapper.queryById(userId);
    User user=getCache(userId);
    if(user==null)
    {
        user=initCache(userId);
    }
    return  user;
}

在更新数据的地方清理缓存

//更新头像路径
public int updateHeader(int id,String header_url)
{
    //return userMapper.UpdateHeader(id,header_url);
    int rows=userMapper.UpdateHeader(id,header_url);
    clearCache(id);
    return rows;
}
  //修改密码  这里传入的password应该为加密后的
    public int updatePassword(int id,String password)
    {
        int rows= userMapper.UpdatePassword(id,password);
        clearCache(id);
        return rows;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis的search模块Redis中一个功能强大的搜索引擎插件,它提供了全文搜索和模糊搜索等功能。它可以用于在Redis数据库中快速查询和过滤数据,提供更高效的数据检索和搜索体验。 使用Redis的search模块,首先需要在Redis服务器上安装并配置search插件。安装完成后,我们可以通过使用search模块提供的指令来创建、配置和管理全文索引。 首先,我们需要创建一个索引,并指定索引的字段和分词器。分词器用于将索引的字段拆分成单词,以便进行更高效的搜索。然后,我们可以通过添加文档来建立索引,文档是搜索的最小单位,可以理解为数据库中的一条数据记录。 一旦索引创建完成并添加了文档,我们就可以使用search模块提供的指令进行搜索。可以根据关键词进行全文搜索或模糊搜索,search模块会返回匹配的文档列表,并按照相关性进行排序。 此外,search模块还提供了过滤和排序的功能。我们可以通过设置过滤条件来快速查询符合特定条件的文档,也可以指定排序规则来调整搜索结果的顺序。 总的来说,Redis的search模块是一个非常实用的工具,它可以帮助我们在Redis数据库中进行快速而高效的搜索和检索操作。无论是全文搜索还是模糊搜索,search模块都能提供优秀的搜索性能和灵活的搜索配置选项,使得Redis数据库的搜索功能更加强大和易用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值