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) + "\n");
    }
    }

    集合

    @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

Jedis连接池使用的更多相关文章

  1. Java与redis交互、Jedis连接池JedisPool

    Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest ...

  2. Jedis连接池

    jedis是官方首选的java客户端开发包 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Ja ...

  3. 详解Jedis连接池报错处理

    在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...

  4. 为什么要用Jedis连接池+浅谈jedis连接池使用

    为什么要使用Jedis连接池 Redis作为缓存数据库理论上和MySQL一样需要客户端和服务端建立起来连接进行相关操作,使用MySQL的时候相信大家都会使用一款开源的连接池,例如C3P0.因为直连会消 ...

  5. Jedis与Jedis连接池

    1.Jedis简介 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: https://redis.io/clients 2. ...

  6. 三、redis学习(jedis连接池)

    一.jedis连接池 二.jedis连接池+config配置文件 三.jedis连接池+config配置文件+util工具类 util类 public class JedisPoolUtils { / ...

  7. Java Redis系列3(Jedis的使用+jedis连接池技术)

    Jedis的使用 什么是Jedis? 一款Java操作redis数据库的工具 使用步骤 1.下载redis所需的java包 2.使用步骤 import org.junit.Test; public c ...

  8. Jedis 连接池的基本使用

    jedis直连 每次操作都会创建一个jedis对象,执行完毕后关闭连接后释放,对应的就是一次Tcp连接. jedis连接池 预先生成一批jedis连接对象放入连接池中,当需要对redis进行操作时从连 ...

  9. jedis连接池详解(Redis)

    转自:http://tianxingzhe.blog.51cto.com/3390077/1684306 原子性(atomicity): 一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都 ...

随机推荐

  1. MapReduce简介以及详细配置

    1.MapReduce(一个分布式运算框架)将数据分为数据块,发送到不同的节点,并行方式处理. 2.NodeManager和DataNode在一个节点上,程序与数据在一个节点. 3.内容分为两个部分 ...

  2. MyBatis 源码分析——映射结果

    MyBatis最后一步一定是处理相关的结果——把数据映射成对应的模型对象.事实上在笔者看来如果读者们了解了mybatis如何去执行数据库,又是如何处理数据结果.那么就了解了mybatis的主要路线.因 ...

  3. Android 中基于 Binder的进程间通信

    摘要:对  Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...

  4. sql语句实现累计数

    前言,要实现按某个字段统计,直接用count/sum……group by语句就可以实现,但是要实现累计统计,比如按时间累计统计,从12月3号开始累计数据,比如:4号统计3.4号的数据,5号统计3.4. ...

  5. 深入探究stm32GPIO口模式(类比51)

    关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时 ...

  6. js原生的轮播图

    <!DOCTYPE html>   <html>   <head>   <meta charset="UTF-8">   <t ...

  7. [SinGuLaRiTy] ZKW线段树

    [SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...

  8. poptest老李谈分布式与集群

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  9. 用Xamarin + VS 编写Android程序体验及其与Android Studio的比较

    昨天看了微软2016Build大会,Xamarin免费了.恩,5亿美刀的家伙,哈哈,我也要体验一下..... 1. 首先在Xamarin官网下载安向导:https://www.xamarin.com/ ...

  10. python 自动化接口测试(6)

    迎接新的一波更新吧,这次是基于图灵机器人的一个api接口的测试. 这是api的接口:http://www.tuling123.com/openapi/api 我们试着通过浏览器直接访问看下 这是反馈的 ...