jedis-程序代码实现| 学习笔记

简介: 快速学习 jedis-程序代码实现

开发者学堂课程【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的,控制台只能完成这个效果了,最后就是启动程序,设置一个不同的用户级别,然后名称的区分,最后通过次数进行一个控制,在实际制作中可以继续做这个案例,对这个方案进行一个改造,在使用次数方面还有一个判断。

相关文章
vue3使用vue-clipboard3复制到剪切板
vue3使用vue-clipboard3复制到剪切板
3487 0
|
Dart Linux 编译器
Linux | 编译器gcc/g++的使用【动静态库的认识】-2
Linux | 编译器gcc/g++的使用【动静态库的认识】
419 0
|
数据管理 数据库 索引
干货 | Elasticsearch Nested类型深入详解
本文通过一个例子将Nested类型适合解决的问题、应用场景、使用方法串起来,文中所有的DSL都在Elasticsearch6.X+验证通过。
1655 0
|
3天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1054 151
|
4天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1738 9