【Redis高手修炼之路】案例——异步加载所有联系人

  • 个人主页: 陶然同学
  • 版权: 本文由【陶然同学】原创、在CSDN首发、需要转载请联系博主
  • 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
  •  想寻找共同成长的小伙伴,请点击【Java全栈开发社区

目录

1.案例需求与效果

2.项目分析

3.准备数据

        3.1复制原型目录web目录下

        3.2表数据

        3.3导入的包

        3.4实体类

        3.5工具类和配置文件

        3.6Jedis工具类和配置文件

4.项目结构

5.源代码


1.案例需求与效果

  1. 案例需求与效果:

访问index.html页面,点击页面上的加载所有联系人按钮,才使用ajax请求异步加载所有联系人列表。用户第一次访问从数据库中获取数据,以后都从redis缓存里面获取。

  1. 执行效果

【Redis高手修炼之路】案例——异步加载所有联系人_第1张图片

服务器控制器信息

【Redis高手修炼之路】案例——异步加载所有联系人_第2张图片

MySQL中的数据

 【Redis高手修炼之路】案例——异步加载所有联系人_第3张图片

Redis中数据

 【Redis高手修炼之路】案例——异步加载所有联系人_第4张图片

2.项目分析

【Redis高手修炼之路】案例——异步加载所有联系人_第5张图片

3.准备数据

        3.1复制原型目录web目录下

【Redis高手修炼之路】案例——异步加载所有联系人_第6张图片

        3.2表数据

-- 联系人
create table contact (
   id int primary key auto_increment,
   name varchar(20) not null,  -- 姓名
   phone varchar(20),  -- 电话
   email varchar(50),  -- 邮箱
   birthday date  -- 生日
);

insert into contact (name,phone,email,birthday) values
('孙悟空','13423431234','[email protected]', '1993-11-23'),
('猪八戒','13525678909','[email protected]', '1953-05-02'),
('白骨精','18642343123','[email protected]', '1943-03-12');

select * from contact;

        3.3导入的包

        3.4实体类

package com.itheima.entity;

import java.sql.Date;

/**
 * 联系人实体类
 */
public class Contact {

    private int id;  //编号
    private String name;  //姓名
    private String phone;  //电话
    private String email;  //邮箱
    private Date birthday;  //生日

    @Override
    public String toString() {
        return "Contact{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

        3.5工具类和配置文件




    
        
        
            
            
            
            
                
                
                
                
            
        
    
    
    
        
    
package com.itheima.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 会话工厂工具类
 */
public class SessionFactoryUtils {
    private static SqlSessionFactory factory;

    static {
        //实例化工厂建造类
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //读取核心配置文件
        try (InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml")) {
        //创建工厂对象
            factory = builder.build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     得到会话对象
     @return 会话对象
     */
    public static SqlSession getSession() {
        return factory.openSession();
    }

    /**
     得到工厂对象
     @return 会话工厂对象
     */
    public static SqlSessionFactory getSqlSessionFactory() {
        return factory;
    }
}

        3.6Jedis工具类和配置文件

jedis.properties

# 主机名
host=localhost
# 端口号
port=6379
# 最大连接数
maxTotal=30
# 最长等待时间
maxWaitMillis=3000

JedisUtils.java

package com.itheima.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

/**
 * 创建Jedis工具类
 */
public class JedisUtils {

    private static JedisPool pool;

    static {
        //读取src下的配置文件,得到ResourceBundle对象
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        //得到所有的属性并且赋值
        String host = bundle.getString("host");
        //以下属性要转成整数类型
        int port = Integer.parseInt(bundle.getString("port"));
        int maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        int maxWaitMillis = Integer.parseInt(bundle.getString("maxWaitMillis"));
        //创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxWaitMillis(maxWaitMillis);
        config.setMaxTotal(maxTotal);
        //创建连接池对象
        pool = new JedisPool(config, host, port);
    }

    /**
     * 从连接池中得到Jedis连接对象
     */
    public static Jedis getJedis() {
        return pool.getResource();
    }
}

4.项目结构

【Redis高手修炼之路】案例——异步加载所有联系人_第7张图片

5.源代码

数据访问层

package com.itheima.dao;

import com.itheima.entity.Contact;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 联系人数据访问层
 */
public interface ContactDao {

    /**
     查询所有联系人
     */
    @Select("select * from contact")
    List findAll();

}
package com.itheima.dao.impl;

import com.itheima.dao.ContactDao;
import com.itheima.entity.Contact;
import com.itheima.utils.SessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

/**
 联系人数据访问层
 */
public class ContactDaoImpl implements ContactDao {

    private SqlSessionFactory factory = SessionFactoryUtils.getSqlSessionFactory();

    /**
     查询所有联系人
     */
    public List findAll() {
        SqlSession session = factory.openSession();
        ContactDao contactDao = session.getMapper(ContactDao.class);
        List contacts = contactDao.findAll();
        session.close();
        return contacts;
    }

}

业务层

package com.itheima.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.dao.ContactDao;
import com.itheima.dao.impl.ContactDaoImpl;
import com.itheima.entity.Contact;
import com.itheima.utils.JedisUtils;
import redis.clients.jedis.Jedis;

import java.util.List;

/**
 业务层 */
public class ContactService {

    private ContactDao contactDao = new ContactDaoImpl();

    /**
     读取联系人的JSON数据
     */
    public String findAllContacts() {
        //1. 从redis中获取联系人列表
        Jedis jedis = JedisUtils.getJedis();
        String contacts = jedis.get("contacts");
        //2. 判断数据是否为空,如果为空则调用DAO去MySQL找联系人,找到后转成JSON对象写入到redis中
        if (contacts == null) {
            System.out.println("访问MySQL");
            List list = contactDao.findAll();
            //转成JSON对象
            try {
                contacts = new ObjectMapper().writeValueAsString(list);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //写入到redis中
            jedis.set("contacts", contacts);
        } else {
            System.out.println("访问Redis");
        }
        //3.如果不为空,则从redis获取json数据。
        return contacts;
    }
}

Servlet

package com.itheima.servlet;

import com.itheima.service.ContactService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "ContactServlet",urlPatterns = "/contact")
public class ContactServlet extends HttpServlet {

    private ContactService contactService = new ContactService();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //指定为json类型
        response.setContentType("text/json;charset=utf-8");
        PrintWriter out = response.getWriter();
        //调用业务类方法,得到所有联系人
        String contacts = contactService.findAllContacts();
        out.print(contacts);
    }
}

页面





    
    
    
    通讯录管理
    
    
    





编号 姓名 电话 邮箱 生日

【Redis高手修炼之路】案例——异步加载所有联系人_第8张图片​​​​​​​

你可能感兴趣的:(Redis,redis,sql,nosql,java,数据库)