java连接redis

  • 一、java连接redis
  • 1.1、连接数据库
  • 1.2、jedis以byte[] 存储一个对象到redis中
  • 1.3、jedis以String 形式存储一个对象到redis中
  • 1.4、Jedis连接池的操作
  • 1.5 、管道操作


一、java连接redis

1.1、连接数据库

1、创建一个maven项目

2、引入依赖

java 远程链接redis java项目连接redis_java

运行

java 远程链接redis java项目连接redis_java 远程链接redis_02

redis图形化界面出现数据

java 远程链接redis java项目连接redis_jedis_03

取出数据:

java 远程链接redis java项目连接redis_java_04


java 远程链接redis java项目连接redis_jedis_05

1.2、jedis以byte[] 存储一个对象到redis中

创建实体类 User:

package com.yms.entity;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 此间乐
 * @create 2020-12-22-21:03
 */
@Data
public class User implements Serializable {
    private Integer id;
    private String name;
    private Date birthday;

    public User() {
    }

    public User(Integer id, String name, Date birthday) {
        this.id = id;
        this.name = name;
        this.birthday = birthday;
    }
}

引入依赖:

<dependencies>

<!--        Jedis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

<!--        junit 依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

<!--        Lombok 简化操作-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>

<!--        使用spring它的 SerializationUtils-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>

创建Demo类

public class Demo {

    //存储对象 -以byte[](字节数组)的形式存储在Redis
    @Test
    public void setByteArray(){
        //1.连接Redis
        Jedis jedis =new Jedis("192.168.156.128", 6379);

        //2.1 准备key(String)-value(User)
        String key = "user";
        User value = new User(1,"李四",new Date());

        //2.2 将key和value转换为byte[]
        byte[] byteKey = SerializationUtils.serialize(key);
        byte[] byteValue = SerializationUtils.serialize(value);

        //2.3 将key和value存储到redis中
        jedis.set(byteKey,byteValue);

        //3释放资源
        jedis.close();
    }

    //获取对象 -以byte[](字节数组)的形式在redis获取
    @Test
    public void getByteArray(){
        //1.连接Redis
        Jedis jedis =new Jedis("192.168.156.128", 6379);

        //2.1 准备key
        String key = "user";

        //2.2 将key转换为byte[]
        byte[] byteKey = SerializationUtils.serialize(key);
        
        //2.3 jedis 去redis中获取value
        byte [] value = jedis.get(byteKey);
       
        //2.4 将value反序列化为User对象
        User user = (User) SerializationUtils.deserialize(value);
       
        //2.5 输出
        System.out.println("user:" + user);
        //3释放资源
        jedis.close();
    }
}

执行setByteArray()后 redis在图形化界面的结果

java 远程链接redis java项目连接redis_java_06

执行getByteArray() 后,控制台的输出结果

java 远程链接redis java项目连接redis_redis_07

1.3、jedis以String 形式存储一个对象到redis中

实体类:

package com.yms.entity;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 此间乐
 * @create 2020-12-22-21:03
 */
@Data
public class User implements Serializable {
    private Integer id;
    private String name;
    private Date birthday;

    public User() {
    }

    public User(Integer id, String name, Date birthday) {
        this.id = id;
        this.name = name;
        this.birthday = birthday;
    }
}

引入fastJSON依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

创建Demo1类

package com.yms.test;

import com.alibaba.fastjson.JSON;
import com.yms.entity.User;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Date;

/**
 * @author 此间乐
 * @create 2020-12-23-15:37
 */
public class Demo1 {
    //存储一个对象 - 以String形式存储
    @Test
    public void setString(){

        //1、连接Redis
        Jedis jedis = new Jedis("192.168.156.128", 6379);

        //2.1 准备key(String)-value(User)
        String stringKey = "stringUser";
        User value = new User(2,"旺财",new Date());

        //2.2 使用fastJSON将value转换为json字符串
        String stringValue = JSON.toJSONString(value);

        //2.3 存储到Redis中
        jedis.set(stringKey,stringValue);

        //3 释放
        jedis.close();
    }

    //获取一个对象 - 以String形式存储
    @Test
    public void getString(){

        //1、连接Redis
        Jedis jedis = new Jedis("192.168.156.128", 6379);

        //2.1 准备key
        String stringKey = "stringUser";

        //2.2 去Redis中查询value
        String stringValue = jedis.get(stringKey);

        //2.3 将value反序列化为User
        User user = JSON.parseObject(stringValue,User.class);

        //2.4 输出
        System.out.println("user:" + user);

        //3 释放
        jedis.close();
    }
}

执行setString 在redis图形化界面的结果

java 远程链接redis java项目连接redis_java_08

执行setString 控制台输出的结果

java 远程链接redis java项目连接redis_数据库_09

1.4、Jedis连接池的操作

简单方式:

//简单方式
    @Test
    public void pool1(){
        //1.创建连接池
        JedisPool jedisPool = new JedisPool("192.168.156.128", 6379);

        //2、通过连接池获取jedis对象
        Jedis jedis = jedisPool.getResource();
        //3、操作
        String value = jedis.get("stringUser");
        System.out.println("user:" + value);

        //4、释放资源
        jedis.close();
    }

详细配置:

@Test
    public void pool2(){
        //1.创建连接池配置信息
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(100); //连接池中最大的活跃数
        poolConfig.setMaxIdle(10); //最大空闲数
        poolConfig.setMinIdle(5); //最小空闲数
        poolConfig.setMaxWaitMillis(3000); //当连接池空了之后,多久没获取到Jedis对象,就超时

        //2.创建连接池
        JedisPool pool = new JedisPool(poolConfig,"192.168.156.128",6379);


        //3、通过连接池获取jedis对象
        Jedis jedis = pool.getResource();

        //4、操作
        String value = jedis.get("stringUser");
        System.out.println("user:" + value);

        //5、释放资源
        jedis.close();

    }

1.5 、管道操作

因为在操作Redis的时候,执行一个命令需要先发送请求到Redis服务器,这个过程需要经历网络的延迟,Redis还需要给客户端一个响应
如果我们需要一次性执行很多个命令,上述的方式效率很低,可以通过Redis的管道,先将命令放到客户端的一个Pipeline中,之后一次性的将命令都发送到Redis服务,Redis服务一次性的将全部的返回结果响应给客户端。

java 远程链接redis java项目连接redis_jedis_10

不进行管道操作:

//1、创建连接池
    JedisPool pool = new JedisPool("192.168.156.128",6379);
    long l = System.currentTimeMillis();//当前系统时间

    //2、获取一个连接对象
    Jedis jedis = pool.getResource();

    //3、执行incr - 10000次
    for (int i = 0; i < 10000; i++) {
        jedis.incr("pp");
    }

    //4、释放资源
    jedis.close();
    System.out.println(System.currentTimeMillis() - l);

输出结果,花费了4829毫秒

java 远程链接redis java项目连接redis_java 远程链接redis_11

进行管道操作:

//2、获取一个连接对象

    Jedis jedis = pool.getResource();

    //3、创建管道
    Pipeline pipelined = jedis.pipelined();

    //4、执行incr - 10000次放到管道中
    for (int i = 0; i < 10000; i++) {
         pipelined.incr("qq");

    }

    //5、执行命令
    pipelined.syncAndReturnAll();

    //6、释放资源
    jedis.close();

    System.out.println(System.currentTimeMillis() - l);

输出结果,花费了67毫秒

java 远程链接redis java项目连接redis_redis_12

完整代码:

public class Pipeline01 {

    //管道操作
    @Test
    public void pipeline(){
       //1、创建连接池
        JedisPool pool = new JedisPool("192.168.156.128",6379);
        long l = System.currentTimeMillis();//当前系统时间

  /*      //2、获取一个连接对象
        Jedis jedis = pool.getResource();

        //3、执行incr - 10000次
        for (int i = 0; i < 10000; i++) {
            jedis.incr("pp");
        }

        //4、释放资源
        jedis.close();

 */

        //==========================

        //2、获取一个连接对象

        Jedis jedis = pool.getResource();

        //3、创建管道
        Pipeline pipelined = jedis.pipelined();

        //4、执行incr - 10000次放到管道中
        for (int i = 0; i < 10000; i++) {
             pipelined.incr("qq");

        }

        //5、执行命令
        pipelined.syncAndReturnAll();

        //6、释放资源
        jedis.close();

        System.out.println(System.currentTimeMillis() - l);

    }
}