案例:服务调用次数控制

案例:服务调用次数控制

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

  • 案例要求:

    1. 设定A、B、C三个用户

    2. A用户限制10次/分调用,B用户限制30次/分调用,C用户不进行限制

  • 需求分析

    1. 设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用

    2. 在业务调用前服务调用控制单元,内部使用redis进行控制

    3. 对调用超限使用异常进行控制,异常处理设置为打印提示信息

    4. 主程序启动三个线程,分别表示3中不同用户的调用

  • 具体代码实现
package com.gcy;

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);
String value = jedis.get("compid" + id);
try {

if (value == null) {
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);
}
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();
}
}
这个实例没有达到上面要求,但是基本需求已经达到了
原文地址:https://www.cnblogs.com/juddy/p/12927485.html