Pipeline:“管道”,和很多设计模式中的“管道”具有同样的概念,pipleline的操作,将明确client与server端的交互,都是“单向的”:你可以将多个command,依次发给server,但在此期间,你将无法获得单个command的响应数据,此后你可以关闭“请求”,然后依次获取每个command的响应结果。
从简单来说,在IO操作层面,对于client而言,就是一次批量的连续的“write”请求,然后是批量的连续的“read”操作。其实对于底层Socket-IO而言,对于client而言,只不过是多次write,然后一次read的操作;对于server端,input通道上read到数据之后,就会立即被实施,也会和非pipeline一样在output通道上输出执行的结果,只不过此时数据会被阻塞在网络缓冲区上,直到client端开始read或者关闭链接。
redisService:
public interface RedisService {
/**
* 根据 redis 的key的集合批量查询对应存在数据
* @param keys
* @param useParallel 是否使用parallel 在没有顺序要求的时候,提高效率,true为表示使用,false 表示不用,默认为true
* @return
*/
Map<String,Object> batchQueryByKeys(List<String> keys,Boolean useParallel);
/**
* 使用管道的方式,批量添加数据
* @param keyValueMap
* @param expire 过期时间
* @return
*/
List<Object> batchPutInPipelined(Map<String,Object> keyValueMap,long expire);
/**
* batch increment an integer value in pipelined
*
* @param entityList
*
* @return
*
*/
List<MapEntity> batIncByPipelined(List<MapEntity> entityList);
}
AbstractRedisService 抽象类
public abstract class AbstractRedisService implements RedisService{
private static final Logger logger = LoggerFactory.getLogger(AbstractRedisService.class);
protected abstract RedisTemplate getRedisTemplate();
@Override
public Boolean expire(String key, long timeout, TimeUnit timeUnit) {
return getRedisTemplate().expire(key,timeout,timeUnit);
}
@Override
public Map<String,Object> batchQueryByKeys(List<String> keys,Boolean useParallel){
if(null == keys || keys.size() == 0 ){
return null;
}
if(null == useParallel){
useParallel = true;
}
List<Object> results = getRedisTemplate().executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(String key:keys) {
stringRedisConn.get(key);
}
return null;
}
});
if(null == results || results.size() == 0 ){return null;}
Map<String,Object> resultMap = null;
if(useParallel){
Map<String,Object> resultMapOne = Collections.synchronizedMap(new HashMap<String,Object>());
keys.parallelStream().forEach(t -> {
resultMapOne.put(t,results.get(keys.indexOf(t)));
});
resultMap = resultMapOne;
}else{
Map<String,Object> resultMapTwo = new HashMap<>();
for(String t:keys){
resultMapTwo.put(t,results.get(keys.indexOf(t)));
}
resultMap = resultMapTwo;
}
return resultMap;
}
@Override
public List<Object> batchPutInPipelined(Map<String,Object> keyValueMap,long expire){
List<Object> results = getRedisTemplate().executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(String key:keyValueMap.keySet()) {
if(null != keyValueMap.get(key)){
stringRedisConn.set(key, keyValueMap.get(key).toString());
stringRedisConn.expire(key,expire);
}
}
return null;
}
});
return results;
}
@Override
public List<MapEntity> batIncByPipelined(List<MapEntity> params){
List<Object> results = getRedisTemplate().executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(MapEntity entity:params) {
if(null != entity){
stringRedisConn.incrBy(entity.getKey(), entity.getValue());
}
}
return null;
}
});
List<MapEntity> resultList = Lists.newArrayList();
for(MapEntity entity:params){
resultList.add(new MapEntity(entity.getKey(),(Long)results.get(params.indexOf(entity))));
}
return resultList;
}
}
RedisServiceImpl 实现类
public class RedisServiceImpl extends AbstractRedisService {
private RedisTemplate redisTemplate;
public RedisServiceImpl(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
protected RedisTemplate getRedisTemplate() {
return redisTemplate;
}
}
补充: 具体RedisTemplate 替代 jedis 方法 点这里 https://www.cnblogs.com/yinfengjiujian/p/9084711.html
————————————————
版权声明:本文为CSDN博主「代码也文艺」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37107280/java/article/details/84567631
相关推荐
总的来说,Redis Pipeline 批量导入是一种高效的数据导入方式,通过预处理命令文件并使用 Redis 协议格式,可以确保数据的准确导入并减少网络延迟。同时,结合 MySQL 数据库的特性,可以方便地将数据库数据转换为 ...
Java使用Pipeline对Redis进行批量读写,主要是针对Redis的hmset和hgetall操作,能够显著提高性能。在常规操作中,每次客户端向Redis发送一个命令,都需要等待服务器的响应,这种模式在网络延迟较大的情况下效率较低...
本文将深入探讨如何利用Redis的管道(PipeLine)和批量(Batch)操作来显著提高数据处理速度。 首先,让我们回顾一下问题的来源。在示例代码中,为了记录商品购买用户,使用了`SADD`命令向Redis的Set中添加元素。...
Redis管道(Pipeline)机制是Redis为了优化客户端与服务器之间的通信效率而设计的一种技术。传统的请求-响应模式下,客户端每发送一个命令,都需要等待服务器的响应,这种方式在处理大量连续命令时会导致显著的延迟...
测试结果显示,Redis管道模式通常比单独的Shell脚本方式更快,因为它避免了网络往返的开销,实现了批量处理。 总结来说,当需要向Redis插入大量数据时,应优先考虑使用管道模式,它能显著提高数据导入速度。如果...
正好最近有个需求(需要在秒级取值1000+的数据),如果对于传统的单词取值,循环取值,消耗实在是大,有小伙伴可能考虑到多线程,但这并不是最好的解决方案,这里考虑到了redis特有的功能pipeline管道功能。...
- **管道**:使用 Redis 的 Pipeline 技术,批量发送命令,减少网络延迟。 3. **配置使用** 在 NGINX 的配置文件中,通过 `set $redis_key "your_key"` 设置键名,然后使用 `redis2_query` 指令执行 Redis 命令。...
RedisUtils工具类是Java开发中常见的一种封装了Redis...在处理大量数据时,考虑使用管道(pipeline)或者事务(transaction)来提高性能。最后,为了防止内存泄漏,应该及时清理不再使用的键,或者设定合理的过期时间。
为了提高数据导入导出的效率,可以使用批量操作,如`mset()`和`hmset()`,或者在处理大量数据时开启管道(Pipeline)模式。 5. **安全考虑**: 在实际操作中,应避免在生产环境中直接使用`keys(*)`命令,因为它可能...
Jedis还支持更复杂的操作,如批量操作、管道(Pipeline)、脚本执行(Lua)等,可以根据具体需求进行使用。 在使用Redis时,需要注意以下几个关键知识点: 1. **持久化**:Redis可以通过RDB或AOF两种方式实现数据持久化...
本篇文章将围绕Redis管道的原理、优势以及如何通过"hiredis_example.zip"中的代码实现进行深入探讨。 一、Redis管道技术介绍 Redis管道是一种批量处理命令的技术,允许客户端一次性发送多个命令到服务器,服务器则...
2. **Pipeline与Transaction**:为了提高批量操作的性能,Redis支持Pipeline(管道)和Transaction(事务)。Pipeline允许一次性发送多个命令,减少网络往返时间;Transaction则确保一组命令的原子性执行。测试时,...
同时,Jedis也支持事务、管道(Pipeline)和脚本(Lua Scripting),这些特性可以帮助优化批量操作的性能。 总的来说,通过Jedis这个Java客户端,开发者可以方便地在Java应用中集成和利用Redis的强大功能,提升应用...
例如,可以使用`multi()`开始一个事务,`exec()`提交事务,`subscribe()`订阅频道,`pipeline()`创建管道以批量执行命令。 在实际项目中,我们可能还需要处理异常,确保代码健壮性,例如处理ConnectionException、...
以及在处理大量数据时,考虑使用管道(Pipeline)批量操作以减少网络通信开销。 综上所述,Redis是一个功能强大的键值存储系统,其持久化、缓存、数据结构和高级特性使其在各种应用场景中都有出色表现。通过深入...
为了支持事务,可以使用`RedisTemplate`的`executePipelined`方法,它可以批量执行命令并确保原子性。 ```java @Autowired private RedisTemplate, Object> redisTemplate; @Transactional public void ...
Redis是一种高性能的键值对数据存储系统,常用于缓存、数据库和消息中间件等场景。在本主题中,我们将深入探讨Redis...Pipeline则优化了批量操作的效率。熟练掌握这些特性,能让你在实际开发中更好地利用Redis的优势。