题干
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缓存中取出。