日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cacheput注解 用法_以注解的方式使用redis缓存得用法@CachePut , @CacheEvict, @Cacheable...

發(fā)布時(shí)間:2024/3/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cacheput注解 用法_以注解的方式使用redis缓存得用法@CachePut , @CacheEvict, @Cacheable... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第一步:在啟動(dòng)類加注解@EnableCaching

@SpringBootApplication

@EnableCaching

//@MapperScan(basePackages = "com.imooc.dataobject.mapper")

public class SellApplication {

public static void main(String[] args) {

SpringApplication.run(SellApplication.class, args);

}

}

第二部:在相應(yīng)的需要緩存的類里面加個(gè)注解,測試一下

然后果然不出所料,一大堆錯(cuò)誤和坑,一起來看看,原來是Serializable的錯(cuò)誤

java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.imooc.VO.ResultVO]

Hibernate: select productcat0_.category_id as category1_2_, productcat0_.category_name as category2_2_, productcat0_.category_type as category3_2_, productcat0_.create_time as create_t4_2_, productcat0_.update_time as update_t5_2_ from product_category productcat0_

arializationRedisSerializer.java:91)

at org.springframework.data.redis.cache.RedisCache$CacheValueAccessor.convertToBytesIfNecessary(RedisCache.java:471)

解決錯(cuò)誤的辦法就是加序列化public class ResultVO implements Serializable

可以給每一個(gè)都這樣操作

@Data

public class ResultVO implements Serializable {

//自己瞎寫了一個(gè)

private static final long serialVersionUID = 222343234234L;

//resultVO 類自己的屬性

private Integer code;

private String msg;

//保存具體內(nèi)容,是個(gè)對象,泛型實(shí)現(xiàn)。

private T data;

}

然后再類里面生成ID,需要用到一下這個(gè)插件,在idea里下載,重啟即可

然后運(yùn)行,可以看到一件成功顯示數(shù)據(jù),再打開Redis客戶端,可以看到有product的一條數(shù)據(jù),

然后你不斷的刷新,都不會(huì)再進(jìn)入那個(gè)方法,因?yàn)橹苯訌木彺嬷心玫竭@個(gè)序列化存儲(chǔ)的對象,

但是這里有一個(gè)很嚴(yán)重的問題,你把數(shù)據(jù)庫的信息改了,然后刷新頁面,還是原來的數(shù)據(jù),這就是因?yàn)榫彺娴脑?#xff0c;所以我們給save更新的方法也要加個(gè)更新的處理, 接口方式。如圖。

@PostMapping("/save")

@CachePut(cacheNames = "product", key = "123")

public ModelAndView save(@Valid ProductForm productForm,

BindingResult bindingResult,

Map map){

// 1 先驗(yàn)證提交過來的表單有無錯(cuò)誤信息 -- 有 -- 跳轉(zhuǎn)錯(cuò)誤頁面

if(bindingResult.hasErrors()){

map.put("msg", bindingResult.getFieldError().getDefaultMessage());

map.put("url", "/sell/seller/product/list");

return new ModelAndView("common/error", map);

}

ProductInfo productInfo = new ProductInfo();

// if(productForm.getProductId() != null){

// productForm.setProductId(KeyUtil.genUniqueKey());

// }

// 2 沒有錯(cuò)誤, 拷貝表單信息 為 商品信息格式,

// 為了完整 -- 提前查好, 弄好默認(rèn)值

// 然后存儲(chǔ) -- 調(diào)用service 層方法 -- 出錯(cuò)處理

try{

/** 這里必須判斷 是新增 還是 修改, 有幾個(gè)特定的屬性需要單獨(dú)賦值處理

* 如果productId為空, 說明是新增 -- 不是新增:查找。 是新增:設(shè)置ID。

* ************** 新增和增加的 關(guān)鍵點(diǎn)核心 *****************

*/

if(!StringUtils.isEmpty(productForm.getProductId())){

productInfo = productInfoService.findOne(productForm.getProductId());

}else{

productForm.setProductId(KeyUtil.genUniqueKey());

}

BeanUtils.copyProperties(productForm, productInfo);

productInfoService.save(productInfo);

}catch (SellException e){

map.put("msg", e.getMessage());

map.put("url", "/sell/seller/product/list");

return new ModelAndView("common/error", map);

}

map.put("msg", ResultEnum.SUCCESS.getMessage());

map.put("url", "/sell/seller/product/list");

return new ModelAndView("common/success", map);

}

但是這樣會(huì)報(bào)錯(cuò),因?yàn)楦聲r(shí)候返回的是ModelandView對象, 而前面我們保存的是resultVO,對象不同,顯然報(bào)錯(cuò),所以改用另一種方法, 用一種注解代替

// @CachePut(cacheNames = "product", key = "123")

@CacheEvict(cacheNames = "product", key = "123")

@CacheEvict(cacheNames = "product", key = "123")就代表來的時(shí)候執(zhí)行這個(gè)方法,執(zhí)行完之后把結(jié)果從Redis中驅(qū)趕出去,也就是刪除,當(dāng)再次訪問查詢時(shí)候,Redis中沒有這個(gè)數(shù)據(jù),再次數(shù)據(jù)庫查詢 -- 從而達(dá)到更新的目的。

以上講的是基本用法,Redis的知識很豐富,持續(xù)關(guān)注

cacheNames = "product", key = "123",

其實(shí)這兩個(gè)值應(yīng)該是動(dòng)態(tài)變化的,例如這樣,

@CachePut(cacheNames = "product", key = "#productId")

public ProductInfo findOne(String productId)

這個(gè)叫做skel表達(dá)式

@Override

@CachePut(cacheNames = "product", key = "#productId")

public ProductInfo findOne(String productId) {

return repository.findOne(productId);

}

注意點(diǎn):

@CacheConfig(cacheNames = "product")

1.?cacheNames = "product", key = "123",這兩個(gè)必須寫,

@CachePut(cacheNames = "product", key = "#productId",

condition="#productId.length() > 3" ,

unless = "#result.getCode() != 0")

這些都是他的擴(kuò)展用法,具體不在講述,我只體現(xiàn)框架概念。

總結(jié)

以上是生活随笔為你收集整理的cacheput注解 用法_以注解的方式使用redis缓存得用法@CachePut , @CacheEvict, @Cacheable...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。