redis 存入集合对象

package com.gcyh.core.base.cache.redis;

import com.gcyh.core.base.log.Log;
import com.gcyh.core.base.log.LogFactory;
import com.gcyh.core.base.utils.CloseableUtils;
import com.gcyh.core.base.utils.MapUtils;
import com.gcyh.core.base.utils.SerializeUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.*;

import java.util.*;

/**
 * jedis工具类
 *
 */
public abstract class JedisUtils {

    private static Log log = LogFactory.getLog(JedisUtils.class);
    private static JedisPool pool;
    private static JedisPoolConfig config;
    private static JedisShardInfo shardInfo;

    static {
        // 初始化池配置
        config = new JedisPoolConfig();
        config.setMaxTotal(JedisFileConfig.getIntValue("max.total"));
        config.setMaxIdle(JedisFileConfig.getIntValue("max.idle"));
        config.setMinIdle(JedisFileConfig.getIntValue("min.idle"));
        config.setMaxWaitMillis(JedisFileConfig.getIntValue("max.wait.millis"));
        config.setTestOnBorrow(JedisFileConfig.getBooleanValue("test.on.borrow"));
        config.setBlockWhenExhausted(JedisFileConfig.getBooleanValue("block.when.exhausted"));

        // 初始化jedis池
        String host = JedisFileConfig.getValue("host");
        int port = JedisFileConfig.getIntValue("port");
        int timeout = JedisFileConfig.getIntValue("connection.timeout");
        String password = JedisFileConfig.getValue("password");
        if (StringUtils.isNotBlank(password)) {
            pool = new JedisPool(config, host, port, timeout, password);
        }
        else {
            pool = new JedisPool(config, host, port, timeout);
        }

        // 初始化分片信息
        shardInfo = new JedisShardInfo(host, port);
        shardInfo.setConnectionTimeout(timeout);
        if (StringUtils.isNotBlank(password)) {
            shardInfo.setPassword(password);
        }
        shardInfo.setSoTimeout(timeout);
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 键值
     */
    public static String get(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.get(key));
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(byte[] key) {
        return doExecute(jedis -> {
            byte[] data = jedis.get(key);
            return (T) SerializeUtils.unserialize(data);
        });
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值集合
     */
    public static List<String> lrange(String key) {
        return lrange(key, 0, -1);
    }

    /**
     * 获取指定键的值
     *
     * @param key   键
     * @param start 开始索引
     * @param end   结束索引
     * @return 值集合
     */
    public static List<String> lrange(String key, long start, long end) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.lrange(key, start, end));
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值集合
     */
    public static Set<String> smembers(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.smembers(key));
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值集合
     */
    public static List<String> srandmember(String key, int count) {
        return doExecute(jedis -> jedis.srandmember(key, count));
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 有序值集合
     */
    public static Set<String> zrange(String key) {
        return zrange(key, 0, -1);
    }

    /**
     * 获取指定键的值
     *
     * @param key   键
     * @param start 开始索引
     * @param end   结束索引
     * @return 有序值集合
     */
    public static Set<String> zrange(String key, long start, long end) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.zrange(key, start, end));
    }

    /**
     * 合并多个有序集的值到目标键
     *
     * @param destKey   目标键
     * @param params    合并时的参数
     * @param sourceKey 源键
     * @return 目标键中值的数量
     */
    public static Long zinterstore(String destKey, ZParams params, String... sourceKey) {
        if (StringUtils.isBlank(destKey)) {
            return null;
        }
        return doExecute(jedis -> jedis.zinterstore(destKey, params, sourceKey));
    }

    /**
     * 获取有序集合中元素的倒序
     *
     * @param key    键
     * @param member 元素
     * @return 倒序
     */
    public static Long zrevrank(String key, String member) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(member)) {
            return null;
        }
        return doExecute(jedis -> {
            Long result = jedis.zrevrank(key, member);
            return result != null ? result + 1 : null;
        });
    }

    /**
     * 按分数倒序获取缓存中的值
     *
     * @param key 键
     * @return 缓存中的值
     */
    public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return zrevrangeByScoreWithScores(key, Double.MAX_VALUE, Double.MIN_VALUE, 0, -1);
    }

    /**
     * 按分数倒序分页获取缓存中的值
     *
     * @param key    键
     * @param offset 起始数
     * @param count  获取的总数
     * @return 缓存中的值
     */
    public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key, int offset, int count) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return zrevrangeByScoreWithScores(key, Double.MAX_VALUE, Double.MIN_VALUE, offset, count);
    }

    /**
     * 按分数倒序分页获取缓存中的值
     *
     * @param key    键
     * @param max    分数最大值
     * @param min    分数最小值
     * @param offset 起始数
     * @param count  获取的总数
     * @return 缓存中的值
     */
    public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key, Double max, Double min, int offset, int count) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> {
            Set<Tuple> set = jedis.zrevrangeByScoreWithScores(key, max, min, offset, count);
            if (set != null) {
                Set<SortedSetElement> result = new LinkedHashSet<>();
                for (Tuple each : set) {
                    result.add(new SortedSetElement(each.getElement(), each.getScore()));
                }
                return result;
            }
            return null;
        });
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值map
     */
    public static Map<String, String> hgetAll(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.hgetAll(key));
    }

    /**
     * 获取指定键的值
     *
     * @param key 键
     * @return 值map
     */
    @SuppressWarnings("unchecked")
    public static <T> Map<String, T> hgetAll(byte[] key) {
        if (key == null) {
            return null;
        }
        return doExecute(jedis -> {
            Map<String, T> result = null;
            Map<byte[], byte[]> map = jedis.hgetAll(key);
            if (map != null) {
                result = new HashMap<>();
                for (Map.Entry<byte[], byte[]> entry : map.entrySet()) {
                    result.put(new String(entry.getKey()), (T) SerializeUtils.unserialize(entry.getValue()));
                }
            }
            return result;
        });
    }

    /**
     * 获取指定键的值
     *
     * @param key   键
     * @param field map中的键
     * @return 值
     */
    public static String hget(String key, String field) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.hget(key, field));
    }

    /**
     * 获取指定键的值
     *
     * @param key   键
     * @param field map中的键
     * @return 值
     */
    @SuppressWarnings("unchecked")
    public static <T> T hget(byte[] key, byte[] field) {
        return doExecute(jedis -> {
            byte[] result = jedis.hget(key, field);
            return (T) SerializeUtils.unserialize(result);
        });
    }

    /**
     * 获取指定键的值
     *
     * @param key   键
     * @param field map中的键
     * @return 值
     */
    public static List<String> hmget(String key, String... field) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.hmget(key, field));
    }

    /**
     * 是否包含指定的键
     *
     * @param key 键
     * @return 若存在则返回true
     */
    public static Boolean exists(String key) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> jedis.exists(key));
    }

    /**
     * 缓存指定的键值
     *
     * @param key   键
     * @param value 值
     */
    public static Boolean set(String key, String value) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> {
            String result = jedis.set(key, value);
            return isSuccess(result);
        });
    }

    /**
     * 若指定的键不存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfNotExist(String key, String value) {
        return setObjectIfNotExist(key, value, -1);
    }

    /**
     * 若指定的键不存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key          键
     * @param value        值
     * @param milliseconds 缓存的时间(单位毫秒)
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfNotExist(String key, String value, int milliseconds) {
        return setObjectIfNotExist(key, (Object) value, milliseconds);
    }

    /**
     * 加锁
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     * @return 若加锁成功则返回true
     */
    public static boolean lockObject(String key, String value) {
        return lockObject(key, value, 0);
    }

    /**
     * 加锁
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key          键
     * @param value        值
     * @param milliseconds 缓存的时间(单位毫秒)
     * @return 若加锁成功则返回true
     */
    public static boolean lockObject(String key, String value, int milliseconds) {
        if (StringUtils.isBlank(key) || value == null) {
            return false;
        }
        return doExecute(jedis -> {
            String result;
            if (milliseconds > 0) {
                result = jedis.set(key.getBytes(), value.getBytes(), JedisEnum.NXXX.NX.getValue().getBytes(), JedisEnum.EXPX.PX.getValue().getBytes(), milliseconds);
            }
            else {
                result = jedis.set(key.getBytes(), value.getBytes(), JedisEnum.NXXX.NX.getValue().getBytes());
            }
            return isSuccess(result);
        });
    }


    /**
     * 解锁:条件值相等
     *
     * @param key   键
     * @param value 值
     * @return 若解锁成功则返回true
     */
    public static boolean unlock(String key, String value) {
        StringBuilder sb = new StringBuilder();
        sb.append("if redis.call(\"get\",KEYS[1]) == ARGV[1] then").append(" ");
        sb.append("return redis.call(\"del\",KEYS[1])").append(" ");
        sb.append("else").append(" ");
        sb.append("return 0").append(" ");
        sb.append("end");
        return doExecute(jedis -> (long) jedis.eval(sb.toString(), Collections.singletonList(key), Collections.singletonList(value)) > 0);
    }

    /**
     * 若指定的键存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfExist(String key, String value) {
        return setObjectIfExist(key, value, 0);
    }

    /**
     * 若指定的键存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key     键
     * @param value   值
     * @param seconds 缓存的时间(单位秒)
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfExist(String key, String value, int seconds) {
        return setObjectIfExist(key, (Object) value, seconds);
    }

    /**
     * 缓存指定的键值并放在头部
     *
     * @param key   键
     * @param value 值
     * @return 集合的大小
     */
    public static Long lpush(String key, String... value) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.lpush(key, value));
    }

    /**
     * 缓存指定的键值并放在尾部
     *
     * @param key   键
     * @param value 值
     * @return 集合的大小
     */
    public static Long rpush(String key, String... value) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.rpush(key, value));
    }

    /**
     * 从List集合头部获取元素并删除
     *
     * @param key 键
     * @return list头部的一个元素
     */
    public static String lpop(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.lpop(key));
    }

    /**
     * 从List集合中删除指定的值
     *
     * @param key   键
     * @param count count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 COUNT;
     *              count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 COUNT 的绝对值;
     *              count = 0 : 移除表中所有与 VALUE 相等的值。
     * @param value 删除的值
     * @return 删除的元素数量
     */
    public static Long lrem(String key, long count, String value) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.lrem(key, count, value));
    }

    /**
     * 从List集合尾部获取元素并删除
     *
     * @param key 键
     * @return list尾部的一个元素
     */
    public static String rpop(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.rpop(key));
    }

    /**
     * 往set缓存指定的键值
     *
     * @param key   键
     * @param value 值
     * @return 若设置成功则返回true
     */
    public static Boolean sadd(String key, String... value) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.sadd(key, value);
            return result >= 1;
        });
    }

    /**
     * 缓存指定的键值
     *
     * @param key   键
     * @param value 值
     * @param score 分数
     */
    public static Boolean zadd(String key, String value, double score) {
        if (StringUtils.isBlank(key) || value == null) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.zadd(key, score, value);
            return result >= 1;
        });
    }

    /**
     * 缓存指定的键值
     *
     * @param key   键
     * @param value 格式:{值:分数}
     */
    public static Boolean zadd(String key, Map<String, Double> value) {
        if (StringUtils.isBlank(key) || MapUtils.isEmpty(value)) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.zadd(key, value);
            return result >= 1;
        });
    }

    /**
     * 把sorted set里指定的成员增加分值
     *
     * @param key    键
     * @param member 成员
     * @param score  分值
     * @return 新的分值
     */
    public static Double zincrby(String key, String member, double score) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(member) || score == 0) {
            return 0D;
        }
        return doExecute(jedis -> jedis.zincrby(key, score, member));
    }

    /**
     * 从sorted set里删除元素
     *
     * @param key     键
     * @param members 删除的元素
     * @return 删除的数量
     */
    public static Long zrem(String key, String... members) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(members)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.zrem(key, members));
    }

    /**
     * 缓存指定的键值
     *
     * @param key   键
     * @param field map中的键
     * @param value map中的值
     */
    public static Boolean hset(String key, String field, String value) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.hset(key, field, value);
            return result >= 1;
        });
    }

    /**
     * 缓存指定的键值
     *
     * @param key   键
     * @param field map中的键
     * @param value map中的值
     */
    public static Boolean hset(String key, byte[] field, Object value) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(field)) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.hset(key.getBytes(), field, SerializeUtils.serialize(value));
            return result >= 1;
        });
    }

    /**
     * 缓存指定的键值
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     */
    public static Boolean setObject(String key, Object value) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> {
            String result = jedis.set(key.getBytes(), SerializeUtils.serialize(value));
            return isSuccess(result);
        });
    }

    /**
     * 若指定的键不存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfNotExist(String key, Object value) {
        return setObjectIfNotExist(key, value, 0);
    }

    /**
     * 若指定的键不存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key          键
     * @param value        值
     * @param milliseconds 缓存的时间(单位毫秒)
     * @return 若设置成功则返回true
     */
    public static Boolean setObjectIfNotExist(String key, Object value, int milliseconds) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> {
            String result;
            if (milliseconds > 0) {
                result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.NX.getValue().getBytes(), JedisEnum.EXPX.PX.getValue().getBytes(), milliseconds);
            }
            else {
                result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.NX.getValue().getBytes());
            }
            return isSuccess(result);
        });
    }

    /**
     * 若指定的键存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key   键
     * @param value 值
     * @return 若设置成功则返回true
     */
    public static boolean setObjectIfExist(String key, Object value) {
        return setObjectIfExist(key, value, 0);
    }

    /**
     * 若指定的键存在时则缓存
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param key     键
     * @param value   值
     * @param seconds 缓存的时间(单位秒)
     * @return 若设置成功则返回true
     */
    public static Boolean setObjectIfExist(String key, Object value, int seconds) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> {
            String result;
            if (seconds > 0) {
                result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.XX.getValue().getBytes(), JedisEnum.EXPX.EX.getValue().getBytes(), seconds);
            }
            else {
                result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.XX.getValue().getBytes());
            }
            return isSuccess(result);
        });
    }

    /**
     * 批量缓存map中的键值
     * <p><b>获取值时需用getObject方法</b></p>
     *
     * @param map 键值map
     */
    public static <T> void setObject(Map<String, T> map) {
        if (MapUtils.isEmpty(map)) {
            return;
        }
        doExecute(jedis -> {
            Pipeline pipeline = jedis.pipelined();
            try {
                for (Map.Entry<String, T> entry : map.entrySet()) {
                    pipeline.set(entry.getKey().getBytes(), SerializeUtils.serialize(entry.getValue()));
                }
                pipeline.sync();
            }
            finally {
                CloseableUtils.close(pipeline);
            }
            return null;
        });
    }

    /**
     * 增加指定的值
     *
     * @param key   键
     * @param value 增加的值
     * @return 增加后的值
     */
    public static Long incrBy(String key, int value) {
        if (StringUtils.isBlank(key) || value == 0) {
            return 0L;
        }
        return doExecute(jedis -> jedis.incrBy(key, value));
    }

    /**
     * 增加指定的值
     *
     * @param key   键
     * @param field map中的键
     * @param value 增加的值
     * @return 增加后的值
     */
    public static Long hincrBy(String key, String field, int value) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field) || value == 0) {
            return 0L;
        }
        return doExecute(jedis -> jedis.hincrBy(key, field, value));
    }

    /**
     * 减少指定的值
     *
     * @param key   键
     * @param value 减少的值
     * @return 减少后的值
     */
    public static Long decrBy(String key, long value) {
        if (StringUtils.isBlank(key) || value == 0) {
            return 0L;
        }
        return doExecute(jedis -> jedis.decrBy(key, value));
    }

    /**
     * 给指定的键设置过期时间
     *
     * @param key     键
     * @param seconds 过期时间(单位:秒)
     * @return 若设置成功则返回true
     */
    public static Boolean expire(String key, int seconds) {
        if (StringUtils.isBlank(key) || seconds <= 0) {
            return false;
        }
        return doExecute(jedis -> {
            Long result = jedis.expire(key, seconds);
            return result == 1;
        });
    }

    /**
     * 删除指定的键
     *
     * @param key 键
     * @return 删除键的数量
     */
    public static Long del(String... key) {
        if (ArrayUtils.isEmpty(key)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.del(key));
    }

    /**
     * 删除map中指定的字段
     *
     * @param key   键
     * @param field 字段
     * @return 删除字段的数量
     */
    public static Long hdel(String key, String... field) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(field)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.hdel(key, field));
    }

    /**
     * 获取以指定格式的键
     *
     * @param pattern 正则表达式
     * @return 匹配的值
     */
    public static Set<String> keys(String pattern) {
        if (StringUtils.isBlank(pattern)) {
            return null;
        }
        return doExecute(jedis -> jedis.keys(pattern));
    }

    /**
     * 获取set的大小
     *
     * @param key 键
     * @return set大小
     */
    public static Long scard(String key) {
        if (StringUtils.isBlank(key)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.scard(key));
    }

    /**
     * 获取sorted set的大小
     *
     * @param key 键
     * @return 获取sorted set大小
     */
    public static Long zcard(String key) {
        if (StringUtils.isBlank(key)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.zcard(key));
    }

    /**
     * 获取sorted set中指定成员的分数
     *
     * @param key    键
     * @param member 成员
     * @return 指定成员的分数
     */
    public static Double zscore(String key, String member) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.zscore(key, member));
    }

    /**
     * 校验set里是否已存在元素
     *
     * @param key    键
     * @param member 元素
     * @return 若存在则返回true
     */
    public static Boolean sismember(String key, String member) {
        if (StringUtils.isBlank(key)) {
            return false;
        }
        return doExecute(jedis -> jedis.sismember(key, member));
    }

    /**
     * 从set里面删除元素
     *
     * @param key    键
     * @param member 元素
     * @return 删除的数量
     */
    public static Long srem(String key, String... member) {
        if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(member)) {
            return 0L;
        }
        return doExecute(jedis -> jedis.srem(key, member));
    }

    /**
     * 返回键的过期时间(单位:秒)
     *
     * @param key 键
     * @return 键的过期时间
     */
    public static Long ttl(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        return doExecute(jedis -> jedis.ttl(key));
    }

    /**
     * @return 获取jedis对象
     */
    public static Jedis getJedis() {
        return pool.getResource();
    }

    /**
     * 清空所有的缓存
     */
    public static void flushDB() {
        doExecute(jedis -> jedis.flushDB());
    }

    /**
     * @return 缓存池配置
     */
    public static JedisPoolConfig getConfig() {
        return config;
    }

    /**
     * @return 分片信息
     */
    public static JedisShardInfo getShardInfo() {
        return shardInfo;
    }

    /**
     * 关闭jedis对象
     *
     * @param jedis jedis对象
     */
    private static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    private static boolean isSuccess(String value) {
        return "OK".equals(value);
    }

    private static <T> T doExecute(Executor<T> executor) {
        Jedis jedis = getJedis();
        try {
            return executor.execute(jedis);
        }
        catch (Throwable t) {
            log.error("缓存出现异常", t);
            return null;
        }
        finally {
            close(jedis);
        }
    }

    private interface Executor<T> {
        T execute(Jedis jedis);
    }
}

单个对象,可以存入String类型,一组集合,就存入list类型

    /**
     * 添加前台展示用户
     *
     * @param userInfo
     */
    private void addShowUser(UserInfo userInfo) {
        User User = new User();
        User.setAvatar(userInfo.getHeadImgUrl());
        User.setName(userInfo.getNickName());
        User.setStatus(1);
        User.setUserAccountUuid(userInfo.getId() + "");

        Long showUser = JedisUtils.lpush(RedisConstant.USER, GsonUtil.toJson(User));
       
    }

 //获取首页展示的5个用户
    @Override
    public List<User> getUserList() {
        List<String> users = JedisUtils.lrange(RedisConstant.USER);

        List<User> list = new ArrayList<>();

        for (String str : users) {
            User User = GsonUtil.jsonStrToObject(str, User.class);
            list.add(User);
        }
        return list;
    }
package com.sz.gcyh.crazyad.utils;

import com.gcyh.core.base.json.JsonUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.internal.bind.DateTypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.sz.gcyh.crazyad.dto.CrazyAdHomeResDto;
import com.sz.gcyh.crazyad.vo.InitvalueJson;
import io.netty.util.internal.StringUtil;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 处理json字符串与对象之间关系的工具类
 *
 */
public final class GsonUtil {

    private GsonUtil() {

    }

    /**
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        return toJson(obj, null, false);
    }

    /**
     * @param obj
     * @param isExportNull
     * @return
     */
    public static String toJson(Object obj, Boolean isExportNull) {
        return toJson(obj, null, false, isExportNull);
    }

    /**
     * @param obj
     * @param datePattern
     * @return
     */
    public static String toJson(Object obj, String datePattern) {
        return toJson(obj, datePattern, false);
    }

    /**
     * @param obj
     * @param datePattern
     * @param isPrettyPrinting
     * @return
     */
    public static String toJson(Object obj, String datePattern, Boolean isPrettyPrinting) {
        return toJson(obj, datePattern, isPrettyPrinting, null);
    }

    /**
     * @param obj
     * @param datePattern
     * @param isPrettyPrinting
     * @param isExportNull
     * @return
     */
    public static String toJson(Object obj, String datePattern, Boolean isPrettyPrinting, Boolean isExportNull) {
        GsonBuilder builder = new GsonBuilder();

        if (isPrettyPrinting != null && isPrettyPrinting) {
            builder.setPrettyPrinting();
        }
        if (StringUtil.isNullOrEmpty(datePattern)) {
            datePattern = "yyyy-MM-dd HH:mm:ss";
        }
        if (isExportNull != null && isExportNull) {
            builder.serializeNulls();
        }
        builder.disableHtmlEscaping();
        builder.setDateFormat(datePattern);
        Gson gson = builder.create();
        return gson.toJson(obj);
    }

    /**
     * 序列化成为字符串(空字符串转为 "")
     *
     * @param obj            待转换的对象
     * @param datePattern    日期格式,允许空==》默认:yyyy-MM-dd HH:mm:ss
     * @param isNeedEmptyStr 是否要将null转换成为空字符
     * @return Json数据
     */
    public static String toJsonWithEmptyStr(Object obj, String datePattern, Boolean isNeedEmptyStr) {
        GsonBuilder builder = new GsonBuilder();

        if (StringUtil.isNullOrEmpty(datePattern)) {
            datePattern = "yyyy-MM-dd HH:mm:ss";
        }
        if (isNeedEmptyStr != null && isNeedEmptyStr) {
            builder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory<>());
        }
        builder.disableHtmlEscaping();
        builder.setDateFormat(datePattern);
        Gson gson = builder.create();
        return gson.toJson(obj);
    }

    /**
     * @param jsonStr
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T jsonStrToObject(String jsonStr, Class<T> clazz) {
        // Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss").create();
        // return gson.fromJson(jsonStr, clazz);

        T result = JsonUtils.jsonToObject(jsonStr, clazz);
        return result;
    }

    public static void main(String[] args) {
        String str = "{\n" +
                "  \"name\": \"2018001期\",\n" +
                "  \"beginDate\": \"2018-10-19 02:00:00\",\n" +
                "  \"gameId\": 45,\n" +
                "  \"crazyId\":  43,\n" +
                "  \"adNum\":  200.0,\n" +
                "  \"ad\":  75.0,\n" +
                "  \"gameStatus\":  0\n" +
                "}";
        CrazyAdHomeResDto test = jsonStrToObject(str, CrazyAdHomeResDto.class);
        System.out.println(test);
    }

    /**
     * 用Type来转换Json
     *
     * @param jsonStr Json字符串
     * @param type    类型
     * @param <T>     返回类型
     * @return 数据
     */
    public static <T> T jsonStrToObjectByType(String jsonStr, Type type) {
//        Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss").create();
        Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss:SSS").create();
        return gson.fromJson(jsonStr, type);
    }

    /**
     * pretty json string to object,replace null to empty string
     *
     * @param jsonStr
     * @param typeToken
     * @param <T>
     * @return
     */
    public static <T> T jsonStrToObjectWithEmptyStr(String jsonStr, TypeToken<T> typeToken) {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss");
        builder.registerTypeAdapter(String.class, new StringNullAdapter());
        Gson gson = builder.create();

        return gson.fromJson(jsonStr, typeToken.getType());
    }

    /**
     * 转化Json成为Map<String, Object>
     *
     * @param json 待转化的Json
     * @return Map类型的结果
     */
    public static Map<String, Object> parse2Map(String json) {

        Type stringStringMap = new TypeToken<Map<String, Object>>() {
        }.getType();

        Gson gson = new Gson();
        Map<String, Object> map = gson.fromJson(json, stringStringMap);

        return map;
    }

    /**
     * 转化Json成为Map<String, String>
     *
     * @param json 待转化的Json
     * @return Map类型的结果
     */
    public static Map<String, String> parse2Mapstr(String json) {

        Type stringStringMap = new TypeToken<Map<String, String>>() {
        }.getType();

        Gson gson = new Gson();
        Map<String, String> map = gson.fromJson(json, stringStringMap);

        return map;
    }

    /**
     * 转化Json成为List
     *
     * @param json 待转化的Json
     * @return List类型的结果
     */
    public static List<InitvalueJson> parseInitvalue(String json) {
        Gson gson = new Gson();
        List<InitvalueJson> list = gson.fromJson(json, new TypeToken<List<InitvalueJson>>() {
        }.getType());
        return list;
    }
}

class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
    @SuppressWarnings("unchecked")
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        Class<T> rawType = (Class<T>) type.getRawType();
        if (rawType != String.class) {
            return null;
        }
        return (TypeAdapter<T>) new StringNullAdapter();
    }
}

class StringNullAdapter extends TypeAdapter<String> {
    @Override
    public String read(JsonReader reader) throws IOException {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return "";
        }
        return reader.nextString();
    }

    @Override
    public void write(JsonWriter writer, String value) throws IOException {
        if (value == null) {
            writer.nullValue();
            return;
        }
        writer.value(value);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39723363/article/details/84584731