# Redis 入门到精通(三)jedis

Redis 入门到精通(三)jedis

一、jedis–jedis 简介

1、jedis 简介

Jedis 是 Redis 官方首选的 Java 客户端开发包。使用 Jedis 提供的 Java API 对 Redis 进行操作,是 Redis 官方推崇的方式;并且,使用 Jedis 提供的对 Redis 的支持也最为灵活、全面;不足之处,就是编码复杂度较高。

 Jedis-java连接redis服务.png

2、Java 语言连接 redis 服务的客户端:

  • Jedis
  • SpringData Redis
  • Lettuce

3、编程语言与 redis

  • java 语言连接 redis 服务

  • C、C++、C#、Erlang、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala 连接 redis

  • 可视化连接 redis 客户端
    Redis Desktop Manager
    Redis Client
    Redis Studio

二、jedis–helloworld(jedis版)

1、准备工作: jar包导入

  • jedis-jar 包 下载地址: https://mvnrepository.com/artifact/redis.clients/jedis

  • 基于 maven 工程,在 pom.xml 文件中导入依赖。

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactid>
<version>2.9.0</version>
</dependency>

2、客户端连接 redis


// 1)连接redis
Jedis jedis = new Jedis("127.0.0.1"6379);

// 2)操作redis
jedis.set ("name", "HelloJedis");
jedis.get ("name" );

// 3)关闭redis连接
jedis.close();

3、API 文档

http://xetorthio.github.io/jedis/

4、打开 idea,创建 jedis 的 maven 工程。


	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( jedis )
		Version : 1.0-SNAPSHOT
	--> Name: ( jedis )
		Location: ( ...\jedis\ )	
	--> Finish	

5、 在工程 jedis (模块)中的 pom.xml 中导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>jedis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>
<!-- D:\java_test\Intesij_idea\jedis\pom.xml -->

6、 在工程 jedis (模块)中,创建测试类 JedisTest.java

/**
 *   jedis\src\test\java\djh\it\jedis\test\JedisTest.java
 *
 *   2024-7-13 创建测试类 JedisTest.java
 */
package djh.it.jedis.test;

import org.junit.Test;
import redis.clients.jedis.Jedis;

public class JedisTest {

    @Test
    public void testJedis(){
        // 1)连接redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 2)操作redis
        jedis.set ("name", "HellJedis");
        String name = jedis.get("name");

        System.out.println(name);

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

7、打开 redis 服务端,运行测试类,进行测试。

JedisTest.png

三、jedis–jedis 常规操作演示

1、jedis常规操作–list 类型数据测试方法


 @Test  // list 类型数据测试方法
    public void testList(){
        // 1)连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 2)操作redis
        jedis.lpush("list1", "o","l","l","e","H");
        jedis.rpush("list1", "Redis");

        List<String> list1 = jedis.lrange("list1", 0, -1);
        for (String s : list1){
            System.out.print(s);
        }

        System.out.println();
        System.out.println("list1 的长度是: " + jedis.llen("list1"));

        System.out.println();
        // 3)关闭redis连接
        jedis.close();
    }

2、jedis常规操作–hash 类型数据测试方法


@Test  // hash 类型数据测试方法
    public void testHash(){
        // 1)连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 2)操作redis
        jedis.hset("hash1", "a1", "a1");
        jedis.hset("hash1", "a2", "a2");
        jedis.hset("hash1", "a3", "a3");
        jedis.hset("hash1", "a4", "a4");
        jedis.hset("hash1", "a5", "a5");
        jedis.hset("hash1", "a6", "a6");

        Map<String, String> hash1 = jedis.hgetAll("hash1");
        System.out.println(hash1);

        jedis.hset("hash1", "a1", "b1");
        jedis.hset("hash1", "a2", "a2");
        jedis.hset("hash1", "a3", "b3");
        jedis.hset("hash1", "a4", "a4");
        jedis.hset("hash1", "a5", "a5");
        jedis.hset("hash1", "a6", "b6");

        Map<String, String> hash2 = jedis.hgetAll("hash1");
        System.out.println(hash2);

        System.out.println("hash1 的长度是: " + jedis.hlen("hash1"));

        System.out.println();
        // 3)关闭redis连接
        jedis.close();
    }

3、在工程 jedis (模块)中,修改 测试类 JedisTest.java 添加 testList 方法。


/**
 *   jedis\src\test\java\djh\it\jedis\test\JedisTest.java
 *
 *   2024-7-13 创建测试类 JedisTest.java
 */
package djh.it.jedis.test;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;

public class JedisTest {

    @Test  // String 类型数据测试方法
    public void testJedis(){
        // 1)连接redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 2)操作redis
        jedis.set ("name", "HellJedis");
        String name = jedis.get("name");

        System.out.println(name);

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

    @Test  // list 类型数据测试方法
    public void testList(){
        // 1)连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 2)操作redis
        jedis.lpush("list1", "o","l","l","e","H");
        jedis.rpush("list1", "Redis");

        List<String> list1 = jedis.lrange("list1", 0, -1);
        for (String s : list1){
            System.out.print(s);
        }

        System.out.println();
        System.out.println("list1 的长度是: " + jedis.llen("list1"));

        System.out.println();
        // 3)关闭redis连接
        jedis.close();
    }

    @Test  // hash 类型数据测试方法
    public void testHash(){
        // 1)连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);

        // 2)操作redis
        jedis.hset("hash1", "a1", "a1");
        jedis.hset("hash1", "a2", "a2");
        jedis.hset("hash1", "a3", "a3");
        jedis.hset("hash1", "a4", "a4");
        jedis.hset("hash1", "a5", "a5");
        jedis.hset("hash1", "a6", "a6");

        Map<String, String> hash1 = jedis.hgetAll("hash1");
        System.out.println(hash1);

        jedis.hset("hash1", "a1", "b1");
        jedis.hset("hash1", "a2", "a2");
        jedis.hset("hash1", "a3", "b3");
        jedis.hset("hash1", "a4", "a4");
        jedis.hset("hash1", "a5", "a5");
        jedis.hset("hash1", "a6", "b6");

        Map<String, String> hash2 = jedis.hgetAll("hash1");
        System.out.println(hash2);

        System.out.println("hash1 的长度是: " + jedis.hlen("hash1"));

        System.out.println();
        // 3)关闭redis连接
        jedis.close();
    }
}

4、打开 redis 服务端,运行测试类,进行测试。

JedisTest2.png

JedisTest3.png

四、jedis–业务请求次数控制案例需求分析

1、案例:服务调用次数控制

人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用。

案例要求
- 1)设定 ABC 三个用户
- 2A用户限制10/分调用,B用户限制30/分调用,C用户不限制。

2、案例: 需求分析

  • 1)设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用。
  • 2)在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案。
  • 3)对调用超限使用异常进行控制,异常处理设定为打印提示信息。
  • 4)主程序启动3个线程,分别表示3种不同用户的调用。

五、jedis–程序结构搭建

1、在工程 jedis (模块)中,创建 类 Service.java 和内部类。


/**
 *   jedis\src\main\java\djh\it\jedis\Service.java
 *
 *   2024-7-13 创建类 Service.java
 */
package djh.it.jedis;

public class Service {

    //业务操作
    public void business(){
        System.out.println("业务操作执行");
    }
}

//线程启动类
class MyThread extends Thread {
    Service sc = new Service();
    public void run(){
        while (true){
            sc.business();
        }
    }
}

//main方法
class Main {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        mt.run();
    }
}

2、运行类 Service.java 的内部类 Main.java 的 main() 方法。

六、jedis–程序代码实现

1、jedis–程序代码实现–案例:实现步骤1


    //业务操作:1)设定业务方法
    public void business(String id, Long val){       
        System.out.println("用户" + id + " 业务操作执行第 " + val + " 次");
    }

2、jedis–程序代码实现–案例:实现步骤2


//线程启动类:2)设定多线程类,模拟用户调用
class MyThread extends Thread {    
    Service sc;
    public MyThread(String id, int num){
        sc = new Service(id, num);
    }
    public void run(){
        while (true){           
            sc.service();
            try {                
                Thread.sleep(300L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

3、jedis–程序代码实现–案例:实现步骤3


    //控制单元:3)设计redis控制方案   
    public void service(){
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        String value = jedis.get("compid:" + id);
        try {
            //判断该值是否存在
            if(value == null){
                //不存在,创建该值               
                jedis.setex("compid:" + id, 8, 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();
        }        
    }

4、jedis–程序代码实现–案例:实现步骤4


//4)设计启动主程序
class Main {
    public static void main(String[] args) {
        MyThread mt1 = new MyThread("初级用户", 10);
        MyThread mt2 = new MyThread("高级级用户", 30);
        mt1.start();
        mt2.start();
    }
}

5、在工程 jedis (模块)中,修改 类 Service.java 中,添加控制单元方法等。


/**
 *   jedis\src\main\java\djh\it\jedis\Service.java
 *
 *   2024-7-13 创建类 Service.java
 */
package djh.it.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;

import java.util.jar.JarEntry;

public class Service {

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

    //控制单元
    //public void service(String id){
    public void service(){
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        String value = jedis.get("compid:" + id);
        try {
            //判断该值是否存在
            if(value == null){
                //不存在,创建该值
                //jedis.setex("compid:" + id, 20, Long.MAX_VALUE-10 + "");
                jedis.setex("compid:" + id, 8, Long.MAX_VALUE-num + "");
            }else{
                //存在,自增,调用业务
                Long val = jedis.incr("compid:" + id);
                //business(id, val);
                //business(id, Long.MAX_VALUE - val);
                //business(id, 10-(Long.MAX_VALUE - val));
                business(id, num-(Long.MAX_VALUE - val));
            }
        }catch (JedisDataException e){
            System.out.println("使用已经达到上限,请升级用户");
            return;
        }finally {
            jedis.close();
        }

        //jedis.close();
    }

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

//线程启动类
class MyThread extends Thread {
    //Service sc = new Service();
    Service sc;
    public MyThread(String id, int num){
        sc = new Service(id, num);
    }
    public void run(){
        while (true){
            //sc.business();
           //sc.service("初级用户");
            sc.service();
            try {
                //Thread.sleep(1000L);
                Thread.sleep(300L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//main方法
class Main {
    public static void main(String[] args) {
//        MyThread mt = new MyThread();
//        //mt.run();
//        mt.start();

        MyThread mt1 = new MyThread("初级用户", 10);
        MyThread mt2 = new MyThread("高级级用户", 30);
        mt1.start();
        mt2.start();
    }
}

6、运行类 Service.java 的内部类 Main.java 的 main() 方法,进行测试。

jedis案例.png

七、jedis–jedis 工具类制作

1、基于连接池获取连接


//JedisPool: Jedis提供的连接池技术
//	poolConfig:连接池配置对象
//	host:redis服务地址
//	port:redis服务端口号
	
public JedisPool (Generic0bjectPoolConfig poolConfig, string host, int port) {
	this (poolConfig, host, port,2000(String)null0(String) nu1l);
}

2、在工程 jedis (模块)中,创建工具类 JedisUtils.java


/**
 *  jedis.src.main.java.djh.it.jedis.utils.JedisUtils.java
 *
 *  2024-7-13 创建工具类 JedisUtils.java
 */
package djh.it.jedis.utils;

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

public class JedisUtils {

    public static Jedis getJedis(){
        JedisPoolConfig jpc = new JedisPoolConfig();
        jpc.setMaxTotal(30);
        jpc.setMaxIdle(10);

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

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

    public static void main(String[] args){
        JedisUtils.getJedis();
    }
}

3、在工程 jedis (模块)中,修改 类 Service.java 中,测试工具类


/**
 *   jedis\src\main\java\djh\it\jedis\Service.java
 *
 *   2024-7-13 创建类 Service.java
 */
package djh.it.jedis;

import djh.it.jedis.utils.JedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;

import java.util.jar.JarEntry;

public class Service {

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

    //控制单元
    //public void service(String id){
    public void service(){

        //Jedis jedis = new Jedis("127.0.0.1", 6379);
        Jedis jedis = JedisUtils.getJedis();

        String value = jedis.get("compid:" + id);
        try {
            //判断该值是否存在
            if(value == null){
                //不存在,创建该值
                //jedis.setex("compid:" + id, 20, Long.MAX_VALUE-10 + "");
                jedis.setex("compid:" + id, 8, Long.MAX_VALUE-num + "");
            }else{
                //存在,自增,调用业务
                Long val = jedis.incr("compid:" + id);
                //business(id, val);
                //business(id, Long.MAX_VALUE - val);
                //business(id, 10-(Long.MAX_VALUE - val));
                business(id, num-(Long.MAX_VALUE - val));
            }
        }catch (JedisDataException e){
            System.out.println("使用已经达到上限,请升级用户");
            return;
        }finally {
            jedis.close();
        }

        //jedis.close();
    }

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

//线程启动类
class MyThread extends Thread {
    //Service sc = new Service();
    Service sc;
    public MyThread(String id, int num){
        sc = new Service(id, num);
    }
    public void run(){
        while (true){
            //sc.business();
           //sc.service("初级用户");
            sc.service();
            try {
                //Thread.sleep(1000L);
                Thread.sleep(300L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

//main方法
class Main {
    public static void main(String[] args) {
//        MyThread mt = new MyThread();
//        //mt.run();
//        mt.start();

        MyThread mt1 = new MyThread("初级用户", 10);
        MyThread mt2 = new MyThread("高级级用户", 30);
        mt1.start();
        mt2.start();
    }
}

4、在工程 jedis (模块)中,创建 配置文件 redis.properties


#  jedis\src\main\resources\redis.properties

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

5、在工程 jedis (模块)中,修改 工具类 JedisUtils.java


/**
 *  jedis.src.main.java.djh.it.jedis.utils.JedisUtils.java
 *
 *  2024-7-13 创建工具类 JedisUtils.java
 */
package djh.it.jedis.utils;

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 int port;
    private static int maxTotal;
    private static int maxIdle;

    //静态代码块
    static {
        JedisPoolConfig jpc = new JedisPoolConfig();
//        jpc.setMaxTotal(30);
//        jpc.setMaxIdle(10);
//
//        String host = "127.0.0.1";
//        int port = 6379;

        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"));

        jpc.setMaxTotal(maxTotal);
        jpc.setMaxIdle(maxIdle);

        jp = new JedisPool(jpc, host, port);
    }

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

    public static void main(String[] args){
        JedisUtils.getJedis();
    }
}

八、jedis–可视化客户端介绍

1、redis-desktop-manager 下载安装

https://www.onlinedown.net/soft/10085694.htm

https://www.ddooo.com/softdown/93635.htm

https://www.xiazaiba.com/html/142075.html

2、jedis-可视化客户端 使用

  jedis-可视化客户端-1.png

jedis-可视化客户端-2.png

jedis-可视化客户端-3.png

jedis-可视化客户端-4.png

jedis-可视化客户端-5.png

jedis-可视化客户端-6.png

上一节关联链接请点击:
# Redis 入门到精通(二)通用指令

相关推荐

  1. Redis入门精通

    2024-07-15 16:44:02       31 阅读
  2. Python从入门精通秘籍

    2024-07-15 16:44:02       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 16:44:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 16:44:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 16:44:02       58 阅读
  4. Python语言-面向对象

    2024-07-15 16:44:02       69 阅读

热门阅读

  1. Eureka是什么?

    2024-07-15 16:44:02       22 阅读
  2. 享元模式(大话设计模式)C/C++版本

    2024-07-15 16:44:02       18 阅读
  3. html 关闭信息窗口

    2024-07-15 16:44:02       22 阅读
  4. vue3+springboot+minio,实现文件上传功能

    2024-07-15 16:44:02       20 阅读
  5. 使用Python进行桌面应用程序开发

    2024-07-15 16:44:02       16 阅读
  6. 启动 zabbix 相关服务

    2024-07-15 16:44:02       19 阅读
  7. 【AI应用探讨】—KAN应用场景

    2024-07-15 16:44:02       23 阅读
  8. 【无标题】

    2024-07-15 16:44:02       19 阅读
  9. 租用海外服务器需要考虑哪些因素

    2024-07-15 16:44:02       18 阅读
  10. 1448. 统计二叉树中好节点的数目

    2024-07-15 16:44:02       21 阅读