使用stringRedisTemplate.executePipelined可以向redis批量提交一批命令,进行命令批处理。效率比遍历的方式执行单条语句要高。‘
spring data redis使用pipline的两种方式。
redisTemplate.executePipelined(new RedisCallback<Long>() {
@Override
public Long doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection conn = (StringRedisConnection) connection;
for (String key : keys) {
conn.hDel(key, mapKeys);
}
return null;
}
});
redisTemplate.execute(new RedisCallback() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
keyValueList.forEach(e->{
connection.stringCommands().set(e.getKey().getBytes(),e.getValue().getBytes());
});
return null;
}
},false,true);
基于lettuce客户端的pipline每次执行上述两个代码段仅使用连接池中的一个连接。因为lettuce客户端是基于Tcp长连接的,在一个连接中传输所有的命令。而基于Jedis的客户端上述两个代码段会使用连接池中的多个连接进行命令提交,所以一定要注意连接池中预留足够连接数。
一般redis支持的连接数很多(详见redis server maxclients参数),且每次连接中命令执行较快。所以在硬件资源充足的情况下可适当调大客户的redis连接池最大活跃连接数。
设置spring.redis.pool.max-active
属性.
对于批量更新无需返回值的操作不推荐如下方式执行pipline,速度较慢。同时在Jedis客户端仍然会使用连接池中的多个连接。
stringRedisTemplate.execute(new SessionCallback(){
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
for (String key : keys) {
redisOperations.opsForHash().delete(key, mapKeys);
}
return null;
}
});