`
zhanghaj00
  • 浏览: 64089 次
社区版块
存档分类
最新评论

Spring-data-redis 第三天(Pipeline)

阅读更多

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方法做了处理,还是要看最新的东西,,旧的还是不全

 

分享到:
评论
3 楼 yeohx 2019-03-01  
请问是否使用过rediccluser:例如:
    @Bean
    RedisClusterConfiguration redisClusterConfiguration(){
        List<String> nodes = new ArrayList<>();
        nodes.add("192.168.145.141:7001");nodes.add("192.168.145.141:7002");nodes.add("192.168.145.141:7003");
        nodes.add("192.168.145.141:7004");nodes.add("192.168.145.141:7005");nodes.add("192.168.145.141:7006");
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(nodes);
        return redisClusterConfiguration;
    }
    @Bean("redisConnectionFactory")
    JedisConnectionFactory redisConnectionFactory(){
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration());
        return jedisConnectionFactory;
    }
    @Bean("redisCacheManager")
    public RedisCacheManager redisCacheManager() {
        return RedisCacheManager.create(redisConnectionFactory());
    }
我在使用 redisCacheManager.getCache()时候失败
2 楼 zhanghaj00 2014-04-18  
finallygo 写道
应该不是你理解的这样,应该是客户端把命令都缓存了,之后一次性发送到服务器端执行,之后服务端再将结果放到队列中依次返回客户端, 具体参考:http://redis.io/topics/pipelining

没有 我贴的那个是异步管道的思想,redis 中pipeline 和 事务 都是一次全部发送到客户端吧, 哎。。。。。。好难搞呀
1 楼 finallygo 2014-04-18  
应该不是你理解的这样,应该是客户端把命令都缓存了,之后一次性发送到服务器端执行,之后服务端再将结果放到队列中依次返回客户端, 具体参考:http://redis.io/topics/pipelining

相关推荐

    Spring mvc整合redis实例(redis连接池)

    在Maven项目中,可以在pom.xml文件中添加`spring-data-redis`和`jedis`库,这两个库分别提供了Spring对Redis的支持和Jedis,一个Java客户端连接Redis。 ```xml &lt;groupId&gt;org.springframework.data &lt;artifactId&gt;...

    tomcat-redis依赖jar包

    - 监控Redis性能:使用Redis自带的监控命令,或者借助第三方工具如Grafana、Prometheus等进行监控。 - 错误日志:查看Tomcat和Redis的日志,分析异常信息,定位问题原因。 - 负载测试:通过模拟大量请求,评估...

    redis集群java客户端,支持批量提交

    java客户端不是很好支持redis cluster,spring-date-redis和jedis批量提交还不支持,单个提交都是可以的。...使用的spring版本是4.3.2以下版本可能不是很好支持,jedis版本是2.8.2, spring-data-redis版本是1.7.2。

    Spring整合Redis代码

    总结来说,整合Spring和Redis能够有效地提升应用性能,通过Spring Data Redis提供的API,我们可以方便地进行键值操作、事务处理、消息订阅等。在实际应用中,根据需求可以进一步优化配置,比如使用Redis的Pipeline或...

    redis-as-database-advanced:Redis作为NoSQL数据库的高级用法

    使用Spring Data Redis,可以方便地在Spring Boot应用中集成Redis。配置`RedisTemplate`和`StringRedisTemplate`,利用`.opsForValue()`、`opsForHash()`等方法操作数据。 五、Redis客户端优化 1. 连接池:使用...

    springboot-examples - 副本.zip

    在SpringBoot项目中,可以通过添加`spring-boot-starter-data-redis`依赖来实现。在`pom.xml`或`build.gradle`文件中添加对应的依赖项,确保项目可以调用Redis的相关功能。 ```xml &lt;groupId&gt;org.springframework....

    jedis-2.1.0

    而Spring Data Redis则提供了更好的集成性,适合于Spring框架的应用,并简化了配置和编程模型。 综上所述,Jedis作为Redis的Java客户端,是高效、全面且灵活的工具,对于需要利用Redis的强大功能的Java开发者来说,...

    个人关于Java相关知识整理

    文件可能涵盖了Spring Boot、Spring Cloud、Spring Data等子项目及其应用场景。 通过深入学习这些文档,开发者不仅可以掌握Java语言本身,还能了解并应用到一系列关键的分布式技术和数据库管理技术,从而提升在企业...

    movie-db-java-on-azure:在Azure上使用Java构建的示例电影数据库应用程序

    在Azure上使用Java的电影数据库应用 该示例应用程序的目的是说明云中的现代Java应用程序。 该项目的结果将是创建一个类似于IMDB的电影数据库。 要求 为了创建和部署此示例应用程序,您需要具备以下条件: ...

    网络管道:网络流量数据管道,用于实时预测和构建深度神经网络的数据集

    Redis是一个高性能的键值数据库,常用于数据管道中的缓存和消息队列,能够实现实时数据的快速读写。它可以在数据流入系统时暂存数据,确保数据处理的连续性,同时避免后端存储的压力。 在数据处理阶段,Spring框架...

Global site tag (gtag.js) - Google Analytics