All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dxy.library.cache.redis.cluster.CacheRedisCluster Maven / Gradle / Ivy

package com.dxy.library.cache.redis.cluster;

import com.dxy.library.cache.redis.IRedis;
import com.dxy.library.cache.redis.util.BitHashUtil;
import com.dxy.library.json.gson.GsonUtil;
import com.dxy.library.util.common.ListUtils;
import com.dxy.library.util.common.config.ConfigUtils;
import com.google.common.collect.Lists;
import com.google.gson.reflect.TypeToken;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import redis.clients.jedis.*;

import java.util.*;

/**
 * Redis集群模式缓存器
 * @author duanxinyuan
 * 2018/8/8 17:52
 */
public class CacheRedisCluster implements IRedis {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final Long RELEASE_SUCCESS = 1L;

    private JedisCluster jedisCluster;

    public CacheRedisCluster() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(NumberUtils.toInt(ConfigUtils.getConfig("cache.redis.connection.max.total"), 100));
        config.setMaxIdle(NumberUtils.toInt(ConfigUtils.getConfig("cache.redis.connection.max.idle"), 50));
        config.setMaxWaitMillis(NumberUtils.toInt(ConfigUtils.getConfig("cache.redis.max.wait.millis"), 5000));
        config.setTestOnBorrow(true);
        String hostsStr = ConfigUtils.getConfig("cache.redis.nodes");
        String[] hostPorts = hostsStr.split(",");
        HashSet hostSet = new HashSet<>();
        for (String hostPort : hostPorts) {
            String[] strings = hostPort.split(":");
            String host = strings[0];
            int port = strings.length > 1 ? NumberUtils.toInt(strings[1].trim(), 6379) : 6379;
            hostSet.add(new HostAndPort(host, port));
        }
        String password = ConfigUtils.getConfig("cache.redis.password");
        if (StringUtils.isEmpty(password)) {
            jedisCluster = new JedisCluster(hostSet, config);
        } else {
            jedisCluster = new JedisCluster(hostSet, 2000, 2000, 5, password, config);
        }
    }

    @Override
    public  String set(String key, T value) {
        return set(key, value, 0);
    }

    @Override
    public  String set(String key, T value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || seconds < 0) {
            return null;
        }
        String result;
        if (value instanceof String) {
            result = jedisCluster.set(key, (String) value);
        } else {
            result = jedisCluster.set(key, GsonUtil.to(value));
        }
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return result;
    }

    @Override
    public  Long setnx(String key, T value) {
        return setnx(key, value, 0);
    }

    @Override
    public  Long setnx(String key, T value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || seconds < 0) {
            return null;
        }
        Long setnx;
        if (value instanceof String) {
            setnx = jedisCluster.setnx(key, (String) value);
        } else {
            setnx = jedisCluster.setnx(key, GsonUtil.to(value));
        }
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return setnx;
    }

    @Override
    public String get(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.get(key);
    }

    @Override
    public  T get(String key, Class c) {
        if (StringUtils.isEmpty(key) || c == null) {
            return null;
        }
        String value = get(key);
        if (c == String.class) {
            return (T) value;
        } else {
            return GsonUtil.from(value, c);
        }
    }

    @Override
    public  T get(String key, TypeToken typeToken) {
        if (StringUtils.isEmpty(key) || typeToken == null) {
            return null;
        }
        return GsonUtil.from(get(key), typeToken);
    }

    @Override
    public Long incr(String key, Integer value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || value == 0 || seconds < 0) {
            return null;
        }
        long total = jedisCluster.incrBy(key, value);
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return total;
    }

    @Override
    public Long incr(String key, Integer value) {
        return incr(key, value, 0);
    }

    @Override
    public Long decr(String key, Integer value) {
        return jedisCluster.decrBy(key, value);
    }

    @Override
    public Long decr(String key, Integer value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || value == 0 || seconds < 0) {
            return null;
        }
        long total = jedisCluster.decrBy(key, value);
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return total;
    }

    @Override
    public Long expire(String key, int seconds) {
        return jedisCluster.expire(key, seconds);
    }

    @Override
    public Long persist(String key) {
        return jedisCluster.persist(key);
    }

    @Override
    public boolean exist(String key) {
        return jedisCluster.exists(key);
    }

    @Override
    public Long del(String key) {
        return jedisCluster.del(key);
    }

    @Override
    public void del(String... keys) {
        jedisCluster.del(keys);
    }

    @Override
    public  Long lpush(String key, T value) {
        return lpush(key, value, 0);
    }

    @Override
    public  Long lpush(String key, T value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || seconds < 0) {
            return null;
        }
        Long lpush;
        if (value instanceof String) {
            lpush = jedisCluster.lpush(key, (String) value);
        } else {
            lpush = jedisCluster.lpush(key, GsonUtil.to(value));
        }
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return lpush;
    }

    @Override
    public  Long lpush(String key, List values) {
        return lpush(key, values, 0);
    }

    @Override
    public  Long lpush(String key, List values, int seconds) {
        if (StringUtils.isEmpty(key) || ListUtils.isEmpty(values) || seconds < 0) {
            return null;
        }
        String[] strings = new String[values.size()];
        for (int i = 0; i < values.size(); i++) {
            T value = values.get(i);
            if (value instanceof String) {
                strings[i] = (String) value;
            } else {
                strings[i] = GsonUtil.to(value);
            }
        }
        Long lpush = jedisCluster.lpush(key, strings);
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return lpush;
    }

    @Override
    public  Long rpush(String key, T value) {
        return rpush(key, value, 0);
    }

    @Override
    public  Long rpush(String key, T value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null || seconds < 0) {
            return null;
        }
        Long lpush;
        if (value instanceof String) {
            lpush = jedisCluster.rpush(key, (String) value);
        } else {
            lpush = jedisCluster.rpush(key, GsonUtil.to(value));
        }
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return lpush;
    }

    @Override
    public  Long rpush(String key, List values) {
        return rpush(key, values, 0);
    }

    @Override
    public  Long rpush(String key, List values, int seconds) {
        if (StringUtils.isEmpty(key) || ListUtils.isEmpty(values) || seconds < 0) {
            return null;
        }
        ArrayList strings = Lists.newArrayList();
        for (int i = 0; i < values.size(); i++) {
            T value = values.get(i);
            if (value instanceof String) {
                strings.add((String) value);
            } else {
                strings.add(GsonUtil.to(value));
            }
        }
        Long lpush = jedisCluster.rpush(key, strings.toArray(new String[0]));
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return lpush;
    }

    @Override
    public List lrange(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.lrange(key, 0, llen(key));
    }

    @Override
    public  List lrange(String key, Class c) {
        return lrange(key, 0, llen(key), c);
    }

    @Override
    public List lrange(String key, long end) {
        if (StringUtils.isEmpty(key) || end < 0) {
            return null;
        }
        return jedisCluster.lrange(key, 0, end);
    }

    @Override
    public  List lrange(String key, long end, Class c) {
        return lrange(key, 0, end, c);
    }

    @Override
    public List lrange(String key, long start, long end) {
        if (StringUtils.isEmpty(key) || start < 0 || end < 0) {
            return null;
        }
        return jedisCluster.lrange(key, start, end);
    }

    @Override
    public  List lrange(String key, long start, long end, Class c) {
        if (StringUtils.isEmpty(key) || start < 0 || end < 0 || c == null) {
            return null;
        }
        List strings = jedisCluster.lrange(key, start, end);
        if (c == String.class) {
            return (List) strings;
        }
        List ts = Lists.newArrayList();
        strings.forEach(s -> ts.add(GsonUtil.from(s, c)));
        return ts;
    }

    @Override
    public List lrangePage(String key, int pageNo, int pageSize) {
        return lrange(key, pageNo * pageSize, (pageNo + 1) * pageSize);
    }

    @Override
    public  List lrangePage(String key, int pageNo, int pageSize, Class c) {
        return lrange(key, pageNo * pageSize, (pageNo + 1) * pageSize, c);
    }

    @Override
    public String lindex(String key, int index) {
        if (StringUtils.isEmpty(key) || index < 0) {
            return null;
        }
        return jedisCluster.lindex(key, index);
    }

    @Override
    public  T lindex(String key, int index, Class c) {
        if (StringUtils.isEmpty(key) || index < 0) {
            return null;
        }
        String s = jedisCluster.lindex(key, index);
        if (c == String.class) {
            return (T) s;
        } else {
            return GsonUtil.from(s, c);
        }
    }

    @Override
    public Long llen(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.llen(key);
    }

    @Override
    public void lclear(String key) {
        if (StringUtils.isEmpty(key)) {
            return;
        }
        Long llen = llen(key);
        if (llen != null && llen > 0) {
            for (long i = 0; i < llen; i++) {
                lpop(key);
            }
        }
    }

    @Override
    public Long lrem(String key, String value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        return jedisCluster.lrem(key, 0, value);
    }

    @Override
    public  Long lrem(String key, T value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        return jedisCluster.lrem(key, 0, GsonUtil.to(value));
    }

    @Override
    public Long lrem(String key, long count, String value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        return jedisCluster.lrem(key, count, value);
    }

    @Override
    public  Long lrem(String key, long count, T value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        return jedisCluster.lrem(key, count, GsonUtil.to(value));
    }

    @Override
    public String ltrim(String key, long start, long end) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.ltrim(key, start, end);
    }

    @Override
    public String lpop(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.lpop(key);
    }

    @Override
    public String rpop(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.rpop(key);
    }

    @Override
    public Long sadd(String key, String... values) {
        if (StringUtils.isEmpty(key) || values == null || values.length == 0) {
            return null;
        }
        return sadd(key, 0, values);
    }

    @Override
    public Long sadd(String key, int seconds, String... values) {
        if (StringUtils.isEmpty(key) || values == null || values.length == 0 || seconds < 0) {
            return null;
        }
        Long sadd = jedisCluster.sadd(key, values);
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return sadd;
    }

    @Override
    public boolean sismember(String key, String value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return false;
        }
        return jedisCluster.sismember(key, value);
    }

    @Override
    public Set smembers(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.smembers(key);
    }

    @Override
    public  Long hset(String key, String field, T value) {
        if (StringUtils.isEmpty(key) || field == null || value == null) {
            return null;
        }
        return hset(key, field, value, 0);
    }

    @Override
    public String hmset(String key, String... values) {
        if (StringUtils.isEmpty(key) || values == null || values.length == 0) {
            return null;
        }
        return hmset(key, 0, values);
    }

    @Override
    public  Long hset(String key, String field, T value, int seconds) {
        if (StringUtils.isEmpty(key) || field == null || value == null || seconds < 0) {
            return null;
        }
        Long hset;
        if (value instanceof String) {
            hset = jedisCluster.hset(key, field, (String) value);
        } else {
            hset = jedisCluster.hset(key, field, GsonUtil.to(value));
        }
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return hset;
    }

    @Override
    public String hmset(String key, int seconds, String... values) {
        if (StringUtils.isEmpty(key) || values == null || values.length == 0 || seconds < 0) {
            return null;
        }
        String hmset;
        int len = values.length;
        Map map = new HashMap<>(len / 2);
        for (int i = 0; i < len; ) {
            map.put(values[i], values[i + 1]);
            i += 2;
        }
        hmset = jedisCluster.hmset(key, map);

        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return hmset;
    }

    @Override
    public String hget(String key, String field) {
        if (StringUtils.isEmpty(key) || field == null) {
            return null;
        }
        return jedisCluster.hget(key, field);
    }

    @Override
    public Long hincr(String key, String field, Integer value) {
        if (StringUtils.isEmpty(key) || field == null || value == null || value == 0) {
            return null;
        }
        return jedisCluster.hincrBy(key, field, value);
    }

    @Override
    public Long hdecr(String key, String field, Integer value) {
        if (StringUtils.isEmpty(key) || field == null || value == null || value == 0) {
            return null;
        }
        return jedisCluster.hincrBy(key, field, -value);
    }

    @Override
    public Map hgetAll(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.hgetAll(key);
    }

    @Override
    public Long pfadd(String key, String value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        return jedisCluster.pfadd(key, value);
    }

    @Override
    public Long pfadd(String key, String value, int seconds) {
        if (StringUtils.isEmpty(key) || value == null) {
            return null;
        }
        Long pfadd = jedisCluster.pfadd(key, value);
        if (seconds > 0) {
            jedisCluster.expire(key, seconds);
        }
        return pfadd;
    }

    @Override
    public Long pfcount(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.pfcount(key);
    }

    @Override
    public boolean setbit(String key, long offset, boolean value) {
        if (StringUtils.isEmpty(key)) {
            return false;
        }
        return BooleanUtils.toBoolean(jedisCluster.setbit(key, offset, value));
    }

    @Override
    public boolean setbit(String key, long offset, String value) {
        if (StringUtils.isEmpty(key)) {
            return false;
        }
        return BooleanUtils.toBoolean(jedisCluster.setbit(key, offset, value));
    }

    @Override
    public boolean getbit(String key, long offset) {
        if (StringUtils.isEmpty(key)) {
            return false;
        }
        return BooleanUtils.toBoolean(jedisCluster.getbit(key, offset));
    }

    @Override
    public Long bitcount(String key) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.bitcount(key);
    }

    @Override
    public Long bitcount(String key, long start, long end) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.bitcount(key, start, end);
    }

    @Override
    public Long bitop(BitOP op, String destKey, String... srcKeys) {
        if (op == null || StringUtils.isEmpty(destKey) || srcKeys == null || srcKeys.length == 0) {
            return null;
        }
        return jedisCluster.bitop(op, destKey, srcKeys);
    }

    @Override
    public List bitfield(String key, String... arguments) {
        if (StringUtils.isEmpty(key) || arguments == null || arguments.length == 0) {
            return null;
        }
        return jedisCluster.bitfield(key, arguments);
    }

    @Override
    public Long bitpos(String key, boolean value) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.bitpos(key, value);
    }

    @Override
    public Long bitpos(String key, boolean value, long start, long end) {
        if (StringUtils.isEmpty(key)) {
            return null;
        }
        return jedisCluster.bitpos(key, value, new BitPosParams(start, end));
    }

    @Override
    public  boolean bloomadd(String key, T value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return false;
        }
        boolean bloomconstains = bloomcons(key, value);
        if (bloomconstains) {
            return false;
        }
        long[] offsets = BitHashUtil.getBitOffsets(value);
        for (long offset : offsets) {
            jedisCluster.setbit(key, offset, true);
        }
        return true;
    }

    @Override
    public  boolean bloomcons(String key, T value) {
        if (StringUtils.isEmpty(key) || value == null) {
            return false;
        }
        long[] offsets = BitHashUtil.getBitOffsets(value);
        for (long offset : offsets) {
            if (!jedisCluster.getbit(key, offset)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public boolean getDistributedLock(String lockKey, String requestId, int expireTime) {
        if (StringUtils.isEmpty(lockKey) || requestId == null) {
            return false;
        }
        String result = jedisCluster.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        return LOCK_SUCCESS.equals(result);
    }

    @Override
    public boolean releaseDistributedLock(String lockKey, String requestId) {
        if (StringUtils.isEmpty(lockKey) || requestId == null) {
            return false;
        }
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedisCluster.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
        return RELEASE_SUCCESS.equals(result);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy