未进化的程序猿
人生最苦痛的是梦醒了无路可走。做梦的人是幸福的;倘没有看出可走的路,最要紧的是不要去惊醒他。鲁迅

1、编程语言与redis 

 Java语言连接redis服务 

1)、Java语言连接redis服务 Jedis SpringData Redis Lettuce 

2)、C 、C++ 、C# 、Erlang、Lua 、Objective-C 、Perl 、PHP 、Python 、Ruby 、Scala

3)、可视化连接redis客户端Redis Desktop Manager Redis Client Redis Studio

2、HelloWorld 

准备工作 

1)、jar包导入 

下载地址:https://mvnrepository.com/artifact/redis.clients/jedis 

2)、基于maven 

<dependencies>
        <!--导入Jedis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!--导入junit测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
        </dependency>
</dependencies>

客户端连接redis 

1)、连接redis 

Jedis jedis = new Jedis("localhost", 6379); 

2)、操作redis 

jedis.set("name", "itheima"); 
jedis.get("name"); 

3)、关闭redis连接 

jedis.close(); 

4)、API文档 

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

    @Test
    public void testJedis(){
        //1、连接redis
        /*
            参数1 : 表示连接服务的URL
            参数2 : 表示连接服务的端口号
         */
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //2、操作redis
        jedis.set("username","zhangsan");
        //操作redis读取key的值
        String username = jedis.get("username");
        System.out.println("username: " + username); //username: zhangsan
        //3、关闭连接
        jedis.close();
    }

3、Jedis读写redis数据 

案例:服务调用次数控制 

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

 1)、案例要求 

① 设定A、B、C三个用户

② A用户限制10次/分调用,B用户限制30次/分调用,C用户不限制 

案例:需求分析 

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

② 在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的方案

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

④ 主程序启动3个线程,分别表示3种不同用户的调用 

案例:实现步骤 

1)、设定业务方法 

void business(String id,long num){     
      System.out.println("用户"+id+"发起业务调用,当前第"+num+"次"); 
}     

2)、设定多线类,模拟用户调用 

public void run(){ 
    while(true){ 
        jd.service(id); 
        // 模拟调用间隔,设定为 1.x 秒
         try{ 
            Random r  = new Random(); 
            Thread.sleep(1000+ r.nextInt(200)); 
        }catch (InterruptedException e){ 
            e.printStackTrace();; 
        } 
    } 
} 

3)、 设计redis控制方案 

void service(String id){     
        Jedis jedis = new Jedis("localhost", 6379);     
        String value = jedis.get("compid:" + id);     
        // 判定是否具有调用计数控制,利用异常进行控制处理
        if(value == null) {        
         // 没有控制,创建控制计数器
         jedis.setex("compid:" + id, 20, ""+(Long.MAX_VALUE-10));     
         }else{         
         // 有控制,自增,并调用业务
         try{            
                  Long val = jedis.incr("compid:"+id);             
                  business(id,10+val-Long.MAX_VALUE);         
         }catch (JedisDataException e){             
                   // 调用次数溢出,弹出提示
                  System.out.println("用户:"+id+"使用次数已达到上限,请稍后再试,或升级VIP会员"); 
            
                   return;         
         }finally{             
                   jedis.close();         
         }     
     } 
}         

 4)、设计启动主程序 

public static void main(String[] args) {     
    MyThread t1 = new MyThread("初级用户"); 
    t1.start(); 
}

后续1:对业务控制方案进行改造,设定不同用户等级的判定

后续2:将不同用户等级对应的信息、限制次数等设定到redis中,使用hash保存 

package com.gmw.server;

import com.gmw.utils.JedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;

public class Service {
    private String id;
    private Integer num;

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

    //控制单元
    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,5,Long.MAX_VALUE-num+"");
            }else{
                //存在,自增,调用业务
                Long incr = jedis.incr("compid:" + id);
                //调用业务
                business(id,num-(Long.MAX_VALUE-incr));
            }
        }catch (JedisDataException exception){
            System.out.println("使用已经到达次数上限,请升级会员级别");
            return;
        }finally {
            jedis.close();
        }
    }
    //业务操作
    public void business(String id,Long incr){
        System.out.println("用户id"+id+"业务操作成功"+incr+"次");
    }
}

class MyThead extends Thread{
    Service service = null;
    public MyThead(String id,Integer num){
        service = new Service(id, num);
    }
    @Override
    public void run() {
        while (true) {
            service.service();
            try {
                sleep(300L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Main{
    public static void main(String[] args) {
        new MyThead("初级用户",10).start();
        new MyThead("高级用户",20).start();
    }
}

 

 

posted on 2020-12-14 01:49  甘茂旺  阅读(190)  评论(0编辑  收藏  举报