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

[经验分享] Spring-data-redis使用心得

[复制链接]

尚未签到

发表于 2016-12-19 10:03:59 | 显示全部楼层 |阅读模式
  上个星期用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、欢迎大家加入本站运维交流群:群②: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-316285-1-1.html 上篇帖子: 为什么使用Redis 下篇帖子: redis 持久化理解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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