# (一)前言 {#一-前言}
如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。Java语言通过JDBC操作mysql,用Jedis操作redis。当然了,java操作redis的方式不止jedis一种,现在我们主要使用Jedis来操作redis。
# (二)第一个jedis项目 {#二-第一个jedis项目}
# 2.1 搭建项目 {#_2-1-搭建项目}
首先搭建一个空的maven项目,在pom.xml中导入redis的依赖,我同时还导入了junit的依赖用于测试。
<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
# 2.2 创建测试类 {#_2-2-创建测试类}
在test包下创建测试类JedisTest,操作redis比操作mysql更简单,只需要以下三步:
1.连接jedis
2.操作jedis
3.关闭连接
public class JedisTest {
@Test
public void testJedis(){
//1.连接jedis
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.操作jedis
jedis.set("name","sdxb");
String name = jedis.get("name");
System.out.println(name);
//3.关闭连接
jedis.close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
其中第二步操作jedis中的操作和redis语法一致。查看结果:
# (三)请求调用次数的限制案例代码模拟 {#三-请求调用次数的限制案例代码模拟}
在之前的一篇博客中我用redis模拟了请求调用次数限制案例,这一次就用java真实模拟后端逻辑,代码逻辑和之前所讲的redis操作逻辑一致。
public class Service {
//请求模拟
public void call(){
System.out.println("调用服务");
}
//用户限制模拟,传入用户id
public void limitcall(String id){
Jedis jedis = new Jedis("127.0.0.1", 6379);
String value = jedis.get("user" + id);
//第一步,查看该值是否存在
try {
if (value==null){
//如果不存在,创建值,设置生命周期为20s
jedis.setex("user"+id,20,Long.MAX_VALUE-10+"");
}else{
//如果存在,则加1,直到超过最大值抛出异常
jedis.incr("user"+id);
call();
}
}catch (JedisDataException e){
//超过最大值(即每20s访问超过10次),执行异常
System.out.println("达到请求上限,稍后再试");
return;
}finally {
jedis.close();
}
}
}
//多线程一直调用服务
class MyThread extends Thread{
Service service=new Service();
@Override
public void run() {
while (true){
service.limitcall("用户A");
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyThread myThread=new MyThread();
myThread.run();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
查看结果,当20秒内调用服务达到10次时,再调用就会执行异常
# (四)搭建一个Jedis工具类 {#四-搭建一个jedis工具类}
如果每一次要使用Jedis都生成连接一次Jedis对象,就显得很麻烦,因此有必要写一个工具类方便重复调用。工具类的编写不难,通过Jedis自带的线程池调用线程就行。
public class JedisUtil {
private static JedisPool jedisPool=null;
static {
//配置线程池
JedisPoolConfig config=new JedisPoolConfig();
//设置最大空闲等待数
config.setMaxIdle(10);
//设置最大连接数
config.setMaxTotal(30);
jedisPool=new JedisPool(config,"127.0.0.1",6379);
}
//通过该方法获取jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在使用时将我们之前通过Jedis对象调用的方式换成工具类调用即可,修改上面案例的第八行:
// Jedis jedis = new Jedis("127.0.0.1", 6379);
Jedis jedis=JedisUtil.getJedis();
1
2
还有一个小问题,如果把配置的具体信息都写在程序内部,如果要修改就需要重新启动整个项目,所以可以将配置信息写到配置文件中。在resource文件下新建jedis.properties
redis.host = 127.0.0.1
redis.port = 6379
redis.maxidle = 10
redis.maxtotal = 30
1
2
3
4
修改工具类
public class JedisUtil {
private static JedisPool jedisPool=null;
static {
//通过配置文件修改参数
ResourceBundle rb=ResourceBundle.getBundle("jedis");
String host = rb.getString("redis.host");
int port = Integer.parseInt(rb.getString("redis.port"));
int maxidle = Integer.parseInt(rb.getString("redis.maxidle"));
int maxtotal= Integer.parseInt(rb.getString("redis.maxtotal"));
//配置线程池
JedisPoolConfig config=new JedisPoolConfig();
//设置最大空闲等待数
config.setMaxIdle(maxidle);
//设置最大连接数
config.setMaxTotal(maxtotal);
jedisPool=new JedisPool(config,host,port);
}
//通过该方法获取jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22