redis这一款数据库,不结合下Spring家族怎么成呢。
于是乎,下午我试着搞了一把,
这里,使用了阿里郎家的FASTJASON辅助包,版本在这儿:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
配置如下:
![95e2720d3f5ef9aa4109d2198b52df41.png](https://i-blog.csdnimg.cn/blog_migrate/bb1cf4f64118c708864b6162f316e427.jpeg)
![cdc4a5846145b4d873fef7c3d318f998.png](https://i-blog.csdnimg.cn/blog_migrate/c2c4581372d58bf7fcf09493101d549c.jpeg)
ps:这里是为了学习,所以配置稍显繁琐,见谅
测试如下:
@Test
public void redisFactoryTest(){
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
User u = new User(1000,"ttt",new Date());
valueOperations.set("userer:10",u);
User user = (User) valueOperations.get("userer:10");
System.out.println(user);
}
结果出现了这样的问题:
fastjson autotype is not support. dao.User!!!!
是的,牛逼的阿里郎并没有把我们存储的数据正确解析。
关于这个问题,搜索获得大多数结果都是类似这种:
![bd8f475cf244d66522633124cc233ff0.png](https://i-blog.csdnimg.cn/blog_migrate/ab6bf49a5a1bb586615a759cb2837db9.png)
可是在加完之后还是没有解决。这对于新手实在太不友好了。
那我们从多个发面试着找一下没成功的原因:
- 其一,文件配置问题
- 其二,类的定义问题
- 其三,Fastjson的配置问题
- 其四,服务器存在的问题
首先,文件配置问题:
我们需要清楚,配置时我们需要配置三个必要的类:JedisPoolConfig、JedisConnectionFactory和RedisTemplate,以及其他我们可能需要的帮助我们解析jason的类
如图里id为ss、jacks和fast
![116e8b9d9b6e70e1ccf00d8b487b5dfd.png](https://i-blog.csdnimg.cn/blog_migrate/72eb5cf3f930e13334e27572cb0a0987.jpeg)
同时,如果我们对于解析的类有具体要求,可以像上图这样配置,当然,如果不想配置过多类的话,自己在业务代码中手动实现jason的转换,也是可以的,建议创一个工具类喔,这种情况下,就不需要单独为RedisTemplate配置这么多了,这一点一定要注意。
具体的原因就是,redis底层并不支持直接存储对象,所以我们需要先转化成字符串来存储!
其次,类的定义问题
我们要先知道,为什么jdk可以帮我们将字符串转化为对象,其实是用到了ObjectMapper,底层是用到了反射机制的,所以,我们如果要将一个字符串转化为对象,一定记得要给这个类留一个 空的构造函数 !!!这点很关键,当然也是我这个菜鸡栽倒的地方,害。
其三,fastjsan的配置
这个时候,如果前面都没有问题,就是真的可能是fastjson的识别没有开了嗷,加上以下两种的一种:
ParserConfig.getGlobalInstance().addAccept("dao"); // 其一
// 这里写的是要解析的类所在的包名
ParserConfig.getGlobalInstance().setAutoTypeSupport(true); // 其二
![1f78e40cb73192728c820f6e76ca443b.png](https://i-blog.csdnimg.cn/blog_migrate/8e76dc0b88073d2278e09e84f5a7635c.png)
这一点,实际上我没有遇到,但是看网上大家都是这个口径,我们就暂且相信这个是正确的吧!
其四,服务器存在的问题:
就像上一篇遇到的问题一样,你端口开了么,ip地址真的是你配置的那个?
怎么办,真的不知道
那就测一下!
@Test
public void PingTest(){
Object execute = redisTemplate.execute(new RedisCallback() {
public String doInRedis(RedisConnection connection) {
return connection.ping();
}
});
System.out.println(execute);
}
![121a9ae8b027a7ead80846797482006a.png](https://i-blog.csdnimg.cn/blog_migrate/13107996b6c3873feea62e63a799f7c2.png)
如果没有听到一声“pong”!还是去看看服务器的地址或者端口的问题吧,不能ping通嗷~
首次学redis,如果有说的不对的地方,希望大家给我指出。感谢QQ群中与我讨论的一位网友,实名感谢***网友,hhh,虽然估计也看不到吧。