亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 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 集群批量操作實現的相關信息資訊供網民參考!
  • 推薦文章
    国产国语在线播放视频| 人人干人人草| 你懂的日韩| 精品毛片视频| 日本在线www| 亚欧乱色一区二区三区| 黄视频网站免费| 99热精品一区| 国产91精品系列在线观看| 日韩男人天堂| 九九精品在线播放| 四虎论坛| 可以免费看污视频的网站| 91麻豆高清国产在线播放| 国产麻豆精品| 日韩avdvd| 欧美激情一区二区三区视频高清| 国产麻豆精品高清在线播放| 99久久精品国产高清一区二区| 成人高清视频在线观看| 久久国产精品永久免费网站| 国产激情一区二区三区| 青青青草影院| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本乱中文字幕系列| 免费国产在线视频| 人人干人人草| 欧美激情影院| 国产美女在线一区二区三区| 日韩字幕在线| 毛片高清| 亚洲天堂在线播放| 国产视频网站在线观看| 韩国三级视频网站| 欧美国产日韩久久久| 久久99欧美| 欧美18性精品| 91麻豆tv| 欧美激情中文字幕一区二区| 欧美a级大片| 国产极品精频在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产成+人+综合+亚洲不卡| 日韩专区第一页| 毛片成人永久免费视频| 国产麻豆精品高清在线播放| 久久国产精品只做精品| 亚欧成人毛片一区二区三区四区| 精品国产三级a∨在线观看| 色综合久久手机在线| 日韩在线观看免费完整版视频| 久久国产一区二区| 韩国毛片基地| 成人a级高清视频在线观看| 99久久精品国产高清一区二区| 国产一区二区高清视频| 欧美另类videosbestsex久久| 国产国产人免费视频成69堂| 欧美大片aaaa一级毛片| 精品视频在线观看免费| 国产不卡在线看| 国产精品12| 一a一级片| 在线观看成人网 | 欧美激情一区二区三区视频 | 色综合久久天天综合| 韩国三级香港三级日本三级| 深夜做爰性大片中文| 四虎影视久久久| 可以免费看毛片的网站| 亚洲第一色在线| 国产不卡精品一区二区三区| 国产成人女人在线视频观看| 四虎影视库| 美国一区二区三区| 国产不卡在线看| 国产成+人+综合+亚洲不卡| 日本乱中文字幕系列| 国产麻豆精品| 免费毛片播放| 精品久久久久久中文| 欧美爱爱动态| 日本在线www| 尤物视频网站在线观看| 精品在线观看国产| 国产精品123| 久久久久久久网| 国产一区二区精品久久91| 精品久久久久久中文| 可以在线看黄的网站| 久久国产精品自由自在| 九九久久国产精品大片| 欧美大片aaaa一级毛片| 精品视频在线观看一区二区 | 精品视频在线观看一区二区 | 成人免费一级纶理片| 99热精品一区| 亚洲第一页乱| 麻豆系列 在线视频| 美女免费精品高清毛片在线视| 亚洲 激情| 国产一区二区精品| 四虎影视库国产精品一区| 精品在线免费播放| 麻豆午夜视频| 国产精品自拍在线| 国产麻豆精品hdvideoss| 99久久精品国产麻豆| 精品毛片视频| 欧美一区二区三区性| 精品国产一区二区三区久久久蜜臀| 国产伦理精品| 午夜在线观看视频免费 成人| 四虎影视库| 国产麻豆精品hdvideoss| 色综合久久天天综线观看| 成人a大片高清在线观看| 欧美一级视| 欧美一级视频免费| 黄视频网站免费看| 日韩字幕在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久草免费在线视频| 国产美女在线观看| 欧美国产日韩久久久| 国产成人啪精品视频免费软件| 四虎久久精品国产| 国产91视频网| 欧美大片一区| 午夜家庭影院| 黄视频网站免费看| a级毛片免费观看网站| 日韩免费片| 精品国产一区二区三区免费| 毛片高清| 欧美大片aaaa一级毛片| 青青久久精品| 九九精品在线| 精品国产一区二区三区免费| 欧美大片毛片aaa免费看| 精品视频免费在线| 高清一级片| 国产成a人片在线观看视频| 一级毛片视频免费| 一本伊大人香蕉高清在线观看| 天天做人人爱夜夜爽2020毛片| 精品久久久久久综合网| 麻豆网站在线看| 精品国产香蕉在线播出| 欧美另类videosbestsex| 国产91精品系列在线观看| 美女免费精品视频在线观看| 香蕉视频一级| 国产一区二区精品尤物| 青青久在线视频| 青青青草影院 | 韩国毛片免费大片| 国产视频一区二区三区四区| 国产极品白嫩美女在线观看看| 国产视频一区二区三区四区| 成人免费网站视频ww| 91麻豆精品国产高清在线| 久久99欧美| 精品国产亚洲人成在线| 99久久精品国产国产毛片| 久久精品欧美一区二区| 精品国产一区二区三区久久久蜜臀| 亚欧成人毛片一区二区三区四区| 亚州视频一区二区| 麻豆系列 在线视频| 久草免费在线色站| 欧美一级视频免费| 一级女性全黄久久生活片| 九九久久99综合一区二区| 九九久久国产精品| 国产精品自拍亚洲| 美女免费黄网站| 免费国产在线观看| 一级女性大黄生活片免费| 国产一区二区福利久久| 成人免费网站视频ww| 日韩中文字幕一区| 欧美日本免费| 国产视频一区在线| 黄色福利片| 久久精品人人做人人爽97| 四虎精品在线观看| 国产成人精品综合久久久| 免费毛片基地| 国产亚洲精品aaa大片| 国产欧美精品| 久草免费在线色站| 中文字幕97| 欧美激情一区二区三区视频 | 久久精品免视看国产成人2021| 国产美女在线一区二区三区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 可以免费在线看黄的网站| 国产成人啪精品|