未月廿三 | 作者
urlify.cn/nUn2Aj | 來源
對於緩存聲明,spring的緩存提供了一組java註解:
顧名思義,@Cacheable可以用來進行緩存的寫入,將結果存儲在緩存中,以便於在後續調用的時候可以直接返回緩存中的值,而不必再執行實際的方法。最簡單的使用方式,註解名稱=緩存名稱,使用例子如下:
@Cacheable(&34;)public Book findBook(ISBN isbn) {...}
一個方法可以對應兩個緩存名稱,如下:
@Cacheable({&34;, &34;})public Book findBook(ISBN isbn) {...}
@Cacheable的緩存名稱是可以配置動態參數的,比如選擇傳入的參數,如下: (以下示例是使用SpEL聲明,如果您不熟悉SpEL,可以閱讀Spring Expression Language)
@Cacheable(cacheNames=&34;, key=&isbn&34;books&34;34;)public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames=&34;, key=&isbn)&34;book&34;34;)public Book findBook(String name)@Cacheable(cacheNames=&34;, condition=&name.length() < 32&34;34;)public Book findBook(String name)
@Cacheable還可以設置:keyGenerator(指定key自動生成方法),cacheManager(指定使用的緩存管理),cacheResolver(指定使用緩存的解析器)等,這些參數比較適合全局設置,這裡就不多做介紹了。
@CachePut:當需要更新緩存而不幹擾方法的運行時 ,可以使用該註解。也就是說,始終執行該方法,並將結果放入緩存,註解參數與@Cacheable相同。以下是一個簡單的例子:
@CachePut(cacheNames=&34;, key=&isbn&34;books&34;books&34;primary&34;secondary&34;34;) })public Book importBooks(String deposit, Date date)
@CacheConfig:緩存提供了許多的註解選項,但是有一些公用的操作,我們可以使用@CacheConfig在類上進行全局設置。以下是個簡單的例子:
@CacheConfig(&34;) public class BookRepositoryImpl implements BookRepository { @Cacheable public Book findBook(ISBN isbn) {...} }
可以共享緩存名稱,統一配置KeyGenerator,CacheManager,CacheResolver。
來看看我們在springboot中怎麼使用redis來作為緩存吧.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
spring: redis: database: 0 Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:password@example.com:6379 url: redis://user:@127.0.0.1:6379 host: 127.0.0.1 Login password of the redis server. port: 6379 Whether to enable SSL support. timeout: 5000 34;.&34;.&34;keyGenerator=&34;app:machineList:goods&34;神器榜單--查詢關聯關係及商品&34;查詢關聯關係及商品&34;inputVO&34;查詢商品模板(goodsId不用填寫,首次查詢使用category和typeTagFirst,點擊一級標籤查詢傳遞category和typeTagFirst和typeTagSecond)&34;GoodsModelRelatedInputVO&34;queryGoodsModels&34;&39;+39;:machineList-&inputVO.getTypeTagFirst()+&39;+34;)public WebResult queryGoodsModels(@RequestBody @Valid GoodsModelRelatedInputVO inputVO) { List<TreeModel> list = relatedService.queryGoodsModels(inputVO); return WebResult.getInstance().success(list);}
@ApiOperation(value = &34;, notes = &34;)@ApiImplicitParam(name = &34;, value = &34;, required = true, dataType = &34;)@PostMapping(&34;)@CacheEvict(value = Constants.APP_QUERY_GOODS,allEntries = true)public WebResult addTypeTagModel(@RequestBody List<TypeTag> typeTags) { typeTagModelService.addTypeTagModel(typeTags); return WebResult.getInstance().operateSuccess();}@ApiOperation(value = &34;, notes = &34;)@ApiImplicitParam(name = &34;, value = &34;, required = true, dataType = &34;)@PostMapping(&34;)@CacheEvict(value = Constants.APP_QUERY_GOODS,allEntries = true)public WebResult deleteTypeTagModel(@RequestBody @Valid TypeTagModelDelInputVO inputVO) { Boolean flag = typeTagModelService.deleteTypeTagModel(inputVO); return WebResult.getInstance().operateSuccess();}@ApiOperation(value = &34;, notes = &34;)@ApiImplicitParam(name = &34;, value = &34;, required = true, dataType = &34;)@PostMapping(&34;)@CacheEvict(value = Constants.APP_QUERY_GOODS,allEntries = true)public WebResult insertGoodsModelRelated(@RequestBody @Valid List<GoodsModelRelated> goodsModelRelateds) { relatedService.insertGoodsModelRelatedBatch(goodsModelRelateds); return WebResult.getInstance().operateSuccess();}@ApiOperation(value = &34;, notes = &34;)@DeleteMapping(&34;)@CacheEvict(value = Constants.APP_QUERY_GOODS,allEntries = true)public WebResult deleteGoodsModelRelatedBatch(@RequestBody @Valid @ApiParam(name = &34;, value = &34;, required = true)List<Long> ids) { relatedService.deleteGoodsModelRelatedBatch(ids); return WebResult.getInstance().operateSuccess();}
在查詢的時候將數據進行緩存,在進行數據更改的時候,根據 APP_QUERY_GOODS = &34;名字將此名字下緩存的數據刪掉
APP_QUERY_GOODS的命名使用&34;分隔,&34;在rdm中查看的時候就是三個層級
app第一層級,machineList第二層級,goods第三層級
然後後面會以key命名的規則添加
value命名的和key命名的中間以&34;分隔