`
ldd600
  • 浏览: 103757 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11266
社区版块
存档分类
最新评论

Spring-data-redis使用心得

阅读更多

上个星期用redis,protobuf实现了一个轻量级的mq。过程中尝试用了spring-data-redis,目前是1.0.0.2.M2-SNAPSHOT版本,貌似之前已经release了一个版本。

 

优点

1.目前redis java客户端有多个:如jredis,jedis。用adapter的方式屏蔽了底层实现。让我们可以随意切换redis实现

 

2.将各种操作分类存放,不用在一个类中看到满篇的方法调用。ListOps,SetOps,功能职责进一步分离,方便调用方。

 

3.序列化,反序列化方式做了插件式,我们可以选择使用自己的序列化方式,我选择了protobuf。默认使用的是蛋疼的JDK默认方式。

 

4.提供模板模式,省去了很多connection打开,关闭的操作代码

 

5.对底层的connection进行了抽象工厂,以供依赖注入

 

6.集成了spring的transaction manager。

 

 

但是使用时bug一堆,用了的童鞋请注意。

1. 方法 V rightPop(K key, long timeout, TimeUnit unit);

    TimeUnit没做校验,我可以传入MILLISECOND,但此时如果小于1s,它会按照0来处理,如果pop操作的话就会永久hold住。我们再使用时TimeUnit需要大于SECOND,因为reds的bl(r)pop是按秒计算的。spring应该做校验

 

2. 方法    V leftPop(K key, long timeout, TimeUnit unit) 

Jedis blpop的返回值是list,第一个值是key,第二个值才是value,spring把key当value返回给了调用者。这么明显的错你哥哥都发现不了吗?

 

3.接口,RedisCallback, T doInRedis(RedisConnection connection) throws DataAccessException;

由redis template调用,我们提供给redistemplate我们定义好的序列化,反序列化实现,在callback时获取不到。其序列化反序列化最好封装在callback中,这样用户自定callback时可以使用到自己设置的序列化,反序列化方式。作为存储实现来说,序列化,反序列化是很重要的一步。

 

4.方法 RedisSerializer<?> getDefaultSerializer()

靠,返回给我一个带问号的泛型,你让我们调用者到底用不用泛型呢?

 

5.  

 

 

public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline, RedisSerializer<?> returnSerializer) {
		Assert.notNull(action, "Callback object must not be null");

		RedisConnectionFactory factory = getConnectionFactory();
		RedisConnection conn = RedisConnectionUtils.getConnection(factory);

		boolean existingConnection = TransactionSynchronizationManager.hasResource(factory);
		preProcessConnection(conn, existingConnection);

		boolean pipelineStatus = conn.isPipelined();
		if (pipeline && !pipelineStatus) {
			conn.openPipeline();
		}

		try {
			RedisConnection connToExpose = (exposeConnection ? conn : createRedisConnectionProxy(conn));
			T result = action.doInRedis(connToExpose);
			// TODO: should do flush?
			return postProcessResult(result, conn, existingConnection);
		} finally {
			try {
				if (pipeline && !pipelineStatus) {
					conn.closePipeline();
				}
			} finally {
				RedisConnectionUtils.releaseConnection(conn, factory);
			}
		}
	}

 

既然让我们用了pipeline,为什么不给我们返回值呢。pipleline的返回值是在conn.closePipeline();时候返回的,使用pipeline得到的返回值都是null,pipeline只能用于没有返回值的操作。

 

 

个人希望spring可以好好设计封装一下。

分享到:
评论
1 楼 yutiannanjingjiangsu 2016-10-12  
leftpop的返回值问题,在jedis2.6中似乎已解决(lpop.get(1))

相关推荐

    springmvc学习笔记-前端控制器、上传、异常、开发心得小结等.zip

    例如,为了提高性能,可以使用缓存技术(如Redis)来存储频繁访问的数据;在安全方面,需要防止SQL注入、XSS攻击等,使用Spring Security可以提供强大的安全防护。 总之,SpringMVC提供了一套完整的Web开发解决方案...

    基于Spring Boot的研究生志愿填报辅助系统lw+ppt.rar

    2. Spring Data JPA:简化了与数据库的交互,支持ORM(对象关系映射)操作。 3. Thymeleaf或Freemarker:用于视图渲染,提供动态网页展示。 4. MySQL或PostgreSQL:作为数据存储,提供稳定高效的数据服务。 5. Redis...

    springboot466大学生就业服务平台--论文pf.zip

    - **MyBatis/Spring Data JPA**:数据访问层,处理数据库操作。 - **MySQL/PostgreSQL**:关系型数据库,存储系统数据。 - **Redis/Memcached**:缓存服务,提高性能。 - **Docker**:可能使用Docker进行应用部署,...

    基于springboot的在线教育系统源码数据库.zip

    - 安全性:使用Spring Security或Shiro进行权限控制,防止未授权访问。 - 数据缓存:利用Redis提高数据读取效率。 - 日志记录:如Log4j或Logback,用于追踪和排查问题。 - 消息队列:如RabbitMQ,处理异步任务,...

    基于SpringBoot技术的FTG游戏论坛系统的设计与实现.rar

    5. 分页与缓存:使用Spring Data JPA进行分页查询,结合Redis进行数据缓存,提高响应速度。 五、实现过程 1. 创建SpringBoot项目,引入相关依赖,如Spring Web、Spring Data JPA、Thymeleaf、Spring Security等。 2...

    J2EE Design and Development 学习心得

    本文主要围绕"J2EE Design and Development"的学习心得展开,探讨如何在JavaEE开发中实现高效且具有可扩展性和可维护性的程序架构设计。 分布式系统是现代企业级应用的基石,尤其是在处理大数据量、高并发场景时,...

    springboot古典舞在线交流平台的设计与实现.zip

    2. 后端:使用SpringBoot作为核心框架,结合Spring MVC进行控制器层设计,Spring Data JPA处理数据库操作,Spring Security实现用户认证和授权。 3. 数据库:MySQL作为关系型数据库,存储用户信息、帖子内容、评论等...

    基于springboot的准妈妈孕期交流平台的设计与实现

    内容管理模块采用Spring Data JPA与数据库交互,存储并检索用户发布的帖子、心得等信息;社区交流则借助SpringBoot的WebSocket技术实现实时消息传递,增强用户体验。 在社区交流部分,为了实现高效的并发处理,我们...

    基于springboot+vue的地方美食分享网站.zip

    它集成了众多功能模块,如Spring MVC、Spring Data JPA等,使得开发者能够快速搭建起功能完备的Web服务。 2. Vue.js:作为前端开发的主流框架,Vue.js以其轻量级、易学易用的特点受到广泛青睐。它采用组件化开发...

    springboot215基于springboot技术的美食烹饪互动平台的设计与实现.zip

    使用SpringDataJPA进行数据访问操作,它可以自动处理ORM映射,减少手动编写SQL的繁琐工作。此外,SpringBoot的Thymeleaf模板引擎用于生成前端页面,提供友好的用户体验。对于前端交互,我们可以使用Ajax异步请求,...

    基于springboot游戏分享网站.zip

    这部分可能会涉及到JWT(JSON Web Tokens)用于安全的身份验证,以及Spring Data JPA或MyBatis的动态SQL来优化数据库查询。 5. **数据库设计**:项目可能包含多个数据库表,如用户表、游戏信息表、评论表、收藏表等...

    Java项目实战-基于Javaee的影视创作论坛的设计与实现(附源码,部署说明).zip

    项目可能涉及缓存策略、负载均衡、性能监控等方面,学习如何使用如Redis、Nginx等工具进行优化,提高系统的响应速度和并发处理能力。 通过这个实战项目,你可以全面掌握JavaEE的开发流程,提升自己的编程技能,并...

Global site tag (gtag.js) - Google Analytics