基本介绍
pipeline即管道的意思,在Redis中,它表示的是一次性执行多条命令。
- 在原生模式下,
每执行一次redis命令,都需要经过发送命令(I/O)、执行命令(内存)和返回结果(I/O))三个阶段。
其中,主要耗时在发送命令与返回结果。
- 在pipeline模式下,
一次性执行多条命令,也只需要一次发送命令和一次返回结果。节省了大量花费在I/O上的耗时。在 Pipeline 模式下,客户端可以一次性发送多个命令到 Redis 服务器,而无需等待每个命令的响应。Redis 服务器接收到这批命令后,会依次执行它们并返回响应。
pipeline模式的操作是非原子性的,若需要批量操作保持原子性,可以使用redis.call,执行LUA脚本的方式实现
但是,需要注意的是,Pipeline是不保证原子性的,他的多个命令都是独立执行的,Redis并不保证这些命令可以以不可分割的原子操作进行执行。这是Pipeline和Redis的事务的最大的区别。
虽然都是执行一些相关命令,但是Redis的事务提供了原子性保障,保证命令执行以不可分割、不可中断的原子性操作进行,而Pipeline则没有原子性保证。
但是他们在命令执行上有一个相同点,那就是如果执行多个命令过程中,有一个命令失败了,其他命令还是会被执行,而不会回滚的。
基本使用
使用redisTemplate执行批量查询
/**
* 执行查询redis
*
* @param
* @param <T>
*/
public <T> List<T> queryObjectListByKeyList(List<String> keyList, final Class<T> clazz) {
List<Object> results = stringRedisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
for (String key : keyList) {
connection.get(key.getBytes());
}
return null;
}
});
List<T> resultList = new ArrayList<>();
for (Object result : results) {
if (result != null && StringUtils.isNotBlank((String) result)) {
resultList.add(JSONObject.parseObject((String) result, clazz));
}
}
return resultList;
}