Redis+MySQL模拟用户登录过程

题干

1.用户登录首先判断是否在redis缓存中,如果在缓存中,直接登录成功;
2.若用户未在redis缓存,则访问MySQL,判断用户是否存在,如果不存在,则提示用户注册;如果存在,则登录成功;
3. 在MySQL存在并登录成功的同时,将该条数据用hash类型进行缓存,并设置过期时间为30分钟;
为方便测试,没有实现用户数据的动态获取。

代码

1. 实体类Person

public class Person implements Serializable {
    private Integer id;
    private String name;
    private String password;
    //构造方法和setter、getter方法
    ...
}

2.1 数据库连接工具类

指路:数据库连接工具类

2.2 jedis工具类

public class RedisUtil{
    static Jedis jedis = new Jedis("127.0.0.1",6379);
    
	//用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计。
    public void expire(byte[] key, int seconds) {
        jedis.expire(key, seconds);
    }

	//用于查看哈希表的指定字段是否存在。
    public boolean isExists(final String key,final String field){
        return jedis.hexists(key,field);
    }

    public String hget(final String key,final String field){
        return jedis.hget(key, field);
    }

    public Long hset(final String key,final String field,final String value){
        return jedis.hset(key, field, value);
    }

}

3. dao层

负责访问数据库进行数据的操作,取出并封装对象之后返回给service层。

//dao层接口
public interface PersonDao {
    public void checkInSql(Person person);
}
//dao层接口实现类
public class PersonDaoImpl implements PersonDao {
    RedisUtil redis = new RedisUtil();

    @Override
    public void checkInSql(Person person) {
        ResultSet rs = null;
        //redis中是否存在该条数据
        boolean flag = redis.isExists("per_" + person.getId(), "per_name");
        if(flag){
        	//如果存在
            String per_name = redis.hget("per_" + person.getId(), "per_name");
            String per_pwd = redis.hget("per_" + person.getId(), "per_pwd");
            //判断信息是否匹配
            if(per_name.equals(person.getName())&&per_pwd.equals(person.getPassword())){
            	//表示该数据来自缓存
                System.out.println("welcome redis!   "+per_name);
            } else{
            	//用户信息不匹配
                System.out.println("用户名或密码错误");
            }
            
        }else{
        	//redis中用户信息不存在,从MySQL数据库中查找
            String sql = "select id,name,password from r_user where id=? and password=?;";
            //根据用户id和密码查找,返回结果集
            rs = DBUtil.executeSelect(sql, person.getId(), person.getPassword());
            try {
                if (rs.next()==false){
                    System.out.println("未查询到该用户数据");
                }else{
                    String name = rs.getString("name");
                    //登录成功
                    System.out.println("welcome sql!   "+name);
                    //将数据存储到redis中
                    redis.hset("per_"+person.getId(),"per_name",name);
                    redis.hset("per_"+person.getId(),"per_pwd",person.getPassword());
                    
                    //设置该条记录的过期时间为30分钟
                    redis.expire(("per_"+person.getId()).getBytes(),1800);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

4. service层

调用dao层方法,进行业务处理。

public class PersonService {
    private PersonDao personDao = new PersonDaoImpl();
    //调用dao层方法
    public void check(Person person){
        personDao.checkInSql(person);
    }
}

5. 测试类

新建Test类,通过main()方法测试。

//测试类,实现业务层方法
public class Test {
    public static void main(String[] args) {
        PersonService service = new PersonService();
        Person p = new Person(1001,"张三","123");
        service.check(p);
    }
}

6. 运行截图

MySQL数据库中的数据:
在这里插入图片描述
第一次查询,此时redis没有相关数据,数据是从MySQL中取出的。
在这里插入图片描述
第二次查询,此时数据已经被缓存进redis中,通过Redis Desktop Manager中查看。
在这里插入图片描述
结果表明此时数据是从redis缓存中取出。
在这里插入图片描述

参考

https://www.cnblogs.com/sharpest/p/6034664.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值