开发者学堂课程【Redis 入门到精通(基础篇): jedis-程序代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/764/detail/13408
Jedis-程序代码实现
内容介绍
一、代码
二、案例:实现步骤
三、总结
一、代码
package com.itheima;
import redis.clients.jedis.Jedis;
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(host:"127.0.0.1",port:6379);
String value = jedis.get("compid:"+id);
//判断该值是否存在
Try{
if(value == null){
//不存在,创建该值
Jedis.setex(key:"compid:"+id,20,long.MAX_VALUE-num+"");
}else{
//存在,自增,调用业务
Long val = Jedis.incr(key:"compid"+id);
Business(id,val: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 void run(String id,int num){
Sc = new Service(id,num);
}
Public void run(){
while(true){
sc.service(id:);
try {
Thread.sleep(millis:"1000L");
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
Class Main{
Public static void main(String[] args) {
MyThread mt1 = new MyThread(id:"初级用户"10);
MyThread mt2 = new MyThread(id:"高级用户"30);
Mt1.start();
Mt2.start();
}
}
控制单元做到业务类里面,加一个控制单元,这里要做的就是控制business的调用,这里主要的调用就变成了business,把下面改成service,,想一想控制单元怎么做,我们使用redis控制,先取出redis的控制单元的值,然后去判断,这个时候这个值是一个什么状态,我就让你自增1,如果出问题了,怎么办,于是在这里面就要用到redis,三步,连上,关上,中间是操作。
在这里需要做什么,要获取到控制这个用户调用次数那个值,然后对这个值进行操作,加一个compid+id,这就是对应的值,id现在没有,从外面传进来,无论在哪里都需要写进去,然后加一个id初级用户,然后显示的就是那里的值了,然后有了这个值就要去判断,有的话就可以自增,没有就先创建一个,控制台的次数一点点去加,判断是否等于空,redis是nil,这里是null,
如果说不存在就需要创建这个值,然后这个时候结构就出来了,这个时候set这个值,可以调用也可以直接ex,设置三个值,时间可以自己去调,然后我们设定最大值,就可以去去范围最大值,到达最大值再进行判断,准备执行几次就在最大值减去几,后面加一个字符串,就可以实现了,这是存在的情况,如果说不存在的话,自增就加上了,到这里redis写完了,调用业务,business,结构完成,就可以运行了。
运行看一下效果,程序进行了十次业务执行,然后报了异常,原因是在自增的时候,数据会溢出,也就是达到了最大值,达到最大次数,对代码进行一个处理,处理的时候捕获的异常jedisdataexception,这就是我们爆掉的异常的名称,进行一个数据处理,由于不用做复杂的处理,给用户一个提醒,你这个已经到达了上限,在这个时候操作已经结束了,后面加一个return,结束运行,然后写一个finally,最后进行关闭,如果我们开了一下,做的判断,然后程序直接进入最后一步,那么有没有去关这个close,最后是没有关的,这个时候就出问题了,然后我们接下来把try去升,把catch下降到后面,整体往里面缩一下,整个业务使用try、catch监控,其实主要监控的还是if判断那一部分,连接过大会爆掉,然后再次运行,显示使用次数以达到上限,请升级会员级别,看上去程序已经稍微健壮了一些,现在程序跑的太快,有些效果看不出来,我们给降一下速度,在多线程每调用一次,进行一次休眠,模拟真实用户的情况,中间是会有间隙的,这样程序跑的不那么疯狂,建立一个时间节点,1000ms,如果说想花样一点,那就做一个随机数,随机产生一个偏差值,这样就不至于是一样的时间间隔,运行,变得就温柔多了,达到上限就会提醒,但是没有数据显示,然后现在加几个小的处理,加上运行的次数,就需要把值传过来,incr的返回值不是一个字符串,
在Java的jedis里面,这个操作返回的是long值,用long取出,加一个long val =,这样就可以传过去了,然后考虑到多用户,加上id一块传过来,然后加一下用户id以及第几次,然后这个数据就特别大,然后把这个值处理一下,变为用最大值减去val,然后这个时候数据是倒着的,就在前面用10减掉就好,将操作时间变少,那么等待时间也适当去降低,过一段时间会清空再次重复,如果要做第二用户,那么就在多线程这里添加一个用户,进行区分,问题在于如何去区分,将下面主函数改一下,然后上面的构造函数也需要加上,然后将"初级用户"删掉,上面的sc 去掉声明一下,然后上面id就可以传过来了,然后我们下面设置了高级跟低级用户,但是上面控制还是在十次, 我们要解决这个问题就需要去写一个配置文件,在里面写上初级用户是多少次,高级用户是多少次,然后运行看一下效果。
由于时间跳动不大,时间周期到达后,全部清空恢复了,这个就把不同的客户区分开了,然后如果说是超级VIP不受限制,就在判断区进行一个判断,根据级别,如果是这个级别,直接进行业务的调用,如果不是那就继续进行下一步。
二、案例:实现步骤
1、设定业务方法public void business (String id, Long val) {
system.out.println(
"用户:"+id+"业务执行操作第"+val+"次");
}
2、设定多线程类,模拟用户调用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();
}
}
3、设计redis控制方案
//控制单元public vo1d 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();
}
}
4、设计启动主程序
Public static void main(String[] args) {
MyThread mt1 = new MyThread(id:"初级用户"10);
MyThread mt2 = new MyThread(id:"高级用户"30);
Mt1.start();
Mt2.start();
}
三、总结
分了四步,首先定义了一个业务方法,这个是最终版的,然后设定了一个多线程类,模拟用户调用,多线程类主要的一点是调用原来的业务方法,让他无限运行,要有休眠时间,休眠时间建议随机数加一个固定时间,或者正负一个值,让随机现象产生出来,
接下来设计 redis 控制方案,获取值,然后判断是否存在,然后 incr,时间调的不要太快,最重要的是用 MAX 值控制结束,还有一个异常处理,这个是比较 low的,控制台只能完成这个效果了,最后就是启动程序,设置一个不同的用户级别,然后名称的区分,最后通过次数进行一个控制,在实际制作中可以继续做这个案例,对这个方案进行一个改造,在使用次数方面还有一个判断。