设为首页 收藏本站
查看: 1569|回复: 0

[经验分享] Spring-data-redis 第三天(Pipeline)

[复制链接]

尚未签到

发表于 2016-12-20 08:34:24 | 显示全部楼层 |阅读模式
  1.我们首先来说下pipeline(我只是 一个想自学的小人物,很多地方说的不对 请一定要一定要说一下,谢谢)
  Pipeline 也就是管道,也是一种设计思想,在很多web 服务器设计上都有体现,比如很出名的Netty(这是下一个学习任务) tomcat 还有Struts2 框架。所以说Pipeline 是什么呢,
  在我看来,我觉得用一个词很容易描述,工作流,一个request进来,通过管道,管道中就有很多网(filter,handler)然后从另一个口出来, 这是我理解的,但这看起来是同步的呀,也就是一条道走到黑那种,那Netty 这种是异步的呀,想了想,结合Redis中得pipeline,同样 我们先设定管道,然后把一条条request 也就是set get 操作放入管道中,然后一起执行,这个过程中 和普通的没有Redis Pipeline有什么区别,
  非pipleline模式:
   Request---->执行
      ---->Response
      Request---->执行
      ---->Response
    Pipeline模式下:
    Request---->执行,Server将响应结果队列化
    Request---->执行,Server将响应结果队列化
    ---->Response
    ---->Response
    Client端根据Redis的数据协议,将响应结果进行解析,并将结果做类似于“队列化”的操作。
 
这个异步的过程看起来就很明白了,也明白了为什么要使用Pipeline 的效率高了。
 
2 Jedis 中Pipeline的操作:
 

Pipeline p1 = jedis.pipelined();  
p1.incr(key);  
System.out.println("Request incr");  
p1.incr(key);  
System.out.println("Request incr");  
//结束pipeline,并开始从相应中获得数据  
List<Object> responses = p1.syncAndReturnAll();  
if(responses == null || responses.isEmpty()){  
throw new RuntimeException("Pipeline error: no response...");  
}  
for(Object resp : responses){  
System.out.println("Response:" + resp.toString());//注意,此处resp的类型为Long  
}  
 
那么Spring-data-redis 中是怎么支持Pipeline的呢?
这个我也想问!!!
 
我看了最新的源码,最后还是发现还是要用和事务的调用方法一样,要使用redisTemplate 中的 rediscallback 中的connection 也就是 我们在Spring 配置文件中注入的redisconnection,这货不是我们原生态的Jedis操作么。Spring-data-redis 也就是提供了一个配饰器吧。 把不同的Redis 的Java API 给整合在一起,有没有大牛教教我我这么理解对不对,要是错的话应该是什么,把这个帖子发到技术,应该能有大牛给解释下。先跪谢了。
 
 更新:
我用的版本和github版本不一样! 最新的spring-data-redis 中 有支持pipeline的方法

public List<Object> executePipelined(final SessionCallback<?> session, final RedisSerializer<?> resultSerializer) {
Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it");
Assert.notNull(session, "Callback object must not be null");
RedisConnectionFactory factory = getConnectionFactory();
// bind connection
RedisConnectionUtils.bindConnection(factory);
try {
return execute(new RedisCallback<List<Object>>() {
public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
boolean pipelinedClosed = false;
try {
Object result = executeSession(session);
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, hashKeySerializer, hashValueSerializer);
} finally {
if (!pipelinedClosed) {
connection.closePipeline();
}
}
}
});
} finally {
RedisConnectionUtils.unbindConnection(factory);
}
}
 
还有昨天的事务,最新的springdataredis中 也对multi方法做了处理,还是要看最新的东西,,旧的还是不全
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316677-1-1.html 上篇帖子: Spring-data-redis 第二天(事务) 下篇帖子: 在redis使用过程遇到的一些问题的总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表