Redis 批量处理
在开发中,有时需要对Redis 进行大批量的处理。
比如Redis批量查询多个Hash。如果是在for循环中逐个查询,那性能会很差。
这时,可以使用 Pipeline (管道)。
Pipeline (管道)
Pipeline (管道) 可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。
Redis批量查询多个Hash
Redis批量查询多个Hash,可以使用 Pipeline (管道)。源码见: PipelineBase.java。
hget()方法,跟普通hash的hget()一样。
public Response<String> hget(String key, String field) {
this.getClient(key).hget(key, field);
return this.getResponse(BuilderFactory.STRING);
}
示例:
public void testPipLine() {
Map<String, Response<String>> responseMap = new HashMap<>();
//try-with-resources, 自动关闭资源
//先连接jedis,再拿到 pipeline
try (Jedis jedis = getJedis();
Pipeline pipeline = jedis.pipelined()) {
for (String id : idList) {
//前缀加唯一id
String key = KEY_PREFIX + id;
//使用pipeline.hget查询hash的数据
Response<String> response = pipeline.hget(key, field);
responseMap.put(id, response);
}
pipeline.sync();
} catch (Exception ex) {
log.error("responses error.", ex);
}
Map<String, String> map = new HashMap<>();
//组装map。response.get()有在pipeline关闭后才能执行
responseMap.forEach((k,response) -> map.put(k, response.get()));
map.forEach((k,v)-> System.out.println(k+",val:"+v));
}
private static Pool<Jedis> jedisPool = null;
/**
* 连接redis,获取jedisPool
* @return
*/
public Jedis getJedis() {
if (jedisPool == null) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setTestOnBorrow(testOnBorrow);
//配置可以写在配置中心/文件
jedisPool = new JedisPool(poolConfig, host, port, timeout, password, database);
}
return jedisPool.getResource();
}
参考资料
https://redis.io/docs/manual/pipelining/
https://www.cnblogs.com/expiator/p/11127719.html