校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > redis 集群批量操作實(shí)現(xiàn)

redis 集群批量操作實(shí)現(xiàn)

熱門標(biāo)簽:北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 十堰營銷電銷機(jī)器人哪家便宜 超呼電話機(jī)器人 鄭州人工智能電銷機(jī)器人系統(tǒng) 山東外呼銷售系統(tǒng)招商 宿遷便宜外呼系統(tǒng)平臺 魔獸2青云地圖標(biāo)注 日本中國地圖標(biāo)注 貴州電銷卡外呼系統(tǒng)

 Redis集群是沒法執(zhí)行批量操作命令的,如mget,pipeline等。這是因?yàn)閞edis將集群劃分為16383個(gè)哈希槽,不同的key會劃分到不同的槽中。但是,Jedis客戶端提供了計(jì)算key的slot方法,已經(jīng)slot和節(jié)點(diǎn)之間的映射關(guān)系,通過這兩個(gè)數(shù)據(jù),就可以計(jì)算出每個(gè)key所在的節(jié)點(diǎn),然后使用pipeline獲取數(shù)據(jù)。具體代碼如下:

初始化    JedisCluster類

@Configuration
public class JedisClusterConfig {

    @Value("${spring.redis.cluster.nodes}")
    private String clusterNodes;

    @Value("${spring.redis.cache.commandTimeout}")
    private Integer commandTimeout;

    @Bean
    public JedisCluster getJedisCluster() {

        String[] serverArray = clusterNodes.split(",");
        SetHostAndPort> nodes = new HashSet>();
        for (String ipPort : serverArray) {
            String[] ipPortPair = ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim())));
        }
        return new JedisCluster(nodes, commandTimeout);
    }
}

工具類 JedisClusterUtil

@Component
public class JedisClusterUtil {

    @Autowired
    private JedisCluster jedisCluster;

    @Resource(name = "redisTemplate4Json")
    protected RedisTemplateString, Object> redisTemplate;

    /**
     * ZSet批量查詢
     * @param keys
     * @return
     */
    public ListObject> batchZRange(ListString> keys) {

        ListObject> resList = new ArrayList>();
        if (keys == null || keys.size() == 0) {
            return resList;
        }

        if (keys.size() == 1) {
            BoundZSetOperationsString, Object> operations = redisTemplate.boundZSetOps(keys.get(0));
            SetObject> set = operations.reverseRange(0, 0);
            resList.add(set.iterator().next());
            return resList;
        }

        MapJedisPool, ListString>> jedisPoolMap = getJedisPool(keys);

        ListString> keyList;
        JedisPool currentJedisPool = null;
        Pipeline currentPipeline;
        ListObject> res = new ArrayList>();
        MapString, Object> resultMap = new HashMap>();

        //執(zhí)行
        for (Map.EntryJedisPool, ListString>> entry : jedisPoolMap.entrySet()) {
            Jedis jedis = null;
            try {
                currentJedisPool = entry.getKey();
                keyList = entry.getValue();
                //獲取pipeline
                jedis = currentJedisPool.getResource();
                currentPipeline = jedis.pipelined();
                for (String key : keyList) {
                    currentPipeline.zrevrange(key, 0, 0);
                }
                //從pipeline中獲取結(jié)果
                res = currentPipeline.syncAndReturnAll();
                currentPipeline.close();
                for (int i = 0; i  keyList.size(); i++) {
                    if (null == res.get(i)) {
                        resultMap.put(keyList.get(i), null);
                    } else {
                        SetObject> set = (SetObject>) res.get(i);
                        if (null == set || set.isEmpty()) {
                            resultMap.put(keyList.get(i), null);
                        } else {
                            byte[] byteStr = set.iterator().next().toString().getBytes();
                            Object obj = redisTemplate.getDefaultSerializer().deserialize(byteStr);
                            resultMap.put(keyList.get(i), obj);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                returnResource(jedis, currentJedisPool);
            }
        }
        resList = sortList(keys, resultMap);
        return resList;
    }

    /**
     * Value批量查詢
     * @param keys
     * @return
     */
    public ListObject> batchGet(ListString> keys){
        ListObject> resList = new ArrayList>();
        if (keys == null || keys.size() == 0) {
            return resList;
        }

        if (keys.size() == 1) {
            BoundValueOperationsString, Object> operations = redisTemplate.boundValueOps(keys.get(0));
            resList.add(operations.get());
            return resList;
        }

        MapJedisPool, ListString>> jedisPoolMap = getJedisPool(keys);

        ListString> keyList;
        JedisPool currentJedisPool = null;
        Pipeline currentPipeline;
        ListObject> res = new ArrayList>();
        MapString, Object> resultMap = new HashMap>();

        for (Map.EntryJedisPool, ListString>> entry : jedisPoolMap.entrySet()) {
            Jedis jedis = null;
            try {
                currentJedisPool = entry.getKey();
                keyList = entry.getValue();
                //獲取pipeline
                jedis = currentJedisPool.getResource();
                currentPipeline = jedis.pipelined();
                for (String key : keyList) {
                    currentPipeline.get(key);
                }
                //從pipeline中獲取結(jié)果
                res = currentPipeline.syncAndReturnAll();
                currentPipeline.close();
                for (int i = 0; i  keyList.size(); i++) {
                    if (null == res.get(i)) {
                        resultMap.put(keyList.get(i), null);
                    } else {
                        byte[] byteStr = keyList.get(i).toString().getBytes();
                        Object obj = redisTemplate.getDefaultSerializer().deserialize(byteStr);
                        resultMap.put(keyList.get(i), obj);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                returnResource(jedis, currentJedisPool);
            }
        }
        resList = sortList(keys, resultMap);
        return resList;
    }

    private MapJedisPool, ListString>> getJedisPool(ListString> keys){
        //JedisCluster繼承了BinaryJedisCluster
        //BinaryJedisCluster的JedisClusterConnectionHandler屬性
        //里面有JedisClusterInfoCache,根據(jù)這一條繼承鏈,可以獲取到JedisClusterInfoCache
        //從而獲取slot和JedisPool直接的映射
        MetaObject metaObject = SystemMetaObject.forObject(jedisCluster);
        JedisClusterInfoCache cache = (JedisClusterInfoCache) metaObject.getValue("connectionHandler.cache");
        //保存地址+端口和命令的映射
        MapJedisPool, ListString>> jedisPoolMap = new HashMap>();

        JedisPool currentJedisPool = null;
        ListString> keyList;
        for (String key : keys) {
            //計(jì)算哈希槽
            int crc = JedisClusterCRC16.getSlot(key);
            //通過哈希槽獲取節(jié)點(diǎn)的連接
            currentJedisPool = cache.getSlotPool(crc);

            //由于JedisPool作為value保存在JedisClusterInfoCache中的一個(gè)map對象中,每個(gè)節(jié)點(diǎn)的
            //JedisPool在map的初始化階段就是確定的和唯一的,所以獲取到的每個(gè)節(jié)點(diǎn)的JedisPool都是一樣
            //的,可以作為map的key
            if (jedisPoolMap.containsKey(currentJedisPool)) {
                jedisPoolMap.get(currentJedisPool).add(key);
            } else {
                keyList = new ArrayList>();
                keyList.add(key);
                jedisPoolMap.put(currentJedisPool, keyList);
            }
        }
        return jedisPoolMap;
    }

    private ListObject> sortList(ListString> keys, MapString, Object> params) {
        ListObject> resultList = new ArrayList>();
        IteratorString> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            resultList.add(params.get(key));
        }
        return resultList;
    }

    /**
     * 釋放jedis資源
     *
     * @param jedis
     */
    public void returnResource(Jedis jedis, JedisPool jedisPool) {
        if (jedis != null  jedisPool != null) {
            jedisPool.returnResource(jedis);
        }
    }

 注意:一定要完成后釋放 jedis 資源  不然會造成卡死現(xiàn)象

到此這篇關(guān)于redis 集群批量操作實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis 集群批量操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 用python 批量操作redis數(shù)據(jù)庫
  • 詳解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

標(biāo)簽:楊凌 大慶 江蘇 臺州 朝陽 果洛 吉安 北京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《redis 集群批量操作實(shí)現(xiàn)》,本文關(guān)鍵詞  redis,集群,批量,操作,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《redis 集群批量操作實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于redis 集群批量操作實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    免费视频最近日韩| 亚洲成人动漫一区| 精品免费日韩av| 欧美日韩国产高清一区二区三区 | 日韩视频免费观看高清在线视频| 国产精品自拍在线| 日本女优在线视频一区二区| 亚洲男帅同性gay1069| 亚洲欧美在线视频| 国产精品福利电影一区二区三区四区| 国产一区二区精品久久91| 日本成人超碰在线观看| 蜜桃av噜噜一区| 激情小说欧美图片| 国产一区二区三区四| 国产一区二区在线影院| 高清beeg欧美| 99精品视频在线免费观看| 91免费看片在线观看| 在线观看亚洲一区| 欧美高清视频一二三区 | 欧美一区二区三区四区在线观看| 日韩一区二区三区电影 | 免费在线看成人av| 激情综合色丁香一区二区| 国产精品一色哟哟哟| 成人免费毛片嘿嘿连载视频| 91麻豆.com| 91麻豆精品国产91| 久久久午夜精品理论片中文字幕| 中文字幕一区二区三区精华液| 亚洲黄色片在线观看| 日韩制服丝袜av| 国产一区二区三区四区五区入口| 99在线精品免费| 欧美美女网站色| 国产欧美日韩不卡| 亚洲精品亚洲人成人网在线播放| 婷婷成人综合网| 国产91精品久久久久久久网曝门| 91麻豆国产精品久久| 在线成人午夜影院| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美一区二区网站| 日本一区二区免费在线| 亚洲色图一区二区三区| 蜜臀久久99精品久久久久宅男| 国产sm精品调教视频网站| 色国产综合视频| 日韩午夜在线影院| 亚洲欧洲av在线| 秋霞午夜鲁丝一区二区老狼| 成人av网在线| 日韩一区二区三区三四区视频在线观看| 国产色一区二区| 婷婷中文字幕一区三区| 国产成人精品一区二| 欧美日韩第一区日日骚| 欧美激情在线一区二区三区| 午夜精品福利一区二区三区蜜桃| 国产91精品一区二区麻豆网站 | 亚洲黄一区二区三区| 蜜桃视频一区二区三区在线观看 | 欧美一区国产二区| 亚洲六月丁香色婷婷综合久久 | 91国在线观看| 国产亚洲欧洲997久久综合| 夜夜夜精品看看| 风间由美中文字幕在线看视频国产欧美| 欧美三级蜜桃2在线观看| 欧美国产精品一区二区| 免费精品视频最新在线| 欧美天天综合网| 亚洲三级在线看| 国产激情视频一区二区三区欧美| 7777女厕盗摄久久久| 亚洲一二三专区| 91无套直看片红桃| 欧美激情在线一区二区| 韩国v欧美v亚洲v日本v| 日韩一级成人av| 香蕉久久一区二区不卡无毒影院 | 国产成+人+日韩+欧美+亚洲| 欧美美女黄视频| 一区二区三区四区蜜桃| 不卡区在线中文字幕| 精品国产一区二区三区忘忧草 | 91麻豆精品在线观看| 欧美激情在线观看视频免费| 精品一区二区三区免费| 日韩欧美国产综合一区 | 免费不卡在线观看| 欧美精品乱码久久久久久按摩| 亚洲一区在线观看免费| 色婷婷综合久久久中文字幕| 欧美国产欧美亚州国产日韩mv天天看完整| 美女高潮久久久| 日韩女优av电影在线观看| 日韩在线卡一卡二| 欧美精品亚洲二区| 亚洲午夜在线观看视频在线| 97久久精品人人爽人人爽蜜臀| 中文字幕制服丝袜成人av| 国产宾馆实践打屁股91| 日本一区二区三区在线不卡| 高清国产午夜精品久久久久久| 国产女人18毛片水真多成人如厕 | 欧美丝袜自拍制服另类| 亚洲午夜久久久久中文字幕久| 在线视频一区二区免费| 亚洲愉拍自拍另类高清精品| 欧美亚洲一区二区在线| 亚洲va中文字幕| 欧美日韩国产小视频在线观看| 亚洲国产精品尤物yw在线观看| 欧美日韩免费在线视频| 日日摸夜夜添夜夜添亚洲女人| 8v天堂国产在线一区二区| 奇米精品一区二区三区在线观看| 欧美一区二视频| 国产一区二区三区免费| 国产精品国产三级国产aⅴ入口| 色综合天天性综合| 性欧美疯狂xxxxbbbb| 精品国产免费一区二区三区香蕉| 国产精品一品视频| 中文字幕人成不卡一区| 欧美日韩一二三| 九色综合狠狠综合久久| 国产日产欧产精品推荐色 | 在线一区二区三区四区| 亚洲国产美女搞黄色| 日韩欧美国产三级| 国产成人欧美日韩在线电影| 亚洲欧美色综合| 777奇米四色成人影色区| 国产精品资源在线| 亚洲欧美另类小说| 91精品国产91久久久久久最新毛片| 精品一区二区三区的国产在线播放 | 337p粉嫩大胆色噜噜噜噜亚洲| 国产成人精品三级麻豆| 亚洲图片欧美综合| 欧美电视剧免费全集观看| 波多野结衣一区二区三区| 婷婷久久综合九色综合绿巨人| 久久一二三国产| 欧美做爰猛烈大尺度电影无法无天| 免费人成精品欧美精品| 亚洲天天做日日做天天谢日日欢| 欧美精品乱码久久久久久| 国产+成+人+亚洲欧洲自线| 一个色在线综合| 国产欧美日韩综合| 欧美日韩精品专区| 国产精品88888| 午夜精品福利一区二区蜜股av| 久久久www成人免费毛片麻豆| 欧美三日本三级三级在线播放| 狠狠v欧美v日韩v亚洲ⅴ| 一区二区视频在线| 久久精品亚洲精品国产欧美kt∨ | 久久久久久97三级| 欧美三级日韩在线| 成人黄色电影在线 | 国产在线精品免费| 亚洲成人手机在线| 国产精品网曝门| 欧美电影精品一区二区| 欧美亚洲精品一区| 成人h动漫精品| 韩国av一区二区三区| 五月婷婷久久丁香| 亚洲视频免费在线观看| 2024国产精品视频| 欧美日本国产一区| 色综合视频在线观看| 国产91富婆露脸刺激对白| 久久精品国产**网站演员| 亚洲一区二区3| 综合亚洲深深色噜噜狠狠网站| 久久综合狠狠综合久久综合88 | 制服丝袜一区二区三区| 色狠狠色狠狠综合| 97久久精品人人爽人人爽蜜臀| 国产精品 欧美精品| 激情亚洲综合在线| 麻豆freexxxx性91精品| 亚洲电影第三页| 亚洲综合色噜噜狠狠| 亚洲欧美中日韩| 中文字幕在线一区| 国产精品色一区二区三区| 久久免费视频色| 欧美成人一区二区| 欧美不卡123| 精品1区2区在线观看| 日韩精品一区二区三区视频| 69久久夜色精品国产69蝌蚪网| 欧美日韩精品一区二区天天拍小说|