redis集群事务管理工具类

来源:互联网 发布:淘宝美工好找工作吗 编辑:程序博客网 时间:2024/06/07 23:36

redis集群对象JedisCluster不支持事务,但是,集群里边的每个节点支持事务。
redis 集群管理事务的工具类

public class JedisClusterTransactionManager {    private static ThreadLocal<Object> txThreadLocal = new ThreadLocal<>();    private static ThreadLocal<JedisCluster> clusterThreadLocal= new ThreadLocal<>();    //开启事务    public static void multi(JedisCluster jedisCluster){        clusterThreadLocal.set(jedisCluster);    }    /**     * 保存string数据类型     * @param key     * @param value     */    public static void set(String key,String value) {        Transaction tx = getTxByKey(key);        tx.set(key, value);    }    /**     * 批量保存string数据类型     * @param key     * @param value     */    public static void mset(String... keysvalues) {        if(keysvalues!=null && keysvalues.length>0) {            for(int i=0;i<keysvalues.length;i+=2) {                String key = keysvalues[i];                String value = keysvalues[i+1];                Transaction tx = getTxByKey(key);                tx.set(key, value);            }        }    }    /**     * 保存hash数据类型     * @param key     * @param value     */    public static void hset(String key, String field,String value) {        Transaction tx = getTxByKey(key);        tx.hset(key, field, value);    }    /**     * 批量保存hash数据类型     * @param key     * @param value     */    public static void hmset(String key,Map<String,String> hash) {        Transaction tx = getTxByKey(key);        tx.hmset(key, hash);    }    /**     * 保存list数据类型     * @param key     * @param value     */    public static void lpush(String key,String... values) {        Transaction tx = getTxByKey(key);        tx.lpush(key, values);    }    /**     * 保存set数据类型     * @param key     * @param value     */    public static void sadd(String key,String... member) {        Transaction tx = getTxByKey(key);        tx.sadd(key, member);    }    /**     * 保存sorted set数据类型     * @param key     * @param value     */    public static void zadd(String key,Map<String,Double> scoreMembers) {        Transaction tx = getTxByKey(key);        tx.zadd(key, scoreMembers);    }    /**     * 通用删除     * @param key     * @param value     */    public static void del(String... keys) {        if(keys!=null && keys.length>0) {            for(String key:keys) {                Transaction tx = getTxByKey(key);                tx.del(key);            }        }    }    /**     * 删除hash     * @param key     * @param value     */    public static void hdel(String key,String... field) {        Transaction tx = getTxByKey(key);        tx.hdel(key, field);    }    /**     * 删除set     * @param key     * @param value     */    public static void srem(String key,String... member) {        Transaction tx = getTxByKey(key);        tx.srem(key, member);    }    /**     * 删除sorted set     * @param key     * @param value     */    public static void zrem(String key,String... member) {        Transaction tx = getTxByKey(key);        tx.zrem(key, member);    }    /**     * 提交     */    public static void exec() {        Map<String,Transaction> map = (Map<String,Transaction> )txThreadLocal.get();        for(Entry<String,Transaction> entry:map.entrySet()) {            entry.getValue().exec();        }    }    /**     * 回滚     */    public static void discard() {        Map<String,Transaction> map = (Map<String,Transaction> )txThreadLocal.get();        for(Entry<String,Transaction> entry:map.entrySet()) {            entry.getValue().discard();        }    }    /**     * 根据key,得到事务对象     * @param cluster     * @param key     * @return     */    private static Transaction getTxByKey(String key) {        JedisCluster cluster = clusterThreadLocal.get();        Map<String, Transaction> res = (Map<String, Transaction>)txThreadLocal.get();        if(res==null) {            res = new HashMap<>();        }        Map<String, JedisPool> map = cluster.getClusterNodes();        for(Entry<String,JedisPool> entry:map.entrySet()) {            String keyEntry = entry.getKey();            String strArray[] = keyEntry.split(":");            String host = strArray[0];            Integer port = Integer.parseInt(strArray[1]);            Jedis jedis = new Jedis(host, port);            try {                jedis.exists(key);                Transaction tx = jedis.multi();                res.put(key, tx);                txThreadLocal.set(res);                return tx;            } catch (Exception e) {                jedis.close();            }        }        return null;    }}
原创粉丝点击