Redis集群使用Jedis的pipeline操作

本文介绍了如何在SpringBoot项目中,通过Jedis的pipeline功能,有效地对Redis集群进行批量写入操作,包括数据的分组和跨节点的分布式执行

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot+Redis集群项目使用Jedis的pipeline执行批量写入操作

写入数据示例:

public void pipeSet() {
		// 获取集群节点的slot range
		Map<String, RedisClusterNode.SlotRange> slotRangeMap = new HashMap<String, RedisClusterNode.SlotRange>();
		Map<String, List<Map<String, Object>>> setListMap = new HashMap<String, List<Map<String,Object>>>();
		RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
		RedisClusterConnection redisClusterConnection = factory.getClusterConnection();
		Iterable<RedisClusterNode> redisClusterNodes = redisClusterConnection.clusterGetNodes();
		for (RedisClusterNode redisClusterNode : redisClusterNodes) {
			if (redisClusterNode.isMaster()) {
				slotRangeMap.put(redisClusterNode.getHost() + ":" + redisClusterNode.getPort(), redisClusterNode.getSlotRange());
				setListMap.put(redisClusterNode.getHost() + ":" + redisClusterNode.getPort(), new ArrayList<Map<String,Object>>());
			}
		}
		// 根据slot range将数据分组
		List<String> discardKeys = new ArrayList<String>();
		int slot = 0;
		String setKey = null;
		Map<String, Object> tempMap = null;
		for (int i = 0; i < pipeSize; i ++) {
			// 从队列中取出要写入的数据,tempMap值:{"t":过期时间,"v":数据对象,"k":存储的键值}
			tempMap = pipeSetQueue.poll();
			setKey = (String) tempMap.get("k");
			discardKeys.add(setKey);
			slot = JedisClusterCRC16.getSlot(setKey);
			for (Map.Entry<String, RedisClusterNode.SlotRange> entry : slotRangeMap.entrySet()) {
				if (entry.getValue().contains(slot)) {
					setListMap.get(entry.getKey()).add(tempMap);
				}
			}
		}
		// 执行Redis集群下的pipeline写入
		redisTemplate.execute((RedisCallback<Object>) connection -> {
			JedisCluster cluster = (JedisCluster) connection.getNativeConnection();
			Map<String, JedisPool> jedisMap = cluster.getClusterNodes();
			List<Map<String, Object>> setList = null;
			String key = null;
			Map<String, Object> setLM = null;
			for (Map.Entry<String, JedisPool> jedisEntry : jedisMap.entrySet()) {
				try {
					Jedis resource = jedisEntry.getValue().getResource();
					if (resource.isConnected() && setListMap.containsKey(jedisEntry.getKey())) {
						Pipeline pipe = resource.pipelined();
						setList = setListMap.get(jedisEntry.getKey());
						for (int i = 0; i < setList.size(); i ++) {
							setLM = setList.get(i);
							key = (String) setLM.get("k");
							if (setLM.containsKey("t")) {
								// 有过期时间设置
								pipe.setex(keySer.serialize(key), Integer.valueOf((String) setLM.get("t")), getValueSer().serialize(setLM.get("v")));
							} else {
								pipe.set(keySer.serialize(key), getValueSer().serialize(setLM.get("v")));
							}
						}
						pipe.sync();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return null;
		});
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值