发表于: 2017-09-06 20:22:56

4 943


今天做的事:

今天可能什么事情都没做成。。。

下午做了个小课堂的内容,明天讲。


然后继续昨天的问题开始分析,果然我太乐观了,唉~这个任务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有了更深入的了解。




返回列表 返回列表
评论

    分享到