场景:使用jeecg-boot作为应用系统,使用redis作为缓存,使用jfinal实现物联网数据的存储和获取,有时候会用到jeecg-boot中redis存储的数据,那么就会报一下错误:
RedisPlugin redisPlugin = new RedisPlugin("xishuai", "127.0.0.1", 6379, "root");
redisPlugin.setSerializer(new JdkSerializer());
redisPlugin.start();
Redis.use().get("scems::iotdatasource::customerIde2a3a209094dc18fd0fe1d3a3e8d623e");
报错:
Exception in thread "main" java.lang.RuntimeException: java.io.StreamCorruptedException: invalid stream header: 22736365
at com.jfinal.plugin.redis.serializer.JdkSerializer.valueFromBytes(JdkSerializer.java:78)
at com.jfinal.plugin.redis.Cache.valueFromBytes(Cache.java:1217)
at com.jfinal.plugin.redis.Cache.get(Cache.java:91)
at org.xishuai.dpu.sav.AppTest.main(AppTest.java:130)
Caused by: java.io.StreamCorruptedException: invalid stream header: 22736365
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:354)
at com.jfinal.plugin.redis.serializer.JdkSerializer.valueFromBytes(JdkSerializer.java:74)
... 3 more
经查,原因如下:
参考jfinal官网一博文:
http://www.jfinal.com/share/225
总的原因就是存储的时候没有进行序列化,但是获取的时候用的fst方式进行反序列化,所以会出现问题,那么遇到问题怎么解决呢,
参考博文里的方式:
直接用Redis.use().getJedis();
获得jedis对象后,通过jedis进行操作,但是有个问题就是需要自己用完后关闭jedis对象,否则占用的资源部进行释放,导致资源不够
代码如下:
try {
String kv = jedis.get("scems::iotdatasource::customerIde2a3a209094dc18fd0fe1d3a3e8d623e");
}finally {
Redis.use().close(jedis);
}
经测试,多线程操作资源没问题!