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

(一)前言

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

(二)第一个jedis项目

2.1 搭建项目

首先搭建一个空的maven项目,在pom.xml中导入redis的依赖,我同时还导入了junit的依赖用于测试,完整代码文末自取。

  1. <dependencies>
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>2.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.12</version>
  11. </dependency>
  12. </dependencies>

2.2 创建测试类

在test包下创建测试类JedisTest,操作redis比操作mysql更简单,只需要以下三步:

1.连接jedis

2.操作jedis

3.关闭连接

  1. public class JedisTest {
  2. @Test
  3. public void testJedis(){
  4. //1.连接jedis
  5. Jedis jedis = new Jedis("127.0.0.1", 6379);
  6. //2.操作jedis
  7. jedis.set("name","sdxb");
  8. String name = jedis.get("name");
  9. System.out.println(name);
  10. //3.关闭连接
  11. jedis.close();
  12. }
  13. }

其中第二步操作jedis中的操作和redis语法一致。查看结果:

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

(三)请求调用次数的限制案例代码模拟

在之前的一篇博客中我用redis模拟了请求调用次数限制案例,这一次就用java真实模拟后端逻辑,代码逻辑和之前所讲的redis操作逻辑一致。详情请看:redis入门到精通系列(二):redis操作的两个实践案例

  1. public class Service {
  2. //请求模拟
  3. public void call(){
  4. System.out.println("调用服务");
  5. }
  6. //用户限制模拟,传入用户id
  7. public void limitcall(String id){
  8. Jedis jedis = new Jedis("127.0.0.1", 6379);
  9. String value = jedis.get("user" + id);
  10. //第一步,查看该值是否存在
  11. try {
  12. if (value==null){
  13. //如果不存在,创建值,设置生命周期为20s
  14. jedis.setex("user"+id,20,Long.MAX_VALUE-10+"");
  15. }else{
  16. //如果存在,则加1,直到超过最大值抛出异常
  17. jedis.incr("user"+id);
  18. call();
  19. }
  20. }catch (JedisDataException e){
  21. //超过最大值(即每20s访问超过10次),执行异常
  22. System.out.println("达到请求上限,稍后再试");
  23. return;
  24. }finally {
  25. jedis.close();
  26. }
  27. }
  28. }
  29. //多线程一直调用服务
  30. class MyThread extends Thread{
  31. Service service=new Service();
  32. @Override
  33. public void run() {
  34. while (true){
  35. service.limitcall("用户A");
  36. try {
  37. Thread.sleep(1000L);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. public static void main(String[] args) {
  44. MyThread myThread=new MyThread();
  45. myThread.run();
  46. }
  47. }

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

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

(四)搭建一个Jedis工具类

如果每一次要使用Jedis都生成连接一次Jedis对象,就显得很麻烦,因此有必要写一个工具类方便重复调用。工具类的编写不难,通过Jedis自带的线程池调用线程就行。

  1. public class JedisUtil {
  2. private static JedisPool jedisPool=null;
  3. static {
  4. //配置线程池
  5. JedisPoolConfig config=new JedisPoolConfig();
  6. //设置最大空闲等待数
  7. config.setMaxIdle(10);
  8. //设置最大连接数
  9. config.setMaxTotal(30);
  10. jedisPool=new JedisPool(config,"127.0.0.1",6379);
  11. }
  12. //通过该方法获取jedis对象
  13. public static Jedis getJedis(){
  14. return jedisPool.getResource();
  15. }
  16. }

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

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

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

  1. redis.host = 127.0.0.1
  2. redis.port = 6379
  3. redis.maxidle = 10
  4. redis.maxtotal = 30

 修改工具类:

  1. public class JedisUtil {
  2. private static JedisPool jedisPool=null;
  3. static {
  4. //通过配置文件修改参数
  5. ResourceBundle rb=ResourceBundle.getBundle("jedis");
  6. String host = rb.getString("redis.host");
  7. int port = Integer.parseInt(rb.getString("redis.port"));
  8. int maxidle = Integer.parseInt(rb.getString("redis.maxidle"));
  9. int maxtotal= Integer.parseInt(rb.getString("redis.maxtotal"));
  10. //配置线程池
  11. JedisPoolConfig config=new JedisPoolConfig();
  12. //设置最大空闲等待数
  13. config.setMaxIdle(maxidle);
  14. //设置最大连接数
  15. config.setMaxTotal(maxtotal);
  16. jedisPool=new JedisPool(config,host,port);
  17. }
  18. //通过该方法获取jedis对象
  19. public static Jedis getJedis(){
  20. return jedisPool.getResource();
  21. }
  22. }

最后还是把这个项目的代码放在github下: github