vlambda博客
学习文章列表

redis入门到精通系列(四):Jedis--使用java操作redis详解

(一)前言

如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。Java语言通过JDBC操作mysql,用Jedis操作redis。当然了,java操作redis的方式不止jedis一种,现在我们主要使用Jedis来操作redis。

(二)第一个jedis项目

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>

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(); }}

其中第二步操作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(); }}

查看结果,当20秒内调用服务达到10次时,再调用就会执行异常

(四)搭建一个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(); }}

在使用时将我们之前通过Jedis对象调用的方式换成工具类调用即可,修改上面案例的第八行:

 
   
   
 
// Jedis jedis = new Jedis("127.0.0.1", 6379);Jedis jedis=JedisUtil.getJedis();

还有一个小问题,如果把配置的具体信息都写在程序内部,如果要修改就需要重新启动整个项目,所以可以将配置信息写到配置文件中。在resource文件下新建jedis.properties

 
   
   
 
redis.host = 127.0.0.1redis.port = 6379redis.maxidle = 10redis.maxtotal = 30

修改工具类


 
   
   
 
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(); }}