java中redis的pipeline
pipeline方式执行redis操作:
List<Object> results = this.getRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer<String> keySerializer=new StringRedisSerializer();
for (String key : keys) {
connection.get(keySerializer.serialize(key));
}
return null;
}
});
doInRedis方法中实现需要的redis操作
RedisTemplate中的executePipelined方法:
public List<Object> executePipelined(final RedisCallback<?> action) {
return executePipelined(action, valueSerializer);
}
public List<Object> executePipelined(final RedisCallback<?> action, final RedisSerializer<?> resultSerializer) {
return execute(new RedisCallback<List<Object>>() {
public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
boolean pipelinedClosed = false;
try {
Object result = action.doInRedis(connection);
if (result != null) {
throw new InvalidDataAccessApiUsageException(
"Callback cannot return a non-null value as it gets overwritten by the pipeline");
}
List<Object> closePipeline = connection.closePipeline();
pipelinedClosed = true;
return deserializeMixedResults(closePipeline, resultSerializer, resultSerializer, resultSerializer);
} finally {
if (!pipelinedClosed) {
connection.closePipeline();
}
}
}
});
}
注意
- doInRedis中的redis操作不会立刻执行
- 所有redis操作会在connection.closePipeline()之后一并提交到redis并执行,这是pipeline方式的优势
- 所有操作的执行结果为executePipelined()的返回值
网友评论