zoukankan      html  css  js  c++  java
  • 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模拟了请求调用次数限制案例,这一次就用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次时,再调用就会执行异常

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

     

     

  • 相关阅读:
    Django学习日记04_模板_overview
    Python并发实践_01_线程与进程初探
    web自动化测试笔记(二)
    web自动化测试笔记(一)
    app版本升级的测试点
    移动测(APP)试与web端测试的区别
    Dubbo服务器与普通服务器的区别
    java的错误分类
    安卓手机与iOS手机的区别
    在webstorm里使用git
  • 原文地址:https://www.cnblogs.com/edda/p/13068201.html
Copyright © 2011-2022 走看看