@JFinal 你好,想跟你请教个问题:
在使用redis插件的时候,发现了一些莫名其妙的空指针错误,都是来自FST的,查看源码才发现jfinal存取redis数据都用bytes方式,
1. 请问这样有什么好处吗?
2. 我用redis-cli都查看不到真实数据了,怎么搞啊?
3. incr之后取值就报错?
例如:
先执行:
Cache redis = Redis.use();
Long errCnt = redis.incr(key); //用于记录验证码错误次数
然后再执行:
redis.get(key);
就报如下错误:(应该是反序列化时候出现了错误,不知道为啥)
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: java.lang.NullPointerException
at com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:69)
at com.jfinal.plugin.redis.Cache.valueFromBytes(Cache.java:1161)
at com.jfinal.plugin.redis.Cache.get(Cache.java:87)
at com.app.common.util.ErrCntKit.isOverErrCntLimit(ErrCntKit.java:34)
at com.app.common.util.ErrCntKit.main(ErrCntKit.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.io.IOException: java.lang.NullPointerException
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:241)
at com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:66)
... 9 more
Caused by: java.lang.NullPointerException
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:350)
at org.nustaq.serialization.FSTObjectInput.readObjectInternal(FSTObjectInput.java:325)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:305)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:239)
... 10 more
4. 必须在get前执行if(redis.exists())判断是否存在,如果不存在就异常,都是这个bytes和FST的事情,能不能简单点弄个是否存取用bytes的开关啊,我知道咋改,不过希望jfinal加入这个开关。
我现在只能换会Jedis的形式,如下:
Cacheredis=Redis.use();
Jedisjedis=redis.getJedis();
StringerrCntStr=jedis.get(key);
redis.close(jedis);
我真郁闷
redis只支持String类型的数据,而java有丰富的数据类型,所以才将数据先转成byte[]再保存,数据转换使用了Fst,而Fst转换时有它自己的格式,所以使用redis-cli去读取Fst格式的数据是不可以的。
楼主可以自己做些实验,会逐步明白jfinal的做法是经过很多权衡后的结果。目前的做法,楼主只需要让读和写都使用jfinal提供的RedisPlugin即可,对于redis-cli的使用,用一下exists这类对key值的操作就好,jfinal对于string型的key值并没有使用fst做转换。
@JFinal我就说我存的为何是乱码,请问老大转换为byte[]存的原因是什么呢,理解不到。自增也用jfinal提供的RedisPlugin即可,本质上与我上面说的是一回事大大,我说的第三点,自增后,取值就出异常这个是我哪里写的不对吗@jfinal
存进去一个
Map<String,Object>
为啥读不出来了?在redis-cli下get是有值的,java中报错为
java.lang.RuntimeException:java.io.IOException:java.lang.NullPointerException
atcom.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:69)
还有非要jdk1.7吗?我用1.6一直报
org/nustaq/serialization/FSTObjectOutput:Unsupportedmajor.minorversion51.0
没有混用,我写的时候是
Cachecache=Redis.use();Stringpath=Thread.currentThread().getContextClassLoader().getResource("").getPath();Filefile=newFile(path);try{for(Filef:file.listFiles()){if(f.isFile()&&f.getPath().endsWith(".json")){cache.set(FilenameUtils.getBaseName(f.getPath()),FileUtils.readFileToString(f,"utf-8"));}}}catch(Exceptione){e.printStackTrace();}用的都是jfinal自带的api,没有混用,我最后没办法key和value都换成了String就正常了.
这个序列化的问题多的很,不觉得恶心的话就把jedis给get出来,然后手动close,受不了的话自己加个禁用bytes的扩展
没禁用,但是key和value都是string,就是对的版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。