婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > redis 集群批量操作實現

redis 集群批量操作實現

熱門標簽:北京400電話辦理收費標準 十堰營銷電銷機器人哪家便宜 超呼電話機器人 鄭州人工智能電銷機器人系統 山東外呼銷售系統招商 宿遷便宜外呼系統平臺 魔獸2青云地圖標注 日本中國地圖標注 貴州電銷卡外呼系統

 Redis集群是沒法執行批量操作命令的,如mget,pipeline等。這是因為redis將集群劃分為16383個哈希槽,不同的key會劃分到不同的槽中。但是,Jedis客戶端提供了計算key的slot方法,已經slot和節點之間的映射關系,通過這兩個數據,就可以計算出每個key所在的節點,然后使用pipeline獲取數據。具體代碼如下:

初始化    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>();

        //執行
        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中獲取結果
                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中獲取結果
                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,根據這一條繼承鏈,可以獲取到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) {
            //計算哈希槽
            int crc = JedisClusterCRC16.getSlot(key);
            //通過哈希槽獲取節點的連接
            currentJedisPool = cache.getSlotPool(crc);

            //由于JedisPool作為value保存在JedisClusterInfoCache中的一個map對象中,每個節點的
            //JedisPool在map的初始化階段就是確定的和唯一的,所以獲取到的每個節點的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 資源  不然會造成卡死現象

到此這篇關于redis 集群批量操作實現的文章就介紹到這了,更多相關redis 集群批量操作內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

標簽:楊凌 大慶 江蘇 臺州 朝陽 果洛 吉安 北京

巨人網絡通訊聲明:本文標題《redis 集群批量操作實現》,本文關鍵詞  redis,集群,批量,操作,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《redis 集群批量操作實現》相關的同類信息!
  • 本頁收集關于redis 集群批量操作實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩免费高清一区色橹橹| 亚洲精品欧美激情| 亚洲精品日韩一| 欧美在线999| 青青国产91久久久久久| 久久久99精品免费观看不卡| 成人激情综合网站| 中日韩av电影| 欧美日韩视频在线第一区| 日韩电影在线观看一区| 欧美性xxxxxxxx| 亚洲一区欧美一区| 91精品国产综合久久小美女| 亚洲日本免费电影| 精品日韩av一区二区| 色综合天天综合在线视频| 午夜精品久久久久久久久久久| 久久婷婷色综合| 欧美乱妇15p| 不卡一区二区三区四区| 久久av中文字幕片| 国产女人18水真多18精品一级做| 久久99国产精品久久99| 亚洲乱码国产乱码精品精98午夜 | 在线视频国内自拍亚洲视频| 亚洲少妇屁股交4| 久久久久久久久久久久久久久99 | 日韩午夜电影在线观看| 色播五月激情综合网| 国产精品自拍在线| 韩国一区二区三区| 日本不卡免费在线视频| 亚洲成人一区二区在线观看| 亚洲精品高清在线观看| 国产精品女上位| 6080国产精品一区二区| 欧美性生活影院| 97se狠狠狠综合亚洲狠狠| 国产精品一二三四| 樱花草国产18久久久久| 日韩免费看的电影| 8x福利精品第一导航| 欧美午夜在线一二页| 麻豆专区一区二区三区四区五区| 国产精品欧美一区喷水| 精品99一区二区三区| 日韩精品中午字幕| 日韩免费观看高清完整版| 日韩欧美一区二区免费| 69堂成人精品免费视频| 欧美高清dvd| 日韩视频在线你懂得| 欧美一区二区成人6969| 欧美一级高清片| www久久久久| 2019国产精品| 中文子幕无线码一区tr| 在线观看欧美黄色| 中文在线一区二区| 综合亚洲深深色噜噜狠狠网站| 亚洲丝袜自拍清纯另类| 亚洲国产高清不卡| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲综合视频网| 亚洲综合精品久久| 亚洲国产精品综合小说图片区| 亚洲成人久久影院| 日本不卡高清视频| 懂色av一区二区三区免费观看| 国产河南妇女毛片精品久久久| 久久狠狠亚洲综合| 国产成人在线视频免费播放| 波多野结衣中文一区| 色中色一区二区| 欧美一区二区三区影视| 国产电影精品久久禁18| 色婷婷综合久久久中文一区二区 | 精品国产乱码久久久久久老虎| 欧美国产激情一区二区三区蜜月| 日韩毛片一二三区| 日韩成人一区二区| 婷婷亚洲久悠悠色悠在线播放| 国产在线国偷精品免费看| 在线视频亚洲一区| 久久精品综合网| 亚洲不卡一区二区三区| 懂色一区二区三区免费观看| 欧美视频一区二区三区在线观看 | 亚洲精品国久久99热| 日韩高清在线一区| av午夜精品一区二区三区| 日韩免费观看高清完整版在线观看| 国产精品乱人伦一区二区| 亚洲视频一区二区在线观看| 中文一区二区在线观看| 亚洲精品国产品国语在线app| 蜜芽一区二区三区| 色偷偷88欧美精品久久久| 久久久久国产精品人| 偷偷要91色婷婷| 91国产成人在线| 日本一区二区三区在线观看| 蜜桃视频在线一区| 91日韩在线专区| 欧美久久一区二区| 亚洲人成网站精品片在线观看| 欧美不卡一区二区三区四区| 六月丁香综合在线视频| 国产老妇另类xxxxx| 日韩成人精品视频| 日韩影院在线观看| 91亚洲精华国产精华精华液| 青青草视频一区| 国产成人综合精品三级| 欧美综合一区二区三区| 国产亚洲精品资源在线26u| 精品中文字幕一区二区小辣椒| 在线视频国产一区| 亚洲永久精品国产| 欧美午夜电影网| 一二三四社区欧美黄| 色综合久久88色综合天天6| 久久蜜桃一区二区| 亚洲韩国一区二区三区| 色综合天天性综合| 91精品国产综合久久久久| 五月天网站亚洲| 7777精品伊人久久久大香线蕉经典版下载 | 欧美高清视频不卡网| 亚洲一区二区三区美女| 欧美日韩中文精品| 久久精品视频在线看| 久久99精品久久久久婷婷| 精品国产伦一区二区三区观看体验 | 福利电影一区二区三区| 久久蜜臀中文字幕| 韩国精品主播一区二区在线观看 | 久久99精品久久久久久国产越南| 国产亚洲1区2区3区| 狠狠色丁香婷综合久久| 久久久久高清精品| 欧美成人精品1314www| 国产一区二区毛片| 国产精品素人视频| 色妞www精品视频| 日本一区二区免费在线| 99riav久久精品riav| 亚洲国产精品嫩草影院| 日韩欧美一级精品久久| 国产精品一区专区| 不卡大黄网站免费看| 国产精品麻豆视频| 99在线精品免费| 欧美国产成人精品| 99久久综合国产精品| 亚洲影院在线观看| 欧美大片日本大片免费观看| 美女被吸乳得到大胸91| 国产精品系列在线| 欧美人妇做爰xxxⅹ性高电影| 国产精品资源网站| 欧美一区在线视频| 欧美日韩五月天| 国产成a人亚洲精| 亚洲另类春色国产| 中文av一区特黄| 日韩一区二区三区av| 欧美手机在线视频| 国产电影精品久久禁18| 免费欧美在线视频| 亚洲激情网站免费观看| 亚洲国产精品av| 在线电影欧美成精品| 欧美色偷偷大香| 成人精品免费看| 亚洲欧洲在线观看av| 国产欧美日韩亚州综合| ww久久中文字幕| 精品国产一区二区三区不卡 | 欧美一区二区免费| 99久久久久久| 色综合久久天天| 在线观看日韩精品| 99精品视频在线播放观看| 91丝袜国产在线播放| 国内成人免费视频| 成人高清视频在线观看| 精品亚洲免费视频| 国产精品 欧美精品| 激情深爱一区二区| 国产成a人亚洲精| 国产资源精品在线观看| 国产高清不卡二三区| 久久99精品久久久久久| 国产69精品久久久久毛片| 国产在线不卡一卡二卡三卡四卡| 国产成人午夜视频| 国产乱子伦视频一区二区三区| av亚洲精华国产精华| a美女胸又www黄视频久久|