Jedis是什么
Jedis是Redis官方推荐的Java连接开发工具。要在Java开发中使用好Redis中间件,必须对Jedis熟悉才能写成漂亮的代码。
入门案例
在maven中导入Jedis的坐标。
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
创建测试类进行测试:
public class JedisTest {
@Test
public void testHelloRedis(){
//1.连接Jedis
Jedis jedis = new Jedis("localhost",6379);
//2.操作redis,jedis对应的方法名与Redis完全相同
jedis.set("str","Hello Jedis");
String str = jedis.get("str");
System.out.println(str);
//3.关闭连接
jedis.close();
}
}
启动服务器,运行测试方法:
小结:客户端连接Redis
1.连接Jedis
Jedis jedis = new Jedis("IP",port);
2.操作redis,jedis对应的方法名与Redis完全相同
3.关闭连接
jedis.close();
实现一个小案例
需求:
某网站为了推广,为大家提供了一个免费的调用接口,但是免费版的个人用户每30秒最多调用5次,如果充值升级为黄金版就可以每30秒调用15次。
假设有A,B两位用户,分别为免费版和黄金版,用Redis实现。
需求分析
- 设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用。
- 在业务调用前,服务调用控制单元,内部用redis进行控制。
- 当调用超限,使用异常进行控制,异常处理设定为打印提示信息。
- 主程序启动2个线程,分别表示2中不同用户的调用。
public class Service {
private String id;
public Service(String id) {
this.id = id;
}
//控制单元
public void control() {
//连接
Jedis jedis = new Jedis("localhost", 6379);
//操作
String value = jedis.get("id:" + id);
//判断该值是否存在
try {
long val = 0;
if (value == null) {
if(id.equals("免费版本")) val = 5;
else if(id.equals("黄金版本")) val = 15;
//不存在,创建
jedis.setex("id:" + id, 30, Long.MAX_VALUE - val + "");
} else {
//存在,自增
Long num = jedis.incr("id:" + id);
//调用接口
getService(id, num ,val);
}
} catch (JedisDataException e) {
System.out.println("亲爱的用户,您在30s内的使用次数已经达到上限,请稍后再试或充值。");
} finally {
//关闭
jedis.close();
}
}
//业务操作
public void getService(String id, Long num,Long val) {
num = Long.MAX_VALUE - num + val;
System.out.println(id + "用户,第" + num + "次从接口获取服务");
}
}
class MyThread extends Thread {
private Service service;
private String id;
public MyThread(String id) {
service = new Service(id);
}
public void run() {
while (true) {
service.control();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Main {
public static void main(String[] args) {
MyThread mt1 = new MyThread("免费版");
MyThread mt2 = new MyThread("黄金版");
mt1.start();
mt2.start();
}
}
Jedis连接池工具类
配置文件中写入需要的参数:
redisConfig.properties
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=30
redis.maxIdle=10
工具类:
public class JedisUtils {
public static JedisPool jp;
private static int port;
private static int maxTotal;
private static int maxIdle;
static {
JedisPoolConfig jpc = new JedisPoolConfig();
ResourceBundle rb = ResourceBundle.getBundle("redisConfig");
String 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"));
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
jp = new JedisPool(jpc, host, port);
}
//从连接池中获取一个连接
public static Jedis getJedis() {
return jp.getResource();
}
}