发表于: 2017-09-06 20:22:56
4 939
今天做的事:
今天可能什么事情都没做成。。。
下午做了个小课堂的内容,明天讲。
然后继续昨天的问题开始分析,果然我太乐观了,唉~这个任务6可能没头了
说说问题吧,而且到目前为止还没解决
通过昨天的日报,我们可以看到当我们调用方法时,缓存已经起作用了,并且Redis确实存进去值了,但是
我们是怎么使用这个在缓存里的值的,我今天就在探究这个问题。
首先,网上的blog说,当我再次使用这个方法的时候,就是从缓存中取数据了,而且给了个这种sb的例子
确实,差距特别明显
但是这tm第二次查询肯定是从内存中直接读了啊,还用的毛缓存啊!
然后这是Redis中有id=8数据的时候所查的时间
下面这个是删除id=8后所用的时间
可以看到第二个时间相差无几,为什么?
我猜测,应该是因为第一次查询id=7的时候已经和数据库建立了连接,所以第二次查询的时候就不要在为建立数据库连接花时间,那十几毫秒纯粹是sql语句的运行时间。
那么,这么看来是不是就没有缓存的事了啊,那我配干毛 啊!
接着我尝试调用Redis里的key,这玩应还是个有序集合,里面的value值还有什么hash值什么鬼的
测试程序
@Test
public void testRedis(){
Jedis jedis = new Jedis("127.0.0.1",6379);
Set<String> city = jedis.zrange("select~keys",0,10)
System.out.println(city);
}
这个结果我不能接受啊,这我怎么调值啊!
只能继续想办法了,要是明天中午之前还是搞不出来,那我就先把注解这个放弃了,用之前配置文件那个。
哇,终于被我翻到一个明白人写的了,链接在这:
http://www.cnblogs.com/ClassNotFoundException/p/6498588.html
然后我们测试一下
@Cacheable(value = "select",key = "'selectByPrimaryKey' + #id")
public City selectByPrimaryKey(Long id){
logger.debug("ID" + id);
System.out.println("正在执行第一个方法");
return this.cityMapper.selectByPrimaryKey(id);
}
@Cacheable(value = "select",key = "'selectByPrimaryKey' + #id")
public City selectByPrimaryKeyWithNoCache(Long id){
logger.debug("ID" + id);
System.out.println("啥也没执行,行了吧");
return this.cityMapper.selectByPrimaryKey(8L);
}
当我们在Service层中定义这两个方法的入参(id)和key值相同时(value=“select”)
这时,当我们调用第一个方法后,紧接着调用第二个方法时,由于出入参相同,根据Spring的缓存机制,Spring将不会真正执行该方法,而是直接利用缓存区中的数据。
我们测试一下
@Test
public void testRedis2(){
City city1 = cityService.selectByPrimaryKey(7L);
City city2 = cityService.selectByPrimaryKeyWithNoCache(7L);
System.out.println(city1);
System.out.println(city2);
}
这里出入参都相同,但是我们在NoCache中其实查询的是id为8的数据
结果
可以看到并没有进入NoCache方法。这里直接使用缓存区的数据
而我们改一下代码验证一下上述是否正确,将NoCache方法上的@Cacheable注掉
可以看出,这时我们两个方法都执行了,也确实都是从数据库中调出的数据。
呼~,终于搞明白了。
不过这个注解方式有个不好的地方就是,你的缓存全权交给Spring管理,所以你想要自己手动调出数据难上加难。
比如之前我们看到的结果。
但是方便之处就是,我不需要管你什么键值什么的,我只要使用的是同一个方法,Spring的缓存机制就会自己判断是去缓存中取数据还是从数据库中取。Service层的逻辑代码不受污染。
果然Spring解耦做的强!!
最后补个小插曲:
就是我在做测试的时候使用断言,发现测试两个对象相等总是报错
@Test
public void testEqual(){
City city1 = new City();
City city2 = new City();
city1.setId(1L);
city2.setId(1L);
city1.setCity("aa");
city2.setCity("aa");
city1.setCityCode("aa");
city2.setCityCode("aa");
city1.setCityJb("aa");
city2.setCityJb("aa");
city1.setCityName("aa");
city2.setCityName("aa");
if(city1.equals(city2)){
System.out.println("打不出来真难受");
}
//果然比较的是内存地址,要重写equal方法
Assert.assertEquals(city1,city2);
}
其实断言方法
Assert.assertEquals()
也是最后实现
只不过被层层包装了。
而equals方法比较两个对象的时候比较的是内存地址。
请教了大佬,印证了我的想法
并且大佬表式需要重写equals方法-_-||
然后我就放弃了。。。
大佬给的思路是重写hashCode,然后比较hash值
果然是大佬,我都听不懂。。。
明天计划:整合到任务中,提交任务6了,做了快半个月了-_-||
问题:已解决
收获:对于Spring注解配置Redis有了更深入的了解。
评论