Redis的PipeLine
推荐使用PipeLine的条件:单个TCP的报文的最大值1460字节,满足条件推荐使用PipeLine批量提交至redis
由于Redis的核心线程是单线程的,所以通过PipeLine提交的命令是顺序执行的。
- 使用jedis的JedisPool,并将实例注入到Spring的容器中
@Configuration
@PropertySource("classpath:application.properties")
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.maxIdle}")
private int maxIdle;
@Value("${redis.maxWaitMillis}")
private int maxWaitMillis;
@Value("${redis.blockWhenExhausted}")
private Boolean blockWhenExhausted;
@Value("${redis.JmxEnabled}")
private Boolean JmxEnabled;
@Bean
public JedisPool jedisPoolFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true
jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
// 是否启用pool的jmx管理功能, 默认true
jedisPoolConfig.setJmxEnabled(JmxEnabled);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
return jedisPool;
}
}
- Redis的PipeLine的工具类,提供get以及set方法
@Component
public class RedisPipeline {
@Autowired
private JedisPool jedisPool;
public List<Object> plGet(List<String> keys) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//pipe是将所有的命令组装成pipeline
Pipeline pipelined = jedis.pipelined();
for(String key:keys){
pipelined.get(key);//不是仅仅是get方法,set方法还要很多很多方法pipeline都提供了支持
}
return pipelined.syncAndReturnAll();//这里只会向redis发送一次
} catch (Exception e) {
throw new RuntimeException("执行Pipeline获取失败!",e);
} finally {
jedis.close();
}
}
public void plSet(List<String> keys,List<String> values) {
if(keys.size()!=values.size()) {
throw new RuntimeException("key和value个数不匹配!");
}
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
Pipeline pipelined = jedis.pipelined();
for(int i=0;i<keys.size();i++){
pipelined.set(keys.get(i),values.get(i));
}
pipelined.sync();
} catch (Exception e) {
throw new RuntimeException("执行Pipeline设值失败!",e);
} finally {
jedis.close();
}
}
}