【redis教程】7、使用 jedis 操作 reids 数据库

快速体验jedis

Jedis是Redis官方推荐的Java连接开发工具。
创建maven工程,jedis坐标:

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

创建测试类JedisTest

public class JedisTest {
    @Test
    public void testJedis() {
        // 1. 连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        // 2. 操作redis
        jedis.set("name", "aa");
        // 3.关闭reids
        jedis.close();
    }
}

经过上面3个操作我就可以在redis数据库中保存一条数据,现在打开客户端去看一下:
在这里插入图片描述

使用jedis来完成一个小案例

有一个服务,A、B、C三个用户来调用,
A用户限制10次/分钟,
B用户限制20次/分钟,
C用户限制30次/分钟。

案例分析
我可以给每个用户创建以String类型的存储空间,并且设置相应的timeout,在时间超时之前每调用一次就把用户的值加 1,当加到限制次数则进行限制。

代码实现
首先我先定义一个服务类Service类来代表语音识别的服务,Service类有两个成员变量,一个是用户id,另一个是num,来标记此用户每间隔时间可以调用的次数。这里为方便测试,我们间隔时间设为5秒。

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);
        String value = jedis.get("compid" + id);
        try {
            if (value == null) {
                jedis.setex("compid" + id, 5, Long.MAX_VALUE - num + "");
            } else { // 如果用户存在,就把访问次数加 1
                Long incr = jedis.incr("compid" + id);
                doService(id, num-(Long.MAX_VALUE-incr));
            }
        } catch (JedisDataException e) {
            System.out.println(id + " 使用次数到达上限");
        } finally {
            jedis.close();
        }
    }
    public void doService(String id, Long incr) {
        System.out.println("用户:" + id + " 使用次数:" + incr);
    }
}

doService函数才是真正的服务,要满足条件才能调用到,这里条件是每5秒调用次数不超过传入的num。

下面我使用多线程来模拟用户A、B、C,每个用户调用service的间隔为100毫秒,代码如下:

class MyThread extends Thread {
    Service service;
    public MyThread(String id, int num) {
        service = new Service(id, num);
    }

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

class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread("A", 10);
        MyThread thread2 = new MyThread("B", 20);
        MyThread thread3 = new MyThread("C", 30);
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

运行程序,观察输出:

A 使用次数到达上限
B 使用次数到达上限
C 使用次数到达上限
A 使用次数到达上限
B 使用次数到达上限
C 使用次数到达上限
用户:A 使用次数:1
用户:B 使用次数:1
用户:C 使用次数:1

这里截取一段输出,可以看到ABC到达上限就不再调用doService了,5秒时效过后,redis会把用户对用的数据清掉,所以又可以重新调用doService。

发布了28 篇原创文章 · 获赞 1 · 访问量 1856

猜你喜欢

转载自blog.csdn.net/m0_46130323/article/details/104268535