Redis——Java操作Redis、Jedis连接池

目录

Jedis的基本使用

跳转到目录
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis。

1、引入依赖

<!--引入jedis连接依赖-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
</dependency>

2、创建jedis对象

 public static void main(String[] args) {
    
    
   //1.创建jedis对象
   Jedis jedis = new Jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙  2.redis服务必须开启远程连接
   jedis.select(0);//选择操作的库默认0号库
   //2.执行相关操作
   //....
   //3.释放资源
   jedis.close();
 }

Jedis常用API

跳转到目录

方法 解释
new Jedis(host, port) 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口
set(key,value) 设置字符串类型的数据
get(key) 获得字符串类型的数据
hset(key,field,value) 设置哈希类型的数据
hget(key,field) 获得哈希类型的数据
lpush(key,values) 设置列表类型的数据
lpop(key) 列表左面弹栈
rpop(key) 列表右面弹栈
del(key) 删除指定的key

操作key相关api

跳转到目录

public class TestKey {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试key相关
    @Test
    public void testKeys(){
    
    
        //删除一个key
        jedis.del("name");
        //删除多个key
        //jedis.del("name","age");

        //判断一个key是否存在exits
        Boolean name = jedis.exists("name");
        System.out.println(name);

        //设置一个key超时时间 expire pexpire
        //Long age = jedis.expire("age", 100);
        //System.out.println(age);

        //获取一个key超时时间 ttl
        Long age1 = jedis.ttl("newage");
        System.out.println(age1);

        //随机获取一个key
        String s = jedis.randomKey();

        //修改key名称
       // jedis.rename("age","newage");

        //查看可以对应值的类型
        String name1 = jedis.type("name");
        System.out.println(name1);
        String maps = jedis.type("maps");
        System.out.println(maps);
    }

}

操作String相关api

跳转到目录

public class TestString {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试String相关
    @Test
    public void testString(){
    
    
        //set
        jedis.set("name","小陈");
        //get
        String s = jedis.get("name");
        System.out.println(s);
        //mset
        jedis.mset("content","好人","address","海淀区");
        //mget
        List<String> mget = jedis.mget("name", "content", "address");
        mget.forEach(v-> System.out.println("v = " + v));
        //getset
        String set = jedis.getSet("name", "小明");
        System.out.println(set);

        //............
    }

}

操作List相关api

跳转到目录

public class TestList {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试List相关
    @Test
    public void testList(){
    
    

        //lpush
        jedis.lpush("names1","张三","王五","赵柳","win7");

        //rpush
        jedis.rpush("names1","xiaomingming");

        //lrange

        List<String> names1 = jedis.lrange("names1", 0, -1);
        names1.forEach(name-> System.out.println("name = " + name));

        //lpop rpop
        String names11 = jedis.lpop("names1");
        System.out.println(names11);

        //llen
        jedis.linsert("lists", BinaryClient.LIST_POSITION.BEFORE,"xiaohei","xiaobai");


    }

}

操作Set相关api

跳转到目录

public class TestSet {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试SET相关
    @Test
    public void testSet(){
    
    

        //sadd
        jedis.sadd("names","zhangsan","lisi");

        //smembers
        jedis.smembers("names");

        //sismember
        jedis.sismember("names","xiaochen");

        //...
    }

}

操作Zset相关api

跳转到目录

public class TestZSet {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试ZSET相关
    @Test
    public void testZset(){
    
    

        //zadd
        jedis.zadd("names",10,"张三");

        //zrange
        jedis.zrange("names",0,-1);

        //zcard
        jedis.zcard("names");

        //zrangeByScore
        jedis.zrangeByScore("names","0","100",0,5);

        //..

    }

}

操作Hash相关api

跳转到目录

public class TestHash {
    
    
    private Jedis jedis;

    @Before
    public void before(){
    
    
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
    
    
        jedis.close();
    }


    //测试HASH相关
    @Test
    public void testHash(){
    
    
        //hset
        jedis.hset("maps","name","zhangsan");
        //hget
        jedis.hget("maps","name");
        //hgetall
        jedis.hgetAll("mps");
        //hkeys
        jedis.hkeys("maps");
        //hvals
        jedis.hvals("maps");
        //....
    }

}

Jedis连接池的基本概念

跳转到目录
jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术,jedisPool在创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用。

JedisPool的基本使用

跳转到目录

/**
 * 候选版本: release candidate稳定候选版
 * @author ZYGui
 */
public class RedisUtilRC {
    
    

    private static JedisPool pool = null;

    static {
    
    
        //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化
        poolConfig.setMinIdle(10);
        // 最大空闲
        poolConfig.setMaxIdle(5);
        // 最多有多少个
        poolConfig.setMaxWaitMillis(100);

        //2. 获取连接(使用连接池)
        pool = new JedisPool(poolConfig, "localhost", 6379);
    }

    public static Jedis getConnecttion(){
    
    

        // 从连接池中获取
        Jedis connection = pool.getResource();

        return connection;

    }

    public static void closePool(){
    
    
        pool.close();
    }

    public static void main(String[] args) {
    
    

       /* //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化
        poolConfig.setMinIdle(10);
        // 最大空闲
        poolConfig.setMaxIdle(5);
        // 最多有多少个
        poolConfig.setMaxWaitMillis(100);

        //2. 获取连接(使用连接池)
        JedisPool pool = new JedisPool(poolConfig, "localhost", 6379);
        // 从连接池中获取
        Jedis connection = pool.getResource();

        //3. 操作方法
        String str = connection.get("test");
        System.out.println(str);

        //4. 归还给连接池
        connection.close();*/

    }
}

Jedis连接池工具类

跳转到目录

/**
 * 候选版本: release candidate稳定候选版
 *
 * @author ZYGui
 */
public class RedisUtil2 {
    
    

    private static JedisPool pool = null;

    static {
    
    
        //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

        /*
            除了 properties来读取配置文件往外
            在Java.util包 resourceBundle就是用来解析properties
        */

        // 读取配置文件
        ResourceBundle rb = ResourceBundle.getBundle("redis");
        int minIdle = Integer.parseInt(rb.getString("redis.minIdle"));
        int maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
        int maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
        int maxWaitMillis = Integer.parseInt(rb.getString("redis.maxWaitMillis"));
        String host = rb.getString("redis.host");
        int port = Integer.parseInt(rb.getString("redis.port"));

        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMaxWaitMillis(maxWaitMillis);
        poolConfig.setMaxTotal(maxTotal);

        pool = new JedisPool(poolConfig, host, port);

		/*
		Properties properties = new Properties();
        try {
            properties.load(RedisUtil.class.getClassLoader().getResourceAsStream("redis.properties"));
            int minIdle = Integer.parseInt(properties.getProperty("redis.minIdle"));
            int maxIdle = Integer.parseInt(properties.getProperty("redis.maxIdle"));
            int maxTotal = Integer.parseInt(properties.getProperty("redis.maxTotal"));
            int maxWaitMillis = Integer.parseInt(properties.getProperty("redis.maxWaitMillis"));
            String host = properties.getProperty("redis.host");
            int port = Integer.parseInt(properties.getProperty("redis.port"));

            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);
            poolConfig.setMaxTotal(maxTotal);

            pool = new JedisPool(poolConfig, host, port);

        } catch (Exception e){
        }
		*/

    }

    public static Jedis getConnecttion() {
    
    

        // 从连接池中获取
        Jedis connection = pool.getResource();

        return connection;

    }

    public static void closePool() {
    
    
        pool.close();
    }

    public static void main(String[] args) {
    
    

        Jedis connection = getConnecttion();

        String str = connection.get("test");
        System.out.println(str);

        connection.close();
    }
}

Demo

跳转到目录
案例需求:
1. 提供index.html页面,页面中有一个省份 下拉列表
2. 当 页面加载完成后 发送ajax请求,加载所有省份

* 注意:使用redis缓存一些不经常发生变化的数据。
	* 数据库的数据一旦发生改变,则需要更新缓存。
		* 数据库的表执行 增删改的相关操作,需要将redis缓存数据清除,再次存入
		* 在service对应的增删改方法中,将redis数据删除。(因为不删除,数据仍然是redis缓存中的)
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="js/jquery-3.3.1.js"></script>

    <script>
        $(function () {
     
     

            /*
            * 注意: 当在Servlet中 设置 response.setContentType("application/json;charset=utf-8");
            *   不 需要将 JSON字符串 转为 JSON对象
            *   var JsonObj = JSON.parse(data);
            * */
            //发送ajax请求,加载所有省份数据
            $.get("http://localhost:8080/redis/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);
                });
            });


            /*
            * 注意: 当在Servlet中 设置 response.setContentType("text/html;charset=utf-8");
            *   下面两种方式都需要将 JSON字符串 转为 JSON对象
            *   var JsonObj = JSON.parse(data);
            * */
            //发送ajax请求,加载所有省份数据
            // $.get("http://localhost:8080/redis/provinceServlet",{},function (data) {
     
     
            //     //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
            //
            //     //1.获取select
            //     var province = $("#province");
            //     var JsonObj = JSON.parse(data);
            //     //2.遍历json数组
            //     $(JsonObj).each(function () {
     
     
            //         //3.创建<option>
            //         var option = "<option name='"+this.id+"'>"+this.name+"</option>";
            //
            //         //4.调用select的append追加option
            //         province.append(option);
            //     });
            //
            // });
            // $.ajax({
     
     
            //     url: "http://localhost:8080/redis/provinceServlet",
            //     type: "get",
            //     success:function (data) {
     
     
            //         var jsonObj = JSON.parse(data);
            //         for (pro of jsonObj) {
     
     
            //             alert(pro.id);
            //             //3.创建<option>
            //             var option = "<option name='"+pro.id+"'>"+pro.name+"</option>";
            //             //4.调用select的append追加option
            //             $("#province").append(option);
            //         }
            //     }
            // })
        });
        
    </script>

</head>
<body>

<select id="province">
    <option>--请选择省份--</option>

</select>
</body>
</html>
  • domain
package com.sunny.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;
    }
}
  • Dao
public class ProvinceDaoImpl implements ProvinceDao {
    
    

    //1. 声明成员变量
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public List<Province> findAll() {
    
    
        // 定义sql
        String sql = "SELECT * FROM province";
        // 执行
        return template.query(sql, new BeanPropertyRowMapper<>(Province.class));
    }
}
  • Service
public class ProvinceServiceImpl implements ProvinceService {
    
    

    private ProvinceDao dao = new ProvinceDaoImpl();

    @Override
    public List<Province> findAll() {
    
    
        return dao.findAll();
    }

    /**
     * 使用redis缓存
     * @return
     */
    @Override
    public String findAllJson() {
    
    

        //1. 先从redis中查询数据
        //1.1 获取redis客户端连接
        Jedis jedis = RedisUtil.getConnecttion();
        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();
            
            //2.2 将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;
    }
}

  • Servlet
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("application/json;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        //1. 调用Service查询
        // ProvinceService service = new ProvinceServiceImpl();
        // List<Province> list = service.findAll();
        //2. 序列化List为JSON
        // ObjectMapper mapper = new ObjectMapper();
        // String json = mapper.writeValueAsString(list);
        // System.out.println(json); //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,
        // "name":"陕西"}]

        // 添加缓存的调用
        ProvinceService service = new ProvinceServiceImpl();
        String json = service.findAllJson();
        System.out.println(json);

        //3. 响应结果
        response.getWriter().write(json);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37989980/article/details/107447560