Jedis
- Jedis简介
- Hello World
- 准备工作
- 客户端连接Redis
- Jedis读写Redis数据
- 案例:服务调用次数控制
- Jedis简易工具类开发
- 基于连接池获取连接
- 封装连接参数
Jedis简介
- Java语言连接Redis
- Jedis
- SpringData Redis
- lettuce
- 可视化连接Redis客户端
- Redis Desktop Manager
- Redis Client
- Redis Studio
Hello World
准备工作
- jar包导入
下载地址:https://mvnrepository.com/artifact/redis.clients/jedis - 基于maven
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
客户端连接Redis
- 连接redis
- 操作redis
- 关闭redis
代码演示:
package com.bupt.edu.cn;
import redis.clients.jedis.Jedis;
public class JedisTest {
public static void main(String[] args) {
// 1.连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.auth("your password"); // 连接redis的密码
// 2.操作redis
jedis.set("name", "Eamon");
String name = jedis.get("name");
System.out.println(name);
// 3.关闭redis
jedis.close();
}
}
Jedis读写Redis数据
通过一个案例来演示Jedis的读写
案例:服务调用次数控制
人工智能领域的语音识别,讯飞免费开放给企业试用,同时讯飞训练自己的模型。现对用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用。
- 案例需求
- 设定两个级别A、B类型用户
- A用户限制10次/分钟,B用户限制30次/分钟
- 需求分析
- 设定一个服务方法,模拟实际业务调用的服务。简化为打印信息
- 在业务调用前调用控制单元,内部使用redis进行控制
- 对调用超过限度的用户进行控制,异常处理简化为打印提示信息
- 主程序启动2个线程,分别表示两个不同用户的调用
代码演示如下:
package com.bupt.edu.cn;
import com.bupt.edu.cn.util.JedisUtils;
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);
// Jedis jedis = JedisUtils.getJedis();
jedis.auth("24862486");
String value = jedis.get("compid:" + id);
// 判断该值是否存在
try {
if (value == null) {
// 不存在,创建该值
// long.MAX_VALUE-num 当超出的时候就会报错,进入catch,通过这个逻辑判断是否使用次数超过num
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);
}
@Override
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();
}
}
Jedis简易工具类开发
基于连接池获取连接
- JedisPool:Jedis提供的连接池技术
poolConfig:连接池配置对象
host:redis服务地址
port:redis服务端口号
public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port){
this(poolConfig, host, port, 2000, (String)null, 0, (Strng)null);
}
封装连接参数
- jedis.properties
jedis.host=localhost
jedis.port=6379
jedis.maxTotal=30
jedis.maxIdle=10
代码演示:
package com.bupt.edu.cn.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class JedisUtils {
private static JedisPool jp = null;
private static String host = null;
private static Integer port;
private static Integer maxTotal;
private static Integer maxIdle;
static {
ResourceBundle rb = ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
jp = new JedisPool(jpc, host, port);
}
public static Jedis getJedis() {
return jp.getResource();
}
}
此时在Jedis读写Redis的示例中,获取jedis时,可以将
Jedis jedis = new Jedis("127.0.0.1", 6379);
替换为
Jedis jedis = JedisUtils.getJedis();
这样可以达到解耦的效果,将数据库配置和代码分离开。
点击查看关于Java读取配置文件的更多方式。