zoukankan      html  css  js  c++  java
  • Jedis 操作 Redis 工具类

    配置类

    pom.xml 

    pom.xml 里配置依赖

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

    application.properties

    spring 属性文件 application.properties 里配置 redis 配置项

    REDIS_HOST=127.0.0.1
    REDIS_PORT=6379
    REDIS_PASSWORD=xxxxxxx
    #超时时间,毫秒 REDIS_TIMEOUT=1000 #最大连接数 REDIS_MAXTOTAL=1000 #最大空闲连接数 REDIS_MAXIDLE=100 #最小空闲连接数 REDIS_MINIDLE=100 #获取连接时的最大等待毫秒数 REDIS_MAXWAITMILLIS=100 #默认缓存过期时间,单位秒 REDIS_DEFAULT_TIMEOUT=7200

    常量配置类

    @Configuration
    public class Constants {
    
        public static String REDIS_HOST;
        public static int REDIS_PORT;
        public static String REDIS_PASSWORD;
        public static int REDIS_TIMEOUT;
        public static int REDIS_MAXTOTAL;
        public static int REDIS_MAXIDLE;
        public static int REDIS_MINIDLE;
        public static int REDIS_MAXWAITMILLIS;
        public static int REDIS_DEFAULT_TIMEOUT;
        
        @Value("${REDIS_HOST}")
        public void setREDIS_HOST(String rEDIS_HOST) {
            REDIS_HOST = rEDIS_HOST;
        }
    
        @Value("${REDIS_PORT}")
        public void setREDIS_PORT(int rEDIS_PORT) {
            REDIS_PORT = rEDIS_PORT;
        }
        
        @Value("${REDIS_PASSWORD}")
        public void setREDIS_PASSWORD(String rEDIS_PASSWORD) {
            REDIS_PASSWORD = rEDIS_PASSWORD;
        }
    
        @Value("${REDIS_TIMEOUT}")
        public void setREDIS_TIMEOUT(int rEDIS_TIMEOUT) {
            REDIS_TIMEOUT = rEDIS_TIMEOUT;
        }
    
        @Value("${REDIS_MAXTOTAL}")
        public void setREDIS_MAXTOTAL(int rEDIS_MAXTOTAL) {
            REDIS_MAXTOTAL = rEDIS_MAXTOTAL;
        }
    
        @Value("${REDIS_MAXIDLE}")
        public void setREDIS_MAXIDLE(int rEDIS_MAXIDLE) {
            REDIS_MAXIDLE = rEDIS_MAXIDLE;
        }
    
        @Value("${REDIS_MINIDLE}")
        public void setREDIS_MINIDLE(int rEDIS_MINIDLE) {
            REDIS_MINIDLE = rEDIS_MINIDLE;
        }
    
        @Value("${REDIS_MAXWAITMILLIS}")
        public void setREDIS_MAXWAITMILLIS(int rEDIS_MAXWAITMILLIS) {
            REDIS_MAXWAITMILLIS = rEDIS_MAXWAITMILLIS;
        }
    
        @Value("${REDIS_DEFAULT_TIMEOUT}")
        public void setREDIS_DEFAULT_TIMEOUT(int rEDIS_DEFAULT_TIMEOUT) {
            REDIS_DEFAULT_TIMEOUT = rEDIS_DEFAULT_TIMEOUT;
        }
    }

    工厂类

    Jedis工厂类(枚举)

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.zcdog.market.util.Constants;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.exceptions.JedisConnectionException;
    import redis.clients.jedis.exceptions.JedisDataException;
    
    public enum JedisFactory {
    
        INSTANCE;
    
        private static Logger logger = LoggerFactory.getLogger(JedisFactory.class);
    
        private volatile JedisPool pool;
    
        /**
         * 获取Jedis连接
         * @return
         */
        public Jedis getConnection() {
            if (pool == null) {
                synchronized (INSTANCE) {
                    if (pool == null) {
                        logger.debug("init jedis pool." + Thread.currentThread().getName());
                        JedisPoolConfig poolConfig = new JedisPoolConfig();
                        poolConfig.setMaxTotal(Constants.REDIS_MAXTOTAL);
                        poolConfig.setMaxIdle(Constants.REDIS_MAXIDLE);
                        poolConfig.setMinIdle(Constants.REDIS_MINIDLE);
                        poolConfig.setMaxWaitMillis(Constants.REDIS_MAXWAITMILLIS);
                        if (Constants.REDIS_PASSWORD != null && !"".equals(Constants.REDIS_PASSWORD)) {
                            pool = new JedisPool(poolConfig, Constants.REDIS_HOST, Constants.REDIS_PORT, Constants.REDIS_TIMEOUT, Constants.REDIS_PASSWORD);
                        }else {
                            pool = new JedisPool(poolConfig, Constants.REDIS_HOST, Constants.REDIS_PORT, Constants.REDIS_TIMEOUT);
                        }
                    }
                }
            }
            return pool.getResource();
        }
    
        /**
         * 处理Jedis连接异常
         * 记录日志并返回连接是否中断
         * @param jedisException
         * @return
         */
        public boolean handleJedisException(Exception jedisException) {
            if (jedisException instanceof JedisConnectionException) {
                logger.error("Redis connection lost.", jedisException);
            } else if (jedisException instanceof JedisDataException) {
                if ((jedisException.getMessage() != null) && (jedisException.getMessage().indexOf("READONLY") != -1)) {
                    logger.error("Redis connection is read-only slave.", jedisException);
                } else {
                    return false;
                }
            } else {
                logger.error("Jedis happen exception.", jedisException);
            }
            return true;
        }
    
       /**
        * 返回Jedis连接到连接池
        * 根据连接状态调用不同的返回方法
        * @param jedis
        * @param exceptionFlag
        */
        public void closeResource(Jedis jedis, boolean exceptionFlag) {
            try {
                if (exceptionFlag) {
                    pool.returnBrokenResource(jedis);
                } else if (!exceptionFlag && jedis != null) {
                    pool.returnResource(jedis);
                }
            } catch (Exception e) {
                logger.error("Return back jedis failed, will close the jedis.", e);
                try {
                    jedis.quit();
                } catch (Exception ex) {
                    logger.error("Jedis quit error.", ex);
                }
                try {
                    jedis.disconnect();
                } catch (Exception exd) {
                    logger.error("Jedis disconnect error.", exd);
                }
            }
        }
    }

    工具类

    Jedis工具类,如果没有适用的方法,可自行添加,仅作示例。

    更多可参考:Jedis工具类

    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.Transaction;
    
    public class RedisUtils {
    
        private static Logger logger = LoggerFactory.getLogger(RedisUtils.class);
    
        private static Jedis getConnection() {
            return JedisFactory.INSTANCE.getConnection();
        }
    
        public static void closeResource(Jedis jedis, boolean exceptionFlag) {
            JedisFactory.INSTANCE.closeResource(jedis, exceptionFlag);
        }
    
        public static boolean handleJedisException(Exception jedisException) {
            return JedisFactory.INSTANCE.handleJedisException(jedisException);
        }
    
        public static void save(String key, String value) {
            save(key, value, Constants.REDIS_DEFAULT_TIMEOUT);
        }
    
        public static void save(String key, String value, int expires) {
            Jedis jedis = null;
            boolean exceptionFlag = false;
            try {
                jedis = getConnection();
                if (key == null || "".equals(key)) {
                    return;
                }
                jedis.setex(key, expires, value);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("save redis error:", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static String get(String key) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            String value = null;
            try {
                jedis = getConnection();
                value = jedis.get(key);
                return value;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("get redis error :", e);
                return value;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static void delete(String key) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                if (key == null || "".equals(key)) {
                    return;
                }
                jedis = getConnection();
                jedis.del(key);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("delete redis error:", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static List<String> mget(String[] keys) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                List<String> list = null;
                jedis = getConnection();
                list = jedis.mget(keys);
                return list;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                return null;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static String hget(String key, String field) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            String value = null;
            try {
                jedis = getConnection();
                value = jedis.hget(key, field);
                return value;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                return value;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static String setnx(String key, String value) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            String result = null;
            try {
                jedis = getConnection();
                result = jedis.set(key, value, "NX", "EX", 300L);
                return result;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                return result;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static void hsetTransaction(String key1, String field1, String value1, String key2, String field2,
                String value2, int timeout) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                Transaction multi = jedis.multi();
                multi.hset(key1, field1, value1);
                multi.expire(key1, Constants.REDIS_DEFAULT_TIMEOUT);
    
                multi.hset(key2, field2, value2);
                multi.expire(key2, timeout);
                multi.exec();
                logger.info("[redis] hsetTransaction success key1: {} field1: {} key2: {} field2: {}", key1, field1, key2,
                        field2);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hset hsetTransaction error :", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
    
        }
    
        public static void hsetTransactionWithDeleteV2(String key1, String field1, String value1, String key2,
                String field2, String value2, int timeout, String deleteKey) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                Transaction multi = jedis.multi();
                multi.hset(key1, field1, value1);
                multi.expire(key1, Constants.REDIS_DEFAULT_TIMEOUT);
    
                multi.hset(key2, field2, value2);
                multi.expire(key2, timeout);
                multi.del(deleteKey);
                multi.exec();
                logger.info("[redis] hsetTransactionWithDelete success key1: {} field1: {} key2: {} field2: {}", key1,
                        field1, key2, field2);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hsetTransactionWithDelete redis error :", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
    
        }
    
        public static Map<?, ?> hgetall(String key) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            Map<?, ?> value = null;
            try {
                jedis = getConnection();
                value = jedis.hgetAll(key);
                return value;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hgetall redis error :", e);
                return value;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static void hset(String key, String field, String value) {
            hset(key, field, value, Constants.REDIS_DEFAULT_TIMEOUT);
        }
    
        public static void hset(String key, String field, String value, int expireTime) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                jedis.hset(key, field, value);
                jedis.expire(key, expireTime);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hset redis error :", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static void hdelete(String key, String field) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                jedis.hdel(key, field);
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hdel redis error :", e);
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static boolean hexist(String key, String field) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                boolean flag = jedis.hexists(key, field);
                return flag;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("hexist redis error:", e);
                return false;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static int hlen(String key) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            try {
                jedis = getConnection();
                return jedis.hlen(key).intValue();
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("  hlen redis error :", e);
                return 0;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
        public static Set<String> hkeys(String key) {
            boolean exceptionFlag = false;
            Jedis jedis = null;
            Set<String> skey = null;
            try {
                jedis = getConnection();
                skey = jedis.hkeys(key);
                return skey;
            } catch (Exception e) {
                exceptionFlag = handleJedisException(e);
                logger.error("hkeys redis error:", e);
                return skey;
            } finally {
                closeResource(jedis, exceptionFlag);
            }
        }
    
    }
  • 相关阅读:
    [LeetCode] 157. Read N Characters Given Read4 用Read4来读取N个字符
    [LeetCode] 158. Read N Characters Given Read4 II
    AndroidManifest.xml文件详解(activity)(一)
    Android中Bitmap、Drawable、byte[]转换
    图片和byte[]数组互转
    EditText 属性
    adb server didn't ack failed to start daemon
    PhoneGap 获得设备属性Demo
    PhoneGap 第一个程序
    android手机常用分辨率
  • 原文地址:https://www.cnblogs.com/wbxk/p/6137713.html
Copyright © 2011-2022 走看看