首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Spring-data-redis运用心得

2012-09-15 
Spring-data-redis使用心得上个星期用redis,protobuf实现了一个轻量级的mq。过程中尝试用了spring-data-red

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可以好好设计封装一下。

热点排行