zoukankan      html  css  js  c++  java
  • Jedis连接池使用

    1. 构建redis连接池,返还到连接池

      private static JedisPool jedisPool = null;
      private static Jedis jedis;
      
      static {
          jedis = getJedisPool().getResource();
      }
      
      /**
       * 构建redis连接池
       */
      public static JedisPool getJedisPool() {
          if (jedisPool == null) {
              JedisPoolConfig config = new JedisPoolConfig();
              config.setMaxTotal(1024); // 可用连接实例的最大数目,如果赋值为-1,表示不限制.
              config.setMaxIdle(5); // 控制一个Pool最多有多少个状态为idle(空闲的)jedis实例,默认值也是8
              config.setMaxWaitMillis(1000 * 100); // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时/如果超过等待时间,则直接抛出异常
              config.setTestOnBorrow(true); // 在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的
              jedisPool = new JedisPool(config, "127.0.0.1", 6379);
          }
          return jedisPool;
      }
      
      /**
       * 释放jedis资源
       */
      public static void returnResource(Jedis jedis) {
          if (jedis != null) {
              jedis.close();
          }
      }
      
    2. jedis使用

      • 典型的jedis使用方法
      public static String get(String key) {
          String value = null;
          Jedis jedis = null;
          try {
              JedisPool pool = getJedisPool();
              jedis = pool.getResource();
              value = jedis.get(key);
          }
          catch (Exception e) {
              returnResource(jedis);
              e.printStackTrace();
          }
          finally {
              returnResource(jedis);
          }
          return value;
      }
      

      这种写法会经常忘记返回jedis到pool.参考Spting JdbcTemplate的实现方式,优化如下

      • 优化jedis使用方法
      public static String getByTemplate(final String key) {
          RedisTemplate redisTemplate = new RedisTemplate(getJedisPool());
          String value = redisTemplate.execute(new RedisCallback<String>() {
              @Override
              public String handle(Jedis jedis) {
                  return jedis.get(key);
              }
          });
          return value;
      }
      
      

      RedisTemplate封装了从JedisPool中取jedis以及返回池中

      public class RedisTemplate {
      
          private JedisPool jedisPool;
      
          public RedisTemplate(JedisPool jedisPool) {
              this.jedisPool = jedisPool;
          }
      
          public <T> T execute(RedisCallback<T> callback) {
              Jedis jedis = jedisPool.getResource();
              try {
                  return callback.handle(jedis);
              }
              catch (Exception e) {
                  // throw your exception
                  throw e;
              }
              finally {
                  returnResource(jedis);
              }
          }
      
          private void returnResource(Jedis jedis) {
              if (jedis != null) {
                  jedis.close();
              }
          }
      }
      
      public interface RedisCallback<T> {
          public T handle(Jedis jedis);
      }
      
      • 常用的jedis方法

      字符串

      @Test
      public void testString() {
          jedis.set("name", "webb"); // 添加数据
          System.out.println("name -> " + jedis.get("name"));
      
          jedis.append("name", " , javaer"); // 拼接
          System.out.println("name -> " + jedis.get("name"));
      
          jedis.del("name"); // 删除数据
          System.out.println("name -> " + jedis.get("name"));
      
          jedis.mset("name", "webb", "age", "24"); // 设置多个键值对
          jedis.incr("age"); // 进行加1操作
      
          System.out.println("name -> " + jedis.get("name") + ", age -> " + jedis.get("age"));
      }
      

      列表

      @Test
      public void testList() {
          String key = "java framework";
      
          jedis.lpush(key, "spring");
          jedis.lpush(key, "spring mvc");
          jedis.lpush(key, "mybatis");
      
          System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有
      
          jedis.del(key);
          jedis.rpush(key, "spring");
          jedis.rpush(key, "spring mvc");
          jedis.rpush(key, "mybatis");
      
          System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有
      
          System.out.println(jedis.llen(key)); // 列表长度
          System.out.println(jedis.lrange(key, 0, 3));
          jedis.lset(key, 0 , "redis"); // 修改列表中单个值
          System.out.println(jedis.lindex(key, 1)); // 获取列表指定下标的值
          System.out.println(jedis.lpop(key)); // 列表出栈
          System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有
      }
      

      散列

      @Test
      public void testMap() {
          String key = "user";
      
          Map<String, String> map = new HashMap<>();
          map.put("name", "webb");
          map.put("age", "24");
          map.put("city", "hangzhou");
      
          jedis.hmset(key, map); // 添加数据
      
          List<String> rsmap = jedis.hmget(key, "name", "age", "city"); // 第一个参数存入的是redis中map对象的key,后面跟的是放入map中的对象的key
          System.out.println(rsmap);
      
          jedis.hdel(key, "age"); // 删除map中的某个键值
      
          System.out.println(jedis.hmget(key, "age"));
          System.out.println(jedis.hlen(key)); // 返回key为user的键中存放的值的个数
          System.out.println(jedis.exists(key)); // 是否存在key为user的记录
          System.out.println(jedis.hkeys(key)); // 返回map对象中的所有key
          System.out.println(jedis.hvals(key)); // 返回map对象中所有的value
      
          Iterator<String> iterator = jedis.hkeys("user").iterator();
      
          while (iterator.hasNext()) {
              String key2 = iterator.next();
              System.out.print(key2 + " : " + jedis.hmget("user", key2) + "
      ");
          }
      }
      

      集合

      @Test
      public void testSet() {
          String key = "userSet";
          String key2 = "userSet2";
      
          jedis.sadd(key, "webb");
          jedis.sadd(key, "webb");
          jedis.sadd(key, "lebo");
          jedis.sadd(key, "lebo0425");
          jedis.sadd(key, "who");
      
          jedis.srem(key, "who"); // 删除
      
          System.out.println(jedis.smembers(key)); // 获取所有加入的value
          System.out.println(jedis.sismember(key, "who")); // 判断value是否在集合中
          System.out.println(jedis.srandmember(key)); // 随机返回一个value
          System.out.println(jedis.scard(key)); // 返回集合的元素个数
      
          jedis.sadd(key2, "webb");
          jedis.sadd(key2, "ssq");
      
          System.out.println(jedis.sinter(key, key2)); // 交集
          System.out.println(jedis.sunion(key, key2)); // 并集
          System.out.println(jedis.sdiff(key, key2)); // 差集
      }
      

      有序集合

      @Test
      public void testSortedSet() {
          String key = "sortedSet";
      
          jedis.zadd(key, 1999, "one");
          jedis.zadd(key, 1994, "two");
          jedis.zadd(key, 1998, "three");
          jedis.zadd(key, 2000, "four");
          jedis.zadd(key, 2017, "five");
      
          Set<String> setValues = jedis.zrange(key, 0 , -1); // score从小到大
          System.out.println(setValues);
          Set<String> setValues2 = jedis.zrevrange(key, 0, -1); // score从大到小
          System.out.println(setValues2);
      
          System.out.println(jedis.zcard(key)); // 元素个数
          System.out.println(jedis.zscore(key, "three")); // 元素下标
          System.out.println(jedis.zrange(key, 0, -1)); // 集合子集
          System.out.println(jedis.zrem(key, "five")); // 删除元素
          System.out.println(jedis.zcount(key, 1000, 2000)); // score在1000-2000内的元素个数
      }
      

    参考文章:
    1.https://my.oschina.net/u/866190/blog/389543
    2.http://blog.csdn.net/edagarli/article/details/21887111

  • 相关阅读:
    Oracle基础知识整理
    linux下yum安装redis以及使用
    mybatis 学习四 源码分析 mybatis如何执行的一条sql
    mybatis 学习三 mapper xml 配置信息
    mybatis 学习二 conf xml 配置信息
    mybatis 学习一 总体概述
    oracle sql 语句 示例
    jdbc 新认识
    eclipse tomcat 无法加载导入的web项目,There are no resources that can be added or removed from the server. .
    一些常用算法(持续更新)
  • 原文地址:https://www.cnblogs.com/lebo0425/p/6837408.html
Copyright © 2011-2022 走看看