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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习 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的,控制台只能完成这个效果了,最后就是启动程序,设置一个不同的用户级别,然后名称的区分,最后通过次数进行一个控制,在实际制作中可以继续做这个案例,对这个方案进行一个改造,在使用次数方面还有一个判断。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
监控 算法 Java
【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?
|
3月前
|
存储 设计模式 监控
【JavaEE】多线程案例-线程池
【JavaEE】多线程案例-线程池
|
4月前
|
存储 缓存 NoSQL
SpringBoot整合Redis调用lua脚本出现空指针异常(序列化器问题)
一、问题描述 业务中出现需要保证原子性的一系列缓存操作,所以决定使用lua脚本来保证原子性。 但是调用过程中lua脚本抛出了异常:attempt to perform arithmetic on local ‘xxx’ (a nil value) 发生异常的lua脚本代码(部分)
|
6月前
|
NoSQL 算法 Java
Java 最常见的面试题:redis 分布式锁有什么缺陷?
Java 最常见的面试题:redis 分布式锁有什么缺陷?
|
6月前
|
NoSQL Java API
Java 最常见的面试题:jedis 和 redisson 有哪些区别?
Java 最常见的面试题:jedis 和 redisson 有哪些区别?
|
9月前
|
NoSQL Java Redis
jedis zrangebyscore的返回值踩坑记
最近在使用jedis 操作redis,在处理一个sortedset key的返回值时遇到一个棘手的问题。
108 1
|
NoSQL Java Redis
jedis-jedis 常规操作演示 | 学习笔记
快速学习jedis-jedis 常规操作演示
74 0
|
NoSQL Redis 开发者
jedis-程序结构搭建 | 学习笔记
快速学习 jedis-程序结构搭建
31 0
|
NoSQL Java Redis
jedis 工具类制作 | 学习笔记
快速学习 jedis 工具类制作
235 0
|
NoSQL Java Redis
jedis-helloworld(jedis版) | 学习笔记
快速学习jedis-helloworld(jedis版)
56 0