RedisPlugin插入redis的字符串为什么给加了前缀?

dclCache.lpush(keydcl, dataJson);

使用RedisPlugin,list插入Json字符串,lpush以前在控制台里打印了dataJson是这样的

{"url": "http://www.iqiyi.com", "title": "222222222", "depname": "3133", "username": "\u8d75\u516d", "devunique": "723965d8-0947-11e7-81b4-005056c00008", "computername": "DEMO10", "time": "2017-03-15 14:20:12","message":"data center"}

但是到了redis中是这样的

"\xfc\x80\xea\x00{\"url\": \"http://www.iqiyi.com\", \"title\": \"222222222\", \"depname\": \"3133\", \"username\": \"\\u8d75\\u516d\", \"devunique\": \"723965d8-0947-11e7-81b4-005056c00008\", \"computername\": \"DEMO10\", \"time\": \"2017-03-15 14:20:12\",\"message\":\"data center\"}"

加了一个  \xfc\x80\xea\x00  这样的前缀

而且每一条数据加的前缀略有不同,开头都是\xfc\x80,后两位各不一样

怎么禁止添加这样的前缀?

dataJson是POST提交的Json,Parameter控制台输出是这样的:

Parameter   : {"url": "http://www.iqiyi.com", "title": "222222222", "depname": "3133", "username": "\u8d75\u516d", "devunique": "723965d8-0947-11e7-81b4-005056c00008", "computername": "DEMO10", "time": "2017-03-15 14:20:12"}=  

我是这样取的这个Json:

Enumeration<String> paras = getParaNames()String data = paras.nextElement()

dataJson是把data操作了一下:

String dataJson = data.substring(data.indexOf("{"),data.length()-1) +",\"message\":\"data center\"}";

有哪里用的不对吗?呼叫詹大

评论区

JFinal

2017-03-15 14:52

不是加了前缀,是存之前先将数据做了序列化转换,再存进去,序列化转换操作时会添加额外的数据进行类型的标注

wyntergreg

2017-03-15 15:02

@JFinal 有什么方法可以不序列化吗?我存到redis里这样拿出去不好取用啊

JFinal

2017-03-15 15:35

@wyntergreg 取用的时候,仍然用 jfinal 提供的 api 就可以了。如果你用别的工具取用,也只需要用同样的反向序列化算法就可以

你试着扩展一下 ISerializer 这个扩口来改变一下序列化算法,其中官方给出了两个实现类,一个是 fst 实现,一个是 jdk 实现,或许 jdk 实现就可以,你通过下面的代码切换一下:
redisPlugin.setSerializer(new JdkSerializer())

wyntergreg

2017-03-15 15:54

@JFinal 也是添加了标注,而且比原来的标注还长,大概这么长:\xac\xed\x00\x05t\x00\xea——哎看来只能从取用端处理一下了

wyntergreg

2017-03-15 16:22

@JFinal 詹大,我自己调用Jedis用了下lpush,直接把json字符串存到redis里去,然后我的取用端就完全不用操作了哈!建议:是否可以把序列化改成可配置参数,因为取用端不止需要做处理,甚至取用端都不是java!例如我,是直接用ELK从redis里抽数据来用的

JFinal

2017-03-15 16:59

@wyntergreg 可以试一试通过扩展 ISerializer ,并在这个扩展类中啥也不干来实现你想要的:是否可以把序列化改成可配置参数 这个功能

由于 redis 只支持 String 与 byte[] 这两种类型,而 java 类型是无限多的,例如 User 就是个类型,所以只有做序列化才可以存放无限种类的 java 对象进去,因此不做序列化的方案不好做

你可以试着做一下,记得搞定后再回来在分享频道发贴啊

wyntergreg

2017-03-15 17:24

@JFinal 明白,我回头试一下哈!其实用JAVA不多,所以喜欢用詹大的Jfinal这种超轻量框架。不知道能不能搞得定,等我搞出来一定发帖!詹大V5!

JFinal

2017-03-15 17:34

@wyntergreg 感谢支持

海哥

2017-03-16 11:01

@JFinal 对于不需要序列化的数据,直接通过Redis.use().getJedis()来操作即可。不建议重写自己的Serializer。重写Serializer还是会进行序列化,只是用了其他不同的方法进行序列化而已。@wyntergreg

JFinal

2017-03-16 11:12

@海哥 扩展 Serializer 我也拿不准是否可以搞定,用 getJedis() 可以搞得定,但最好是封装成工具类,因为 getJedis() 得到的资源需要回收,这个回收代码比较啰嗦,需要在 try finally 结构之中保障资源一定被回收

高兴就好

2017-06-19 18:52

@海哥 大神加个QQ吗 为啥这么牛

shang

2019-04-02 09:53

@海哥 实测可以解决问题。挖挖代码发现 Jfinal 中 Cache 用的是 BinaryJedis 类中相关 Redis 操作的方法,而 getJedis() 后使用 Jedis 类相关的方法。前者只支持 byte[],所以需要序列化存储对象,而 Jedis 直接支持字符串,不需要额外序列化。所以,需要注意的是,,用 Cache 缓存(序列化)的数据,必须用 Cache 读取(反序列化)。如果用 Jedis 去读取,因为没有反序列化,所以取到的值是带有序列化时的类型的(即 \xFc什么的)。。另外,需要注意的是,用 Jedis 化,获取 jedis 之后,记得 close!!!Cache 的方法都经过封装,每次操作结束后都通过 try{} finally{}关闭了,而Jedis没有。

小飞象

2019-12-18 16:43

这个问题有一个完善的解决方案吗? @jfinal

JFinal

2019-12-18 19:34

@小飞象 这个仅仅是序列化算法不同,可以通过指定序列化算法解决

jfinal RedisPlugin 默认使用 fst 做的序列化,可以通过下面方法配置:
RedisPlugin.setSerializer(...);

热门分享

扫码入社