Springboot实现Redis登录

发布于 2021-04-10  574 次阅读


实现了Springboot+Redis的登录注册,特此记录

 

出现情景:最初实现登录是从数据库中取出信息进行对比,这种方式需要大量访问数据库,IO操作频繁,效率低下;
改善策略:使用Redis写入缓存进行登录/注册,如果不存在数据就先去查数据库,把当前用户的验证信息写入缓存

 

实现流程:

首先创建实体类User,用于进行身份验证(User)

User

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}

创建Mapper接口,执行对数据库的操作
这里只写了从数据库中得到User信息的Mapper
UserMapper
//@Mapper这个注解表示了这是一个mybatis的mapper类
//@Repository表示其为Dao层(@Component万能)的Bean
@Mapper
@Repository
public interface UserMapper {

    //拿到用户信息
    List<User> queryUserList();
}

创建Mapper.xml实现Mapper接口

UserMapper.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定命名空间-->
<mapper namespace="com.yang.RedisMapper.UserMapper">

    <select id="queryUserList" resultType="User">
        select * from redisname
    </select>
</mapper>

至此从数据库中获取信息就完成了
接下来我们要将其写入缓存,这样才能实现用户登录的时候直接去缓存进行验证对比,而不是去数据库,提高效率,节省资源;
IsRedisNULL
//缓存中无数据,去数据库取
@Slf4j
@Service
public class IsRedisNUll {
    //注入Mapper

    @Autowired
    UserMapper userMapper;
    //注入redis实现
    @Autowired
    RedisTemplate redisTemplate;
    public void getFromSQL() {
        //得到数据库中的数据
        List<User> usersLoginMessage = userMapper.queryUserList();
        //写入
        for (User user : usersLoginMessage) {
            //创建用户Id表
            redisTemplate.opsForSet().add("UserId", user.getId());
            //创建Id和密码对应的键值对
            redisTemplate.opsForValue().set(user.getId(),user.getPwd());
        }
        //得到其长度:存进缓存的用户数量
        System.out.println("存进缓存的用户数量为:"+redisTemplate.opsForSet().size("UserId"));
        System.out.println("缓存中的元素为:"+redisTemplate.opsForSet().members("UserId"));
    }
}

用户登录信息已经写入缓存,接下来模拟用户登录验证
首先判断缓存中是否有该用户,没有的话提示用户名不存在(此处可添加注册操作)
NptRedisNULL
@Slf4j
@Service
public class NotRedisNull {

    //注入redis实现
    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    UserMapper userMapper;
    //缓存中有数据
    public void isNotRedisNull(String scan_id, String scan_pwd) {
        int id = Integer.parseInt(scan_id);
        //判断缓存Id表里面有无改用户
        //对比密码是否正确
        System.out.println("====================");
        Boolean member = redisTemplate.opsForSet().isMember("UserId", id);
        if(member == true) {
            System.out.println("该用户是缓存中的元素");
            Object pwd = redisTemplate.opsForValue().get(id);
            if(pwd.equals(scan_pwd)) System.out.println("验证成功,恭喜您登录");
            else System.out.println("密码错误!");
        }
        else{
            System.out.println("用户名不存在!");
        }
    }
}

最后一步,编写测试类:
ApplicationTests

@SpringBootTest
class ApplicationTests {

   @Autowired
    IsRedisNUll isRedisNUll;

   @Autowired
    NotRedisNull notRedisNull;

   @Test
   void contextLoads() {
      //获取数据库中的用户信息并写入
      isRedisNUll.getFromSQL();
      System.out.println("写入成功");
      //模拟从前端得到用户输入的数据,使之与缓存中的数据进行比对
      notRedisNull.isNotRedisNull("2","222");
   }
}

结果分析:
2号用户的账号密码都在数据库中存在且正确,那么接下来模拟2号用户密码错误
模拟该用户不存在的常见

至此使用Redis提高登录模块功能完成

项目实践:
如果Redis里面不存在该用户名,则直接拦截,避免缓存击穿,这里不需要布隆过滤器;


她喜欢所以就做咯