使用redis添加的数据,value有乱码前缀

Cache cache = Redis.();
String value = "android"+queue.size();
String key = "123";
(cache != && !TextUtil.(value)) {
    cache.set(key, + value);
}

这是我使用redis添加数据的代码

比如,若android336是正确的值,要是我直接通过jfianl取值没有问题,但若不通过jfinal,直接通过命令行连接redis后,查询得到的结果是这样的\xfc\nandroid336,多了\xfc\n,这样我们公司php模块通过redis取到的值就有问题了

补充:目前我的key,value都是String就可以了,不需要支持更多类型

我在网上搜了搜,应该是fst序列化话的问题,fst自己读取没有问题,但其它项目组由于没有使用fst的序列化所以问题了,不知道我的理解对不对

然后还有个需要请教的:

redis报了Could not get a resource from the pool 的错误,是连接池不够了,我要通过JedisPoolConfig手动增加连接池的上限,但请问,我要设置哪个属性?上限值设置不管多大都可以吗?比如1000?默认值是多大啊?

求波总指点






评论区

JFinal

2017-02-11 21:00

redis 只支持 byte[] 与 string 类型,而 java 有很多类型的数据需要存放,所以需要将类型进行序列化以后再存

因此,com.jfinal.plugin.redis.serializer 这个包下面的 FstSerializer 与 JdkSerializer 分别实现了两种序列化策略,jfinal 默认使用的 FstSerializer 做的序列化,而这个功能序列化后的数据具有自己的数据格式与算法,所以在获取数据后需要知道该格式并使用相应的反序列算法才能将数据还原

所以,当使用其它客户端对 fst 序列化过的数据进行读取时,也相应要使用同样的算法进行反序列化

建议的方向有两个:
1:在现有的基础之上,让所有客户端使用 fst 同样的算法进行序列化与反序列化
2:利用 redisPlugin.setSerializer(ISerializer) 方法,注入新的序列化与反序化策略,并且 php 等客户端也使用相同的策略

威仔

2018-08-03 16:09

@JFinal FstSerializer 与 JdkSerializer 3.4 都乱码 怎么回事啊
redisPlugin.setSerializer(new FstSerializer());
//redisPlugin.setSerializer(new JdkSerializer());

\xFC {"test":1,"age":23,"name":"\xFF\x18R\xFFsQ\xFF\x97g"}

中文乱码

热门反馈

扫码入社