Redis系列四:Java连接Redis—Jedis

Jedis简介

  • Java语言连接Redis
    • Jedis
    • SpringData Redis
    • lettuce
  • 可视化连接Redis客户端
    • Redis Desktop Manager
    • Redis Client
    • Redis Studio

Hello World

准备工作

客户端连接Redis

  1. 连接redis
  2. 操作redis
  3. 关闭redis
    代码演示:
package com.bupt.edu.cn;

import redis.clients.jedis.Jedis;

public class JedisTest {
    public static void main(String[] args) {
        // 1.连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("your password");     // 连接redis的密码

        // 2.操作redis
        jedis.set("name", "Eamon");
        String name = jedis.get("name");
        System.out.println(name);

        // 3.关闭redis
        jedis.close();
    }
}

Jedis读写Redis数据

通过一个案例来演示Jedis的读写

案例:服务调用次数控制

人工智能领域的语音识别,讯飞免费开放给企业试用,同时讯飞训练自己的模型。现对用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用。

  • 案例需求

    • 设定两个级别A、B类型用户
    • A用户限制10次/分钟,B用户限制30次/分钟
  • 需求分析

    • 设定一个服务方法,模拟实际业务调用的服务。简化为打印信息
    • 在业务调用前调用控制单元,内部使用redis进行控制
    • 对调用超过限度的用户进行控制,异常处理简化为打印提示信息
    • 主程序启动2个线程,分别表示两个不同用户的调用

代码演示如下:

package com.bupt.edu.cn;

import com.bupt.edu.cn.util.JedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;

public class Service {
    private String id;
    private int num;

    public Service(String id, int num) {
        this.id = id;
        this.num = num;
    }

    // 控制单元
    public void service() {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
       // Jedis jedis = JedisUtils.getJedis();
        jedis.auth("24862486");
        String value = jedis.get("compid:" + id);
        // 判断该值是否存在
        try {
            if (value == null) {
                // 不存在,创建该值
                // long.MAX_VALUE-num 当超出的时候就会报错,进入catch,通过这个逻辑判断是否使用次数超过num
                jedis.setex("compid:" + id, 5, Long.MAX_VALUE - num + "");
            } else {
                // 存在,自增,调用业务
                Long val = jedis.incr("compid:" + id);
                business(id, num - Long.MAX_VALUE + val);
            }
        } catch (JedisDataException e) {
            System.out.println("使用以已经到达次数上限,请升级会员级别");
            return;
        } finally {
            jedis.close();
        }

    }

    // 模拟业务操作
    public void business(String id, Long val) {
        System.out.println(id + "业务执行第" + val + "次");
    }
}

// 模拟用户调用业务
class MyThread extends Thread {
    Service sc;

    public MyThread(String id, int num) {
        sc = new Service(id, num);
    }


    @Override
    public void run() {
        while (true) {
            sc.service();
            try {
                Thread.sleep(300L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Main {
    public static void main(String[] args) {
        // 设定多线程,模拟用户操作
        MyThread mt1 = new MyThread("初级用户", 10);
        MyThread mt2 = new MyThread("高级用户", 30);
        mt1.start();
        mt2.start();
    }
}

Jedis简易工具类开发

基于连接池获取连接

  • JedisPool:Jedis提供的连接池技术
    poolConfig:连接池配置对象
    host:redis服务地址
    port:redis服务端口号
    
public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port){
    this(poolConfig, host, port, 2000, (String)null, 0, (Strng)null);
}

封装连接参数

  • jedis.properties
jedis.host=localhost
jedis.port=6379
jedis.maxTotal=30
jedis.maxIdle=10

代码演示:

package com.bupt.edu.cn.util;

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

import java.util.ResourceBundle;

public class JedisUtils {
    private static JedisPool jp = null;
    private static String host = null;
    private static Integer port;
    private static Integer maxTotal;
    private static Integer 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.setMaxTotal(maxTotal);
        jpc.setMaxIdle(maxIdle);
        jp = new JedisPool(jpc, host, port);
    }

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

此时在Jedis读写Redis的示例中,获取jedis时,可以将

Jedis jedis = new Jedis("127.0.0.1", 6379);

替换为

Jedis jedis = JedisUtils.getJedis();

这样可以达到解耦的效果,将数据库配置和代码分离开。
点击查看关于Java读取配置文件的更多方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章