快速体验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。