Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • MySQL

  • Redis

    • 入门redis看这一篇就够了
    • redis入门到精通系列(二):redis操作的两个实践案例
    • key的通用操作和redis内部db的通用操作
    • Jedis--使用java操作redis详解
      • (一)前言
      • (二)第一个jedis项目
        • 2.1 搭建项目
        • 2.2 创建测试类
      • (三)请求调用次数的限制案例代码模拟
      • (四)搭建一个Jedis工具类
    • redis的持久化看这一篇就够了
    • redis的事务详解
    • redis高级数据类型详解
    • redis的高可用--主从复制详解
    • redis哨兵模式详解
    • springboot快速集成redis
    • redis的缓存穿透、缓存击穿以及缓存雪崩
    • 看完这一篇文章别再说不懂布隆过滤器
  • MongoDB

  • 数据库系列
  • Redis
CodeEase
2023-10-09
目录

Jedis--使用java操作redis详解

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)前言

如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。Java语言通过JDBC操作mysql,用Jedis操作redis。当然了,java操作redis的方式不止jedis一种,现在我们主要使用Jedis来操作redis。

# (二)第一个jedis项目

# 2.1 搭建项目

首先搭建一个空的maven项目,在pom.xml中导入redis的依赖,我同时还导入了junit的依赖用于测试。

<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>

1
2
3
4
5
6
7
8
9
10
11
12
13

# 2.2 创建测试类

在test包下创建测试类JedisTest,操作redis比操作mysql更简单,只需要以下三步:

1.连接jedis

2.操作jedis

3.关闭连接

public class JedisTest {
    @Test
    public void testJedis(){
        //1.连接jedis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //2.操作jedis
        jedis.set("name","sdxb");
        String name = jedis.get("name");
        System.out.println(name);
        //3.关闭连接
        jedis.close();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

其中第二步操作jedis中的操作和redis语法一致。查看结果:

4-1.jpg

# (三)请求调用次数的限制案例代码模拟

在之前的一篇博客中我用redis模拟了请求调用次数限制案例,这一次就用java真实模拟后端逻辑,代码逻辑和之前所讲的redis操作逻辑一致。

public class Service {
    //请求模拟
    public void call(){
        System.out.println("调用服务");
    }
    //用户限制模拟,传入用户id
    public void limitcall(String id){
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        String value = jedis.get("user" + id);
        //第一步,查看该值是否存在
        try {
            if (value==null){
                //如果不存在,创建值,设置生命周期为20s
                jedis.setex("user"+id,20,Long.MAX_VALUE-10+"");
            }else{
                //如果存在,则加1,直到超过最大值抛出异常
                jedis.incr("user"+id);
                call();
            }
        }catch (JedisDataException e){
            //超过最大值(即每20s访问超过10次),执行异常
            System.out.println("达到请求上限,稍后再试");
            return;
        }finally {
            jedis.close();
        }
    }
}
//多线程一直调用服务
class MyThread extends Thread{
    Service service=new Service();
    @Override
    public void run() {
        while (true){
            service.limitcall("用户A");
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.run();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

查看结果,当20秒内调用服务达到10次时,再调用就会执行异常

4-2.jpg

# (四)搭建一个Jedis工具类

如果每一次要使用Jedis都生成连接一次Jedis对象,就显得很麻烦,因此有必要写一个工具类方便重复调用。工具类的编写不难,通过Jedis自带的线程池调用线程就行。

public class JedisUtil {
    private static JedisPool jedisPool=null;
    static {
        //配置线程池
        JedisPoolConfig config=new JedisPoolConfig();
        //设置最大空闲等待数
        config.setMaxIdle(10);
        //设置最大连接数
        config.setMaxTotal(30);
        jedisPool=new JedisPool(config,"127.0.0.1",6379);
    }
    //通过该方法获取jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

在使用时将我们之前通过Jedis对象调用的方式换成工具类调用即可,修改上面案例的第八行:

// Jedis jedis = new Jedis("127.0.0.1", 6379);
Jedis jedis=JedisUtil.getJedis();
1
2

还有一个小问题,如果把配置的具体信息都写在程序内部,如果要修改就需要重新启动整个项目,所以可以将配置信息写到配置文件中。在resource文件下新建jedis.properties

redis.host = 127.0.0.1
redis.port = 6379
redis.maxidle = 10
redis.maxtotal = 30
1
2
3
4

修改工具类

public class JedisUtil {
    private static JedisPool jedisPool=null;
    static {
        //通过配置文件修改参数
        ResourceBundle rb=ResourceBundle.getBundle("jedis");
        String host = rb.getString("redis.host");
        int port = Integer.parseInt(rb.getString("redis.port"));
        int maxidle = Integer.parseInt(rb.getString("redis.maxidle"));
        int maxtotal= Integer.parseInt(rb.getString("redis.maxtotal"));
        //配置线程池
        JedisPoolConfig config=new JedisPoolConfig();
        //设置最大空闲等待数
        config.setMaxIdle(maxidle);
        //设置最大连接数
        config.setMaxTotal(maxtotal);
        jedisPool=new JedisPool(config,host,port);
    }
    //通过该方法获取jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上次更新: 2025/04/29, 17:22:06
key的通用操作和redis内部db的通用操作
redis的持久化看这一篇就够了

← key的通用操作和redis内部db的通用操作 redis的持久化看这一篇就够了→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式