《Spring實戰》-第十三章:緩存數據(2)-在方法上使用緩存

慢來比較快,虛心學技術

Spring 的緩存抽象在很大程度上是圍繞切面構建的。在 Spring 中啓用緩存時,會創建一個切面,它觸發一個或更多的 Spring 的緩存註解,Spring提供的緩存註解主要有以下幾個:


Ⅰ、填充緩存

由上述註解可知,@Cacheable@CachePut註解可以往緩存填充內容,兩者的共有屬性有:

在最簡單的情況下,在 @Cacheable 和 @CachePut 的這些屬性中,只需使用 value 屬性指定一個或多個緩存即可

上一篇文章中我們介紹了Spring整合Redis的過程,我們依舊使用Redis緩存瞭解Spring對緩存的抽象

我們事先編寫一個BaseDao作爲操作基準

@Component
public class BaseDao {

    /**
     * 根據id獲取信息
     **/
    @Cacheable(value = "myCache")
    public String findOne(Integer id){
        System.out.println("執行findOne方法。。。。");
        return "我是BaseDao"+id;
    }

    /**
     * 根據id更改信息
     **/
    @CachePut(value = "myCache")
    public String save(Integer id){
        System.out.println("執行save方法。。。。。");
        return "BaseDao"+id;
    }

    /**
     * 根據id移除信息
     **/
    @CacheEvict(value = "myCache")
    public void remove(Integer id){
        System.out.println("執行remove方法。。。。。");
    }
}

編寫測試類:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RedisCacheConfig.class})
public class AppTest {
    @Autowired
    private BaseDao baseDao;
}

測試使用@Cacheable存取數據

我們知道當緩存中沒有對應數據的時候,會執行使用了@Cacheable註解的方法,並將結果存入緩存

如果緩存中已經存在對應數據,則直接將緩存數據返回:

@Test
public void testCacheAble(){
    System.out.println(this.baseDao.findOne(0));
    System.out.println(this.baseDao.findOne(0));
}

此處執行兩次findOne(0),測試結果:

執行findOne方法。。。。
我是BaseDao0
我是BaseDao0

可以看到,此處只是實際上只有一次真正進入了findOne方法內,第二次從緩存中獲取數據,以下是redis-cli中看到的結果:

在緩存中,緩存的key值默認爲 緩存名稱::傳參值

測試使用@CachePut更新數據

由於使用@CachePut註解默認每次都會進入方法並使用返回值更新緩存,所以該註解在實際業務中一般用在更新數據的方法上

@Test
public void testCachePut(){
    this.baseDao.save(0);
    this.baseDao.save(0);
    System.out.println(this.baseDao.findOne(0));
}

測試結果:

執行save方法。。。。。
執行save方法。。。。。
BaseDao0

可以看到,此處兩次執行save方法都進入了,執行save之後再調用findOne方法,依舊直接從緩存取值,緩存已更新

自定義緩存的key

@Cacheable@CachePut 都有一個名爲 key 屬性,這個屬性能夠替換默認的 key ,它是通過一個 SpEL 表達式計算得到的

如將上述findOne()和save()方法緩存的key定義爲BaseDao的class

@Cacheable(value = "myCache",key = "#root.targetClass")
public String findOne(Integer id){
    System.out.println("執行findOne方法。。。。");
    return "我是BaseDao"+id;
}

@CachePut(value = "myCache",key = "#root.targetClass")
public String save(Integer id){
    System.out.println("執行save方法。。。。。");
    return "BaseDao"+id;
}

再次執行測試testCacheAble()方法:

執行findOne方法。。。。
我是BaseDao0
我是BaseDao0

可以看到緩存如下:使用class com.my.spring.dao.BaseDao作爲緩存的key

Ⅱ、移除緩存

使用@CacheEvict測試移除緩存

@Test
public void testCacheEvict(){
    this.baseDao.remove(0);
}

執行測試結果:

執行remove方法。。。。。

緩存已經清除:

此時再去訪問findOne(),結果:

執行findOne方法。。。。
我是BaseDao0
我是BaseDao0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章