今天发现jedis 2.0.0 在使用pipeline时,如果结果是null,会有如下异常
java.lang.NullPointerException
at java.lang.String.(String.java:515)
at redis.clients.util.SafeEncoder.encode(SafeEncoder.java:28)
at redis.clients.jedis.BuilderFactory$5.build(BuilderFactory.java:55)
at redis.clients.jedis.BuilderFactory$5.build(BuilderFactory.java:58)
at redis.clients.jedis.Response.get(Response.java:27)
看了下源码,Response.get 中没有对data为null的情况进行处理
public T get() { if (!set) { throw new JedisDataException( "Please close pipeline or multi block before calling this method."); } if (!built) { response = builder.build(data); this.data = null; built = true; } return response; }
官网查了一下https://github.com/xetorthio/jedis/issues/286
上面说在2.1.0中fix了
结果直接升级了项目中的jedis 从2.0.0到2.1.0 项目中依赖它的jar没重编译
但出来类似如下问题
java.lang.NoSuchMethodError: redis.clients.jedis.Jedis.sadd(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Long;
官方那边也有
https://github.com/xetorthio/jedis/issues/303
如果依赖它的jar重编译就OK了
问题在于
2.0.0是
Long sadd(final String key, final String member)
2.1.0是
Long sadd(final String key, final String... members)
redis 的标准sadd 是 http://redis.io/commands/sadd
SADD key member [member ...]
2.1.0是标准化了
如果换成2.1.0后,不重编译,自然就NoSuchMethodError
相关jar重编译后
原来的
jedis.sadd("foo", "bar");
会变成
jedis.sadd("foo", new String[]{"bar"});
反编译下jar就能看到了
没在官方找到类似chang log的东西,有人知道在什么地方吗?
自己比较了一下,主要有如下变化(不完整)
和sadd类似的有 srem hdel zrem
Long zadd(final String key, final Map<Double, String> scoreMembers)
Long rpush(final String key, final String string)
TO
Long rpush(final String key, final String... strings)
类似的有 lpush
zrange(final String key, final int start, final int end)
TO
zrange(final String key, final long start, final long end)
类似的有 zrevrange zrangeWithScores zrevrangeWithScores zremrangeByRank
和ByScore相关的,原来的 min max score 参数都是double类型
2.1.0中 每个函数都增加了一个 min max score 都是string类型的版本
来处理score为如下情况的时候
-inf +inf
(1 (2
增加内容
增加了在redis 2.6 中和Lua script相关的接口
List<String> configGet(final String pattern)
String configSet(final String parameter, final String value)
List<Slowlog> slowlogGet(long entries)