redis集群使用Java工具类(Java jedis集群工具类)

package com.xiaomi.weather.vote.webservices.util.redisCache;

import com.google.common.base.Strings;
import org.apache.log4j.Logger;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.io.InputStream;
import java.util.*;

/**

  • Created by mi on 16-12-22.
    */
    public class RedisClusterClient {
    private static final Logger logger = Logger.getLogger(RedisClusterClient.class);
    private static String isOn = "true"; // 是否启用缓存
    private static JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 配置信息
    public JedisCluster jedisCluster = null;
    Set
    <HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

    public static RedisClusterClient redisClusterClient = new RedisClusterClient();

    public RedisClusterClient() {
    init();
    }

    public static RedisClusterClient getInsance() {
    if (redisClusterClient != null) {
    return redisClusterClient;
    }
    else {
    redisClusterClient
    = new RedisClusterClient();
    return redisClusterClient;
    }
    }

    public boolean init() {
    try {
    // 读取配置文件
    InputStream path = RedisClusterClient.class.getClassLoader().getResourceAsStream("cache.properties");
    Properties pros
    = new Properties();
    pros.load(path);
    this.isOn = pros.getProperty("redis.onoff", "true");// 默认开启缓存
    if (this.isOn.equals("false")) {// 未开启缓存
    return false;
    }

         </span><span style="color: rgba(0, 128, 0, 1)">//
    

String servers = pros.getProperty("redisMultiCluster.clusters", null);
if (Strings.isNullOrEmpty(servers)) {
logger.error(
"RedisJavaClient.servers 配置错误; in file:cache.properties");
this.isOn = "false";
return false;
}
String[] hostAndPorts
= servers.split("\|");
for (int i = 0; i < hostAndPorts.length; i++) {
String hostAndPort
= hostAndPorts[i];
if (!hostAndPort.contains(":")) {
return false;
}
jedisClusterNodes.add(
new HostAndPort(hostAndPort.split(":")[0], Integer.parseInt(hostAndPort.split(":")[1])));
}
try {
jedisPoolConfig.setMaxTotal(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxTotal", "8")));
jedisPoolConfig.setMaxIdle(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxIdle", "8")));
jedisPoolConfig.setMinIdle(Integer.parseInt(pros.getProperty(
"redisMultiCluster.minIdle", "0")));
jedisPoolConfig
.setBlockWhenExhausted(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.blockWhenExhausted", "true")));
jedisPoolConfig.setMaxWaitMillis(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxWaitMillis", "true")));
jedisPoolConfig.setTestOnBorrow(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnBorrow", "true")));
jedisPoolConfig.setTestOnCreate(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnCreate", "true")));
jedisPoolConfig.setTestOnReturn(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnReturn", "true")));
jedisPoolConfig.setTestWhileIdle(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testWhileIdle", "false")));

        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            logger.error(</span>"{未知异常}"<span style="color: rgba(0, 0, 0, 1)">, e);
        }
        jedisCluster </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JedisCluster(jedisClusterNodes, jedisPoolConfig);
        logger.info(</span>"缓存初始化成功"<span style="color: rgba(0, 0, 0, 1)">);
        path.close();
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{缓存初始化错误}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isOn = "false"<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> setnx(String key, String value, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Long setSuccess </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.setnx(key, value);
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (setSuccess == 1<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> set(String key, String value, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.setex(key, expireTime, value);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String get(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> ""<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> jedisCluster.get(key);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">boolean</span> setList(String key, List&lt;T&gt; list, Class&lt;T&gt; tClass, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.setnx(key + "Lock", "true"<span style="color: rgba(0, 0, 0, 1)">, expireTime)) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (T t : list) {
                jedisCluster.rpush(key, SerializationDefine.Object2String(t));
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
        }
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; List&lt;T&gt; getList(String key, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> tClass) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        List</span>&lt;T&gt; tList = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">();
        List</span>&lt;String&gt; strList = jedisCluster.lrange(key, 0L, -1L<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (String str : strList) {
            tList.add(SerializationDefine.String2Object(str, tClass));
        }

        </span><span style="color: rgba(0, 0, 255, 1)">return</span> tList.size() == 0 ? <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)"> : tList;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">boolean</span> setMap(String key, Map&lt;String, T&gt; map, Class&lt;T&gt; tClass, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    Map</span>&lt;String, String&gt; catchMap = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap&lt;String, String&gt;<span style="color: rgba(0, 0, 0, 1)">();
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.setnx(key + "Lock", "true"<span style="color: rgba(0, 0, 0, 1)">, expireTime)) {
        </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
        </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, T&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : map.entrySet()) {
            catchMap.put(entry.getKey(), SerializationDefine.Object2String(entry.getValue()));
        }
        jedisCluster.hmset(key, catchMap);
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
        }

    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; Map&lt;String, T&gt; getMap(String key, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> tClass) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Map</span>&lt;String, String&gt; catchMap =<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.hgetAll(key);
        Map</span>&lt;String, T&gt; retMap = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap&lt;String, T&gt;<span style="color: rgba(0, 0, 0, 1)">();
        </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, String&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : catchMap.entrySet()) {
            retMap.put(entry.getKey(), SerializationDefine.String2Object(entry.getValue(), tClass));
        }
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> retMap;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }

}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> deleteKey(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.del(key)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception("redis异常,删除key失败:method = deleteKey; key = " +<span style="color: rgba(0, 0, 0, 1)"> key);
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{严重异常}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 加1操作
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> incr(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.incr(key);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 减1操作
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> decr(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.decr(key);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 判断是否已缓存
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> isExist(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> jedisCluster.exists(key);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

}

RedisClusterClient

说明,当 redis 连接不够用时,此 setnx 可能存在一些 bug,即超时时间可能设置不成功!

所以当存在连接可能不够用的情况时,尽量不要使用 setnx。

 

配置文件:

redis.onoff=true
redis.defaultExpireInSecond=900
redis.namespace=${cache_namespace}
redis.prefix=api-v3
RedisJavaClient.onoff=true
RedisJavaClient.servers=${redis_servers}
##==========================================================
redisMultiCluster.defaultExpireInSecond=900
redisMultiCluster.prefix=location-v3
redisMultiCluster.namespace=${cache_namespace}
redisMultiCluster.onoff=true
redisMultiCluster.clusters=${redis_clusters}
redisMultiCluster.route=route1:0|route2:1
redisMultiCluster.rule=com.xiaomi.weather.commons.cache.SubKeyRule
redisMultiCluster.startIndex=0
redisMultiCluster.endIndex=5

##------------- 连接池配置 ------------------
#最大连接数,最大资源空闲数目,最小资源空闲数目
redisMultiCluster.maxTotal
=30
redisMultiCluster.maxIdle
=30
redisMultiCluster.minIdle
=10
#连接耗尽时,是否等待;等待时长 (ms)
redisMultiCluster.blockWhenExhausted
=true
redisMultiCluster.maxWaitMillis
=500

#输出连接时是否检测空闲超时,回收连接检测,创建连接检测,输出连接检测,
redisMultiCluster.testWhileIdle=false
redisMultiCluster.testOnReturn
=true
redisMultiCluster.testOnCreate
=true
redisMultiCluster.testOnBorrow
=true

#(暂时不可用) 资源耗尽时的处理措施 0 - 抛异常,1 - 阻塞等待可用资源,2-强制创建新连接
redisMultiCluster.whenExhaustedAction
=1

View Code

 

序列化类:

package com.xiaomi.weather.vote.webservices.util.redisCache;

import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Preconditions;

/**

  • Created by mi on 16-12-22.
    */
    public class SerializationDefine {
    public static String Object2String(Object obj) {
    Preconditions.checkArgument(obj
    != null, "序列化对象为 null");
    return JSONObject.toJSONString(obj);
    }

    public static <T> T String2Object(String str, Class<T> tClass) {
    return JSONObject.parseObject(str, tClass);
    }
    }

View Code

 

工具类第二版,修复删除 key, 而 key 不存在时报异常的 bug;

package com.xiaomi.weather.vote.webservices.util.redisCache;

import com.google.common.base.Strings;
import org.apache.log4j.Logger;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.io.InputStream;
import java.util.*;

/**

  • Created by mi on 16-12-22.
    */
    public class RedisClusterClient {
    private static final Logger logger = Logger.getLogger(RedisClusterClient.class);
    private static String isOn = "true"; // 是否启用缓存
    private static JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 配置信息
    public JedisCluster jedisCluster = null;
    Set
    <HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

    public static RedisClusterClient redisClusterClient = new RedisClusterClient();

    public RedisClusterClient() {
    init();
    }

    public static RedisClusterClient getInsance() {
    if (redisClusterClient != null) {
    return redisClusterClient;
    }
    else {
    redisClusterClient
    = new RedisClusterClient();
    return redisClusterClient;
    }
    }

    public boolean init() {
    try {
    // 读取配置文件
    InputStream path = RedisClusterClient.class.getClassLoader().getResourceAsStream("cache.properties");
    Properties pros
    = new Properties();
    pros.load(path);
    this.isOn = pros.getProperty("redis.onoff", "true");// 默认开启缓存
    if (this.isOn.equals("false")) {// 未开启缓存
    return false;
    }

         </span><span style="color: rgba(0, 128, 0, 1)">//
    

String servers = pros.getProperty("redisMultiCluster.clusters", null);
if (Strings.isNullOrEmpty(servers)) {
logger.error(
"RedisJavaClient.servers 配置错误; in file:cache.properties");
this.isOn = "false";
return false;
}
String[] hostAndPorts
= servers.split("\|");
for (int i = 0; i < hostAndPorts.length; i++) {
String hostAndPort
= hostAndPorts[i];
if (!hostAndPort.contains(":")) {
return false;
}
jedisClusterNodes.add(
new HostAndPort(hostAndPort.split(":")[0], Integer.parseInt(hostAndPort.split(":")[1])));
}
try {
jedisPoolConfig.setMaxTotal(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxTotal", "8")));
jedisPoolConfig.setMaxIdle(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxIdle", "8")));
jedisPoolConfig.setMinIdle(Integer.parseInt(pros.getProperty(
"redisMultiCluster.minIdle", "0")));
jedisPoolConfig
.setBlockWhenExhausted(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.blockWhenExhausted", "true")));
jedisPoolConfig.setMaxWaitMillis(Integer.parseInt(pros.getProperty(
"redisMultiCluster.maxWaitMillis", "true")));
jedisPoolConfig.setTestOnBorrow(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnBorrow", "true")));
jedisPoolConfig.setTestOnCreate(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnCreate", "true")));
jedisPoolConfig.setTestOnReturn(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testOnReturn", "true")));
jedisPoolConfig.setTestWhileIdle(Boolean.parseBoolean(pros.getProperty(
"redisMultiCluster.testWhileIdle", "false")));

        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            logger.error(</span>"{未知异常}"<span style="color: rgba(0, 0, 0, 1)">, e);
        }
        jedisCluster </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JedisCluster(jedisClusterNodes, jedisPoolConfig);
        logger.info(</span>"缓存初始化成功"<span style="color: rgba(0, 0, 0, 1)">);
        path.close();
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{缓存初始化错误}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isOn = "false"<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> setnx(String key, String value, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Long setSuccess </span>=<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.setnx(key, value);
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (setSuccess == 1) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">写入成功</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception ex) {
            logger.error(</span>"删除key异常:key = " +<span style="color: rgba(0, 0, 0, 1)"> key);
        }
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> set(String key, String value, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.setex(key, expireTime, value);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String get(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> ""<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> jedisCluster.get(key);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">boolean</span> setList(String key, List&lt;T&gt; list, Class&lt;T&gt; tClass, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.setnx(key + "Lock", "true"<span style="color: rgba(0, 0, 0, 1)">, expireTime)) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
            </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (T t : list) {
                jedisCluster.rpush(key, SerializationDefine.Object2String(t));
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
        }
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; List&lt;T&gt; getList(String key, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> tClass) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        List</span>&lt;T&gt; tList = <span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">();
        List</span>&lt;String&gt; strList = jedisCluster.lrange(key, 0L, -1L<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (String str : strList) {
            tList.add(SerializationDefine.String2Object(str, tClass));
        }

        </span><span style="color: rgba(0, 0, 255, 1)">return</span> tList.size() == 0 ? <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)"> : tList;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; <span style="color: rgba(0, 0, 255, 1)">boolean</span> setMap(String key, Map&lt;String, T&gt; map, Class&lt;T&gt; tClass, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> expireTime) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    Map</span>&lt;String, String&gt; catchMap = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap&lt;String, String&gt;<span style="color: rgba(0, 0, 0, 1)">();
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.setnx(key + "Lock", "true"<span style="color: rgba(0, 0, 0, 1)">, expireTime)) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, T&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : map.entrySet()) {
                catchMap.put(entry.getKey(), SerializationDefine.Object2String(entry.getValue()));
            }
            jedisCluster.hmset(key, catchMap);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.expire(key, expireTime)) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.deleteKey(key);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }

        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{严重异常}"<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> &lt;T&gt; Map&lt;String, T&gt; getMap(String key, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> tClass) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Map</span>&lt;String, String&gt; catchMap =<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.hgetAll(key);
        Map</span>&lt;String, T&gt; retMap = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap&lt;String, T&gt;<span style="color: rgba(0, 0, 0, 1)">();
        </span><span style="color: rgba(0, 0, 255, 1)">for</span> (Map.Entry&lt;String, String&gt;<span style="color: rgba(0, 0, 0, 1)"> entry : catchMap.entrySet()) {
            retMap.put(entry.getKey(), SerializationDefine.String2Object(entry.getValue(), tClass));
        }
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> retMap;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }

}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> deleteKey(String key) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">this</span>.isExist(key)) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">key不存在</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        }
        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (1 ==<span style="color: rgba(0, 0, 0, 1)"> jedisCluster.del(key)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
        } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception("redis异常,删除key失败:method = deleteKey; key = " +<span style="color: rgba(0, 0, 0, 1)"> key);
        }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{严重异常}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception("redis异常,删除key失败:method = deleteKey; key = " +<span style="color: rgba(0, 0, 0, 1)"> key);
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 加1操作
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> incr(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.incr(key);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 减1操作
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> decr(String key) {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        jedisCluster.decr(key);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{}"<span style="color: rgba(0, 0, 0, 1)">, e);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
 * 判断是否已缓存
 *
 * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> key
 * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
 <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> isExist(String key) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isOn.equals("true"<span style="color: rgba(0, 0, 0, 1)">)) {
        logger.info(</span>"缓存未开启"<span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> jedisCluster.exists(key);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        logger.error(</span>"{严重异常}判断key是否存在发生异常... ... key = " +<span style="color: rgba(0, 0, 0, 1)"> key, e);
        </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception("{严重异常}判断key是否存在发生异常... ...key = " +<span style="color: rgba(0, 0, 0, 1)"> key);
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] arges) {
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        System.out.println(RedisClusterClient.getInsance().jedisCluster.del(</span>"panpanpan"<span style="color: rgba(0, 0, 0, 1)">));
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        e.printStackTrace();
    }

}

}

View Code