• redis13_Jedis连接池5


    jedis连接池:JedisPool

    1. 使用

     1.1 创建JedisPool连接池对象

     1.2 调用方法getResource()方法获取Jedis连接

    package cn.itcast.jedis.test;
    
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Jedis测试类
     */
    public class JedisTest {
    
      
        /**
         * Jedis连接池使用
         */
        @Test
        public void test7(){
            //1. 创建Jedis连接池对象
            JedisPool jedisPool = new JedisPool();
    
            //2. 获取连接
            Jedis jedis = jedisPool.getResource();
    
            //3. 使用
            jedis.set("hehe","haha");
    
            //4. 关闭 归还到连接池中
            jedis.close();
        }
    
    }

      运行成功后,查询redis客户端

      

    package cn.itcast.jedis.test;
    
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Jedis测试类
     */
    public class JedisTest {
    
        @Test
        public void test8(){
            //0. 创建一个配置对象
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(50);
            config.setMaxIdle(10);
    
            //1. 创建Jedis连接池对象
            JedisPool jedisPool = new JedisPool(config,"localhost",6379);
            //2. 获取连接
            Jedis jedis = jedisPool.getResource();
    
            //3. 使用
            jedis.set("hehe","heihei");
    
            //4. 关闭 归还到连接池中
            jedis.close();
    
        }
    
    }

      运行成功后,查询redis客户端

      

     1.3 Jedis详细配置

    #最大活动对象数     
    redis.pool.maxTotal=1000    
    #最大能够保持idel状态的对象数      
    redis.pool.maxIdle=100  
    #最小能够保持idel状态的对象数   
    redis.pool.minIdle=50    
    #当池内没有返回对象时,最大等待时间    
    redis.pool.maxWaitMillis=10000    
    #当调用borrow Object方法时,是否进行有效性检查    
    redis.pool.testOnBorrow=true    
    #当调用return Object方法时,是否进行有效性检查    
    redis.pool.testOnReturn=true  
    #“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
    redis.pool.timeBetweenEvictionRunsMillis=30000  
    #向调用者输出“链接”对象时,是否检测它的空闲超时;  
    redis.pool.testWhileIdle=true  
    # 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
    redis.pool.numTestsPerEvictionRun=50  
    #redis服务器的IP    
    redis.ip=xxxxxx  
    #redis服务器的Port    
    redis1.port=6379   

    2. 连接池工具类

    package cn.itcast.jedis.util;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * JedisPool工具类
     *  加载配置文件,配置连接池的参数
     *  提供获取连接的方法
     */
    public class JedisPoolUtils {
    
        private static JedisPool jedisPool;
    
        static{
            //读取配置文件
            InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
            //创建Properties对象
            Properties pro = new Properties();
            //关联文件
            try {
                pro.load(is);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取数据,设置到JedisPoolConfig中
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
            config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
    
            //初始化JedisPool
            jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
        }
    
        /**
         * 获取连接方法
         */
        public static Jedis getJedis(){
            return jedisPool.getResource();
        }
    }

      jedis.properties文件放在src目录下

    host=localhost
    port=6379
    maxTotal=50
    maxIdle=10

      连接池工具类使用

    package cn.itcast.jedis.test;
    
    import cn.itcast.jedis.util.JedisPoolUtils;
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Jedis测试类
     */
    public class JedisTest {
    
        @Test
        public void test9(){
            //通过连接池工具类获取
            Jedis jedis = JedisPoolUtils.getJedis();
    
            //3. 使用
            jedis.set("hello","world");
    
            //4. 关闭 归还到连接池中
            jedis.close();
        }
    }

      执行成功,查询redis客户端

      

    3. 案例

     3.1 案例需求

      1、提供index.html页面,页面中有一个省份 下拉列表

      2、当页面加载完成后发送ajax请求,加载所有省份

      分析:

       

      实现步骤:

        一:创建数据库、省份表及录入数据

    CREATE DATABASE day13; -- 创建数据库
    USE day13;                -- 使用数据库
    CREATE TABLE province(   -- 创建表
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20) NOT NULL
        
    );
    -- 插入数据
    INSERT INTO province VALUES(NULL,'北京');
    INSERT INTO province VALUES(NULL,'上海');
    INSERT INTO province VALUES(NULL,'广州');
    INSERT INTO province VALUES(NULL,'陕西');

          到SQLyog中执行上述sql语句。

        二:把依赖jar包放到项目中

          jar包放入web/WEB-INF/lib目录下,并且lib右键Add as Library

          

        三:src目录下创建数据库的配置文件druid.properties、redis配置文件jedis.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///day13
    username=root
    password=root
    initialSize=5
    maxActive=10
    maxWait=3000
    host=localhost
    port=6379
    maxTotal=50
    maxIdle=10

       四:导入依赖的js文件到web目录下

          

        五:创建Jdbc工具类JDBCUtils、redis工具类JedisPoolUtils

    package cn.itcast.util;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    /**
     * JDBC工具类 使用Durid连接池
     */
    public class JDBCUtils {
    
        private static DataSource ds ;
    
        static {
    
            try {
                //1.加载配置文件
                Properties pro = new Properties();
                //使用ClassLoader加载配置文件,获取字节输入流
                InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                pro.load(is);
    
                //2.初始化连接池对象
                ds = DruidDataSourceFactory.createDataSource(pro);
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接池对象
         */
        public static DataSource getDataSource(){
            return ds;
        }
    
    
        /**
         * 获取连接Connection对象
         */
        public static Connection getConnection() throws SQLException {
            return  ds.getConnection();
        }
    }
    package cn.itcast.jedis.util;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * JedisPool工具类
     *  加载配置文件,配置连接池的参数
     *  提供获取连接的方法
     */
    public class JedisPoolUtils {
    
        private static JedisPool jedisPool;
    
        static{
            //读取配置文件
            InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
            //创建Properties对象
            Properties pro = new Properties();
            //关联文件
            try {
                pro.load(is);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取数据,设置到JedisPoolConfig中
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
            config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
    
            //初始化JedisPool
            jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
        }
    
        /**
         * 获取连接方法
         */
        public static Jedis getJedis(){
            return jedisPool.getResource();
        }
    }

        六:代码实现

    package cn.itcast.domain;
    
    public class Province {
    
        private int id;
        private String name;
    
        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;
        }
    }
    package cn.itcast.dao;
    
    import cn.itcast.domain.Province;
    import java.util.List;
    
    public interface ProvinceDao {
    
        public List<Province> findAll();
    }
    package cn.itcast.dao.impl;
    
    import cn.itcast.dao.ProvinceDao;
    import cn.itcast.domain.Province;
    import cn.itcast.util.JDBCUtils;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import java.util.List;
    
    public class ProvinceDaoImpl implements ProvinceDao {
    
        //1.声明成员变量 jdbcTemplate
        private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    
        @Override
        public List<Province> findAll() {
            //1.定义sql
            String sql = "select * from province";
            //2.执行sql
            List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
            return list;
        }
    }
    package cn.itcast.service;
    
    import cn.itcast.domain.Province;
    import java.util.List;
    
    public interface ProvinceService {
    
        public List<Province> findAll();
    
        public String findAllJson();
    }
    package cn.itcast.service.impl;
    
    import cn.itcast.dao.ProvinceDao;
    import cn.itcast.dao.impl.ProvinceDaoImpl;
    import cn.itcast.domain.Province;
    import cn.itcast.jedis.util.JedisPoolUtils;
    import cn.itcast.service.ProvinceService;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import redis.clients.jedis.Jedis;
    import java.util.List;
    
    public class ProvinceServiceImpl implements ProvinceService {
    
        //声明dao
        private ProvinceDao dao = new ProvinceDaoImpl();
    
        @Override
        public List<Province> findAll() {
            return dao.findAll();
        }
    
        @Override
        public String findAllJson() {
            /**
             * 使用redis缓存
             */
            //1.先从redis中查询数据
            //1.1 获取redis客户端连接
            Jedis jedis = JedisPoolUtils.getJedis();
            String province_json = jedis.get("province");
    
            //2. 判断province_json 数据是否为null
            if(province_json == null || province_json.length() == 0){
                //redis中没有数据
                System.out.println("redis中没数据,查询数据库");
                //2.1 从数据库中查询
                List<Province> ps = dao.findAll();
                //将list序列化为json
                ObjectMapper mapper = new ObjectMapper();
                try {
                    province_json = mapper.writeValueAsString(ps);
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                }
                //2.3 将json数据存入redis
                jedis.set("province",province_json);
                //归还连接
                jedis.close();
            }else {
                System.out.println("redis中有数据,查询缓存...");
            }
            return province_json;
        }
    }
    package cn.itcast.web.servlet;
    
    import cn.itcast.domain.Province;
    import cn.itcast.service.ProvinceService;
    import cn.itcast.service.impl.ProvinceServiceImpl;
    import com.fasterxml.jackson.databind.ObjectMapper;
    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.util.List;
    
    @WebServlet("/provinceServlet")
    public class ProvinceServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          /*  //1.调用service查询
            ProvinceService service = new ProvinceServiceImpl();
            List<Province> list = service.findAll();
    
            //2.序列化list为json
            ObjectMapper mapper = new ObjectMapper();
            String json = mapper.writeValueAsString(list);*/
    
            //1.调用service查询
            ProvinceService service = new ProvinceServiceImpl();
            String json = service.findAllJson();
    
            //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
            System.out.println(json);
    
            //3.响应结果
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }

      web目录下新建index.html

      

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
        <script src="js/jquery-3.3.1.min.js"></script>
        <script>
            $(function () {
                //发送ajax请求,加载所有省份数据
                $.get("provinceServlet",{},function (data) {
                    //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
                    //1.获取select
                    var province = $("#province");
                    //2.遍历json数组
                    $(data).each(function () {
                        //3.创建<option>
                        var option ="<option name='"+this.id+"'>"+this.name+"</option>";
                        //4.调用select的append追加option
                        province.append(option);
                    });
                });
            });
        </script>
    
    </head>
    <body>
    
        <select id="province">
            <option>--请选择省份--</option>
        </select>
    </body>
    </html>  

      

      Run->Edit Configurations,配置Deployment中的Application context为/,server中的端口号为80,After lanch去掉勾选,启动tomcat服务器;

      启动tomcat服务器成功,浏览器访问http://localhost/index.html,点击请选择省份,检查省份值,idea控制台输出信息

          

       浏览器再次访问http://localhost/index.html,检查idea控制台输出信息

      

      注意:使用redis缓存一些不经常发生变化的数据。

        * 数据库的数据一旦发生改变,则需要更新缓存

          * 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入

          * 在service对应的增删改方法中,将redis数据删除。

  • 相关阅读:
    JDK5的新特性
    反射(一)类加载器、反射、动态代理
    泛型(五)
    spring自定义注解实现登陆拦截器
    java国际化
    Codeforces 231A
    Codeforces 231A
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-2 小明种苹果(续)
    CCF CSP 201909-1 小明种苹果
  • 原文地址:https://www.cnblogs.com/ajing2018/p/16276037.html
Copyright © 2020-2023  润新知