redis-Jedis

119 阅读3分钟

1.Jedis简介

Java语言连接redis服务可使用jedis

Java语言连接redis服务

  • Jedis
  • SpringData Redis
  • Lettuce

可视化连接redis客户端

  • Redis Desktop Manager
  • Redis Client
  • Redis Studio

2.Hello(Jedis版)

基于maven导入相关依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.0</version>
</dependency>

使用java操作redis演示

  1. 连接
  2. 操作
  3. 关闭
import org.junit.Test;
import redis.clients.jedis.Jedis;

public class jedisTest {
    @Test
    public void testJedis() {
        //1.连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //2.操作redis
        //jedis.set("name", "hello");
        System.out.println(jedis.get("name"));
        //3.关闭连接
        jedis.close();
    }
}

3.Jedis读写redis数据

案例:服务调用次数控制

不同级别的用户只能获取一定次数的服务

需求分析

  1. 设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用
  2. 在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案
  3. 对调用超限使用异常进行控制,异常处理设定为打印提示信息
  4. 主程序启动3个线程,分别表示3种不同用户的调用
  • 设定业务方法
public void business(String id, long num) {
    System.out.println("用户" + id + "发起业务调用,当前第" + num + "次");
}
  • 设定多线类,模拟用户调用
class MyThread extends Thread {
    Service sc;
    public MyThread(String id, int num) {
        sc = new Service(id, num);
    }

    public void run() {
        while (true) {
            sc.service(id);
            //模拟调用间隔,设定为1.x秒
            try {
                Random r = new Random();
                Thread.sleep(1000 + r.nextInt(200));
            } catch (InterruptedException e) {
                e.printStackTrace();
                ;
            }
        }
    }
}
  • 设计redis控制方案
public void service(String id) {
    Jedis jedis = new Jedis("localhost", 6379);
    String value = jedis.get("compid:" + id);
    //判定该值是否存在
    if (value == null) {
        //如果不存在就加上该值,给上时间限定和值(使用服务次数,不同级别次数不同)
        jedis.setex("compid:" + id, 20, "" + (Long.MAX_VALUE - 10));
    } else {
        //如果存在就自增并调用业务方法
        try {
            Long val = jedis.incr("compid:" + id);
            business(id, 10 + val - Long.MAX_VALUE);
        } catch (JedisDataException e) {
            //调用次数溢出,弹出提示
            System.out.println("用户:" + id + "使用次数已达到上限,请稍后再试");
            return;
        } finally {
            jedis.close();
        }
    }
}
  • 设计启动主程序
public static void main(String[] args) {
//应完善不同级别用户调用次数
    MyThread t1 = new MyThread("初级用户");
    t1.start();
}

4.Jedis简易工具类开发

问题:开发中jedis对象是我们手工管理的,实际应由连接池提供对象

//jedis连接池,获得连接的工具类
public class JedisUtils {
    public static Jedis getJedis() {
        //连接池配置对象
        JedisPoolConfig jpc = new JedisPoolConfig();
        //设置最大连接数
        jpc.setMaxTotal(10);
        //设置活动连接数
        jpc.setMaxIdle(5);

        String host = "127.0.0.1";
        int port = 6379;

        JedisPool jp = new JedisPool(jpc, host, port);
        Jedis jedis = jp.getResource();
        return jedis;
    }
}

问题:每次获取连接对象都会创建连接池,反而降低效率 将创建对象的过程抽取出来

//jedis连接池,获得连接的工具类
public class jedisUtils {
    private static JedisPool jp = null;

    static {
        //连接池配置对象
        JedisPoolConfig jpc = new JedisPoolConfig();
        //设置最大连接数
        jpc.setMaxTotal(10);
        //设置活动连接数
        jpc.setMaxIdle(5);
        String host = "127.0.0.1";
        int port = 6379;
        jp = new JedisPool(jpc, host, port);
    }
    
    public static Jedis getJedis() {
        Jedis jedis = jp.getResource();
        return jedis;
    }
}

问题:数据与代码耦合,将可变数据提出做成配置文件

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 jp = null;
    private static String host = null;
    private static int port;
    private static int maxTotal;
    private static int maxIdle;

    static {
        //加载配置文件
        ResourceBundle rb = ResourceBundle.getBundle("redis");
        host = rb.getString("redis.host");
        port = Integer.parseInt(rb.getString("redis.port"));
        maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
        maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
        //连接池配置对象
        JedisPoolConfig jpc = new JedisPoolConfig();
        jpc.setMaxIdle(maxIdle);
        jpc.setMaxTotal(maxTotal);
        //创建连接池
        jp = new JedisPool(jpc, host, port);
    }

    public static Jedis getJedis() {
        Jedis jedis = jp.getResource();
        return jedis;
    }

    public static void main(String[] args) {
        //测试
        Jedis jedis = jedisUtils.getJedis();
    }
}

redis.properties文件

redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=10
redis.maxIdle=10

5.可视化客户端

Redis Desktop Manager 直接下载安装

image.png