• Spring boot 整合 Jedis


    1  概述

      1. Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。

          2.Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。

          3.Jedis使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。

          4.Jedis仅支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

    2   pom

      <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
      </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
      
    <version>
    2.0.5.RELEASE</version>
    </dependency>

    3  properties

    spring.jedis.enabled = true
    spring.jedis.cluster = false
    spring.jedis.host = x.x.x.x
    spring.jedis.port = x
    spring.jedis.password = xxxxx
    spring.jedis.pool-config.max-total = 300

    4  Jedis配置类JedisProperties

    package com.yx.redis.jedis;
    
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 10:35
     * @Description: RedisProperties
     */
    @ConfigurationProperties(prefix = "spring.jedis")
    public class JedisProperties {
        boolean cluster = false;
    
        String hosts;
    
        String host = "localhost";
    
        int port = 6379;
    
        int timeout = 600000;
    
        String password;
    
        PoolConfig poolConfig = new PoolConfig();
    
        Cluster clusterConfig = new Cluster();
    
        public static class Cluster {
            int connectionTimeout = 5000;
            int soTimeout = 5000;
            int maxAttempts = 5000;
    
            public int getConnectionTimeout() {
                return connectionTimeout;
            }
    
            public void setConnectionTimeout(int connectionTimeout) {
                this.connectionTimeout = connectionTimeout;
            }
    
            public int getSoTimeout() {
                return soTimeout;
            }
    
            public void setSoTimeout(int soTimeout) {
                this.soTimeout = soTimeout;
            }
    
            public int getMaxAttempts() {
                return maxAttempts;
            }
    
            public void setMaxAttempts(int maxAttempts) {
                this.maxAttempts = maxAttempts;
            }
        }
    
        public static class PoolConfig {
            int maxTotal = GenericObjectPoolConfig.DEFAULT_MAX_TOTAL;
    
            int maxIdle = GenericObjectPoolConfig.DEFAULT_MAX_IDLE;
    
            int minIdle = GenericObjectPoolConfig.DEFAULT_MIN_IDLE;
    
            int numTestsPerEvictionRun = GenericObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
    
            long timeBetweenEvictionRunsMillis = GenericObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
    
            long minEvictableIdleTimeMillis = GenericObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
    
            long softMinEvictableIdleTimeMillis = GenericObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
    
            long maxWaitMillis = GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
    
            boolean testWhileIdle = GenericObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE;
    
            boolean blockWhenExhausted = GenericObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
    
            boolean testOnCreate = GenericObjectPoolConfig.DEFAULT_TEST_ON_CREATE;
    
            boolean testOnBorrow = GenericObjectPoolConfig.DEFAULT_TEST_ON_BORROW;
    
            boolean testOnReturn = GenericObjectPoolConfig.DEFAULT_TEST_ON_RETURN;
    
            public int getMaxTotal() {
                return maxTotal;
            }
    
            public void setMaxTotal(int maxTotal) {
                this.maxTotal = maxTotal;
            }
    
            public int getMaxIdle() {
                return maxIdle;
            }
    
            public void setMaxIdle(int maxIdle) {
                this.maxIdle = maxIdle;
            }
    
            public int getMinIdle() {
                return minIdle;
            }
    
            public void setMinIdle(int minIdle) {
                this.minIdle = minIdle;
            }
    
            public int getNumTestsPerEvictionRun() {
                return numTestsPerEvictionRun;
            }
    
            public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
                this.numTestsPerEvictionRun = numTestsPerEvictionRun;
            }
    
            public long getTimeBetweenEvictionRunsMillis() {
                return timeBetweenEvictionRunsMillis;
            }
    
            public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
                this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
            }
    
            public long getMinEvictableIdleTimeMillis() {
                return minEvictableIdleTimeMillis;
            }
    
            public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
                this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
            }
    
            public long getSoftMinEvictableIdleTimeMillis() {
                return softMinEvictableIdleTimeMillis;
            }
    
            public void setSoftMinEvictableIdleTimeMillis(long softMinEvictableIdleTimeMillis) {
                this.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
            }
    
            public long getMaxWaitMillis() {
                return maxWaitMillis;
            }
    
            public void setMaxWaitMillis(long maxWaitMillis) {
                this.maxWaitMillis = maxWaitMillis;
            }
    
            public boolean isTestWhileIdle() {
                return testWhileIdle;
            }
    
            public void setTestWhileIdle(boolean testWhileIdle) {
                this.testWhileIdle = testWhileIdle;
            }
    
            public boolean isBlockWhenExhausted() {
                return blockWhenExhausted;
            }
    
            public void setBlockWhenExhausted(boolean blockWhenExhausted) {
                this.blockWhenExhausted = blockWhenExhausted;
            }
    
            public boolean isTestOnCreate() {
                return testOnCreate;
            }
    
            public void setTestOnCreate(boolean testOnCreate) {
                this.testOnCreate = testOnCreate;
            }
    
            public boolean isTestOnBorrow() {
                return testOnBorrow;
            }
    
            public void setTestOnBorrow(boolean testOnBorrow) {
                this.testOnBorrow = testOnBorrow;
            }
    
            public boolean isTestOnReturn() {
                return testOnReturn;
            }
    
            public void setTestOnReturn(boolean testOnReturn) {
                this.testOnReturn = testOnReturn;
            }
        }
    
    
        public int getTimeout() {
            return timeout;
        }
    
        public void setTimeout(int timeout) {
            this.timeout = timeout;
        }
    
        public PoolConfig getPoolConfig() {
            return poolConfig;
        }
    
        public void setPoolConfig(PoolConfig poolConfig) {
            this.poolConfig = poolConfig;
        }
    
        public boolean isCluster() {
            return cluster;
        }
    
        public void setCluster(boolean cluster) {
            this.cluster = cluster;
        }
    
        public String getHosts() {
            return hosts;
        }
    
        public void setHosts(String hosts) {
            this.hosts = hosts;
        }
    
        public String getHost() {
            return host;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public Cluster getClusterConfig() {
            return clusterConfig;
        }
    
        public void setClusterConfig(Cluster clusterConfig) {
            this.clusterConfig = clusterConfig;
        }
    }

    5  Jedis配置类JedisTemplate

    package com.yx.redis.jedis;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisCommands;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 10:35
     * @Description: JedisTemplate
     */
    public class JedisTemplate {
        private JedisAction jedisAction;
        public JedisCommands jedisCommands;
    
        public JedisTemplate(final JedisAction jedisAction, final JedisClient jedisClient) {
            this.jedisAction = jedisAction;
            this.jedisCommands = jedisClient.getJedisCommands();
        }
    
        public void set(String key, String value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.set(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.set(key, value);
                }
            });
        }
    
        public void setex(String key, String value, int time) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.setex(key, time, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.setex(key, time, value);
                }
            });
        }
    
        public void zadd(String key, double score, String member) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.zadd(key, score, member);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.zadd(key, score, member);
                }
            });
        }
    
        public void zscore(String key, String member) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.zscore(key, member);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.zscore(key, member);
                }
            });
        }
    
        public void zrem(String key, String member) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.zrem(key, member);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.zrem(key, member);
                }
            });
        }
    
        public String get(String key) {
            return jedisAction.execute(new JedisAction.ActionResult<String>() {
                @Override
                public String action(Jedis jedis) {
                    return jedis.get(key);
                }
    
                @Override
                public String action(JedisCluster jedisCluster) {
                    return jedisCluster.get(key);
                }
            });
        }
    
        public List<String> mget(String[] key) {
            return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
                @Override
                public List<String> action(Jedis jedis) {
                    return jedis.mget(key);
                }
    
                @Override
                public List<String> action(JedisCluster jedisCluster) {
                    return jedisCluster.mget(key);
                }
            });
        }
    
        public List<String> hmget(String key, String[] field) {
            return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
                @Override
                public List<String> action(Jedis jedis) {
                    return jedis.hmget(key, field);
                }
    
                @Override
                public List<String> action(JedisCluster jedisCluster) {
                    return jedisCluster.hmget(key, field);
                }
            });
        }
    
        public void hset(String key, String field, String value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.hset(key, field, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.hset(key, field, value);
                }
            });
        }
    
    
        public Long hincrBy(String key, String field, int step) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
                @Override
                public Long action(Jedis jedis) {
                    return jedis.hincrBy(key, field, step);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.hincrBy(key, field, step);
                }
            });
        }
    
        public String hget(String key, String field) {
            return jedisAction.execute(new JedisAction.ActionResult<String>() {
                @Override
                public String action(Jedis jedis) {
                    return jedis.hget(key, field);
                }
    
                @Override
                public String action(JedisCluster jedisCluster) {
                    return jedisCluster.hget(key, field);
                }
            });
        }
    
    
        public Long hdel(String key, String field) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
                @Override
                public Long action(Jedis jedis) {
                    return jedis.hdel(key, field);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.hdel(key, field);
                }
            });
        }
    
        public void expire(String key, int seconds) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.expire(key, seconds);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.expire(key, seconds);
                }
            });
        }
    
        public boolean exists(String... keys) {
            return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
                @Override
                public Boolean action(Jedis jedis) {
                    return jedis.exists(keys) > 0;
                }
    
                @Override
                public Boolean action(JedisCluster jedisCluster) {
                    return jedisCluster.exists(keys) > 0;
                }
            });
        }
    
        public Map<String, String> hgetAll(String key) {
            return jedisAction.execute(new JedisAction.ActionResult<Map<String, String>>() {
    
                @Override
                public Map<String, String> action(Jedis jedis) {
                    return jedis.hgetAll(key);
                }
    
                @Override
                public Map<String, String> action(JedisCluster jedisCluster) {
                    return jedisCluster.hgetAll(key);
                }
            });
        }
    
        public Boolean setnxex(String key, int seconds, String value) {
            return "OK".equals(jedisAction.execute(new JedisAction.ActionResult<String>() {
    
                @Override
                public String action(Jedis jedis) {
    
                    return jedis.set(key, value, "NX", "EX", seconds);
                }
    
                @Override
                public String action(JedisCluster jedisCluster) {
                    return jedisCluster.set(key, value, "NX", "EX", seconds);
                }
            }));
        }
    
        public Long setnx(String key, String value) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
                @Override
                public Long action(Jedis jedis) {
                    return jedis.setnx(key, value);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.setnx(key, value);
                }
            });
        }
    
        public Long incr(String key) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
    
                @Override
                public Long action(Jedis jedis) {
                    return jedis.incr(key);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.incr(key);
                }
            });
        }
    
    
        public Long incrBy(String key, int step) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
    
                @Override
                public Long action(Jedis jedis) {
                    return jedis.incrBy(key, step);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.incrBy(key, step);
                }
            });
        }
    
        public void sadd(String key, String value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.sadd(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.sadd(key, value);
                }
            });
        }
    
        public Set<String> smembers(String key) {
            return jedisAction.execute(new JedisAction.ActionResult<Set<String>>() {
                @Override
                public Set<String> action(Jedis jedis) {
                    return jedis.smembers(key);
                }
    
                @Override
                public Set<String> action(JedisCluster jedisCluster) {
                    return jedisCluster.smembers(key);
                }
            });
        }
    
    
        public void srem(String key, String... value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.srem(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.srem(key, value);
                }
            });
        }
    
    
        public void lpush(String key, String... value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.lpush(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.lpush(key, value);
                }
            });
        }
    
        public void rpush(String key, String... value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.rpush(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.rpush(key, value);
                }
            });
        }
    
    
        public List<String> lrange(String key, int start, int end) {
            return jedisAction.execute(new JedisAction.ActionResult<List<String>>() {
                @Override
                public List<String> action(Jedis jedis) {
                    return jedis.lrange(key, start, end);
                }
    
                @Override
                public List<String> action(JedisCluster jedisCluster) {
                    return jedisCluster.lrange(key, start, end);
                }
            });
        }
    
    
        public void lrem(String key, int count, String value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.lrem(key, count, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.lrem(key, count, value);
                }
            });
        }
    
        public String set(String key, String value, String nxxx, String expx, int timeout) {
            return jedisAction.execute(new JedisAction.ActionResult<String>() {
                @Override
                public String action(Jedis jedis) {
                    return jedis.set(key, value, nxxx, expx, timeout);
                }
    
                @Override
                public String action(JedisCluster jedisCluster) {
                    return jedisCluster.set(key, value, nxxx, expx, timeout);
                }
            });
        }
    
        public void del(String... key) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.del(key);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.del(key);
                }
            });
        }
    
        public String hmset(String key, Map<String, String> map) {
            return jedisAction.execute(new JedisAction.ActionResult<String>() {
                @Override
                public String action(Jedis jedis) {
                    return jedis.hmset(key, map);
                }
    
                @Override
                public String action(JedisCluster jedisCluster) {
                    return jedisCluster.hmset(key, map);
                }
            });
        }
    
        public Long setnxByte(byte[] key, byte[] value) {
            return jedisAction.execute(new JedisAction.ActionResult<Long>() {
                @Override
                public Long action(Jedis jedis) {
                    return jedis.setnx(key, value);
                }
    
                @Override
                public Long action(JedisCluster jedisCluster) {
                    return jedisCluster.setnx(key, value);
                }
            });
        }
    
        public void setByte(byte[] key, byte[] value) {
            jedisAction.execute(new JedisAction.ActionNoResult() {
                @Override
                public void action(Jedis jedis) {
                    jedis.set(key, value);
                }
    
                @Override
                public void action(JedisCluster jedisCluster) {
                    jedisCluster.set(key, value);
                }
            });
        }
    
        public byte[] getByte(byte[] key) {
            return jedisAction.execute(new JedisAction.ActionResult<byte[]>() {
                @Override
                public byte[] action(Jedis jedis) {
                    return jedis.get(key);
                }
    
                @Override
                public byte[] action(JedisCluster jedisCluster) {
                    return jedisCluster.get(key);
                }
            });
        }
    
        /**
         * 位图
         *
         * @param key
         * @param offset
         * @param value
         * @return 修改之前的状态
         */
        public Boolean setBit(String key, Long offset, boolean value) {
            return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
                @Override
                public Boolean action(Jedis jedis) {
                    return jedis.setbit(key, offset, value);
                }
    
                @Override
                public Boolean action(JedisCluster jedisCluster) {
                    return jedisCluster.setbit(key, offset, value);
                }
            });
        }
    
        public Boolean getBit(String key, Long offset) {
            return jedisAction.execute(new JedisAction.ActionResult<Boolean>() {
                @Override
                public Boolean action(Jedis jedis) {
                    return jedis.getbit(key, offset);
                }
    
                @Override
                public Boolean action(JedisCluster jedisCluster) {
                    return jedisCluster.getbit(key, offset);
                }
            });
        }
    
        public Set<String> zrevrange(String key, long start, long end) {
            return jedisAction.execute(new JedisAction.ActionResult<Set<String>>() {
                @Override
                public Set<String> action(Jedis jedis) {
                    return jedis.zrevrange(key, start, end);
                }
    
                @Override
                public Set<String> action(JedisCluster jedisCluster) {
                    return jedisCluster.zrevrange(key, start, end);
                }
            });
        }
    
        public Object eval(String script, List<String> keys, List<String> args) {
            return jedisAction.execute(new JedisAction.ActionResult<Object>() {
                @Override
                public Object action(Jedis jedis) {
                    return jedis.eval(script, keys, args);
                }
    
                @Override
                public Object action(JedisCluster jedisCluster) {
                    return jedisCluster.eval(script, keys, args);
                }
            });
        }
    
    }

    6  Jedis配置类JedisCondition

    package com.yx.redis.jedis;
    
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 10:35
     * @Description: KafkaCondition
     */
    public class JedisCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return propertyIsTrue(context, "spring.jedis.enabled");
        }
    
        private static boolean propertyIsTrue(ConditionContext context, String key) {
            return context.getEnvironment().getProperty(key, Boolean.TYPE, Boolean.FALSE);
        }
    }

    7  Jedis配置类JedisClient

    package com.yx.redis.jedis;
    
    import lombok.Getter;
    import lombok.Setter;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisCommands;
    import redis.clients.jedis.JedisPool;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 14:16
     * @Description: JedisClient
     */
    public class JedisClient {
        @Setter
        private boolean cluster = false;
    
        @Setter
        private JedisPool jedisPool;
    
        @Setter
        @Getter
        private JedisCluster jedisCluster;
    
        public JedisCommands getJedisCommands() {
            if (cluster) {
                return jedisCluster;
            } else {
                return getJedis();
            }
        }
    
        public Jedis getJedis() {
            return jedisPool.getResource();
        }
    }

    8  Jedis配置类JedisAction

    package com.yx.redis.jedis;
    
    import lombok.Setter;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.ShardedJedis;
    
    /**
     * @Auther: yx
     * @Date: 2019-04-30 14:30
     * @Description: JedisAction
     */
    public class JedisAction {
        @Setter
        private boolean isCluster = false;
        @Setter
        private JedisClient jedisClient;
    
        interface ActionResult<T>{
    
            T action(Jedis jedis);
    
    
            T action(JedisCluster jedisCluster);
    
        }
    
        interface ActionNoResult{
    
            void action(Jedis jedis);
    
            void action(JedisCluster jedisCluster);
        }
    
        public void execute(ActionNoResult actionNoResult){
    
            if(isCluster){
                JedisCluster jedisCluster = jedisClient.getJedisCluster();
                actionNoResult.action(jedisCluster);
            }else{
                Jedis jedis = null;
                try {
                    jedis = jedisClient.getJedis();
                    actionNoResult.action(jedis);
                }finally {
                    if(jedis != null){
                        jedis.close();
                    }
                }
    
            }
    
        }
    
        public <T> T  execute(ActionResult<T> actionResult){
    
            if(isCluster){
                ShardedJedis shardedJedis = null;
                try {
                    JedisCluster jedisCluster = jedisClient.getJedisCluster();
                    return actionResult.action(jedisCluster);
                }finally {
                    if(shardedJedis != null){
                        shardedJedis.close();
                    }
                }
            }else{
                Jedis jedis = null;
                try {
                    jedis = jedisClient.getJedis();
                    return actionResult.action(jedis);
                }finally {
                    if(jedis != null){
                        jedis.close();
                    }
                }
    
            }
    
        }
    }
  • 相关阅读:
    BZOJ 3744 Gty的妹子序列 分块+树状数组+主席树
    BZOJ 3744 Gty的妹子序列 分块+树状数组
    51nod 1850 抽卡大赛 (十二省联考模测) DP
    BZOJ 4127: Abs (树链剖分 线段树求区间绝对值之和 带区间加法)
    BZOJ 2157: 旅游 (树链剖分+线段树)
    BZOJ 2836: 魔法树 (树链剖分+线段树)
    BZOJ 3531: [Sdoi2014]旅行 (树剖+动态开点线段树)
    树状数组彻底入门,算法小白都看得懂的超详细解析
    点双联通分量(BCC)的正确姿势
    uoj30【CF Round #278】Tourists(圆方树+树链剖分+可删除堆)
  • 原文地址:https://www.cnblogs.com/yx88/p/10899571.html
Copyright © 2020-2023  润新知