小编最近在看实战redis,黑马的,看到有一章是P46封装Redis工具类
废话不多说!直接上代码
调用的代码:
//具体的上下文代码去b站找黑马redis入门到实战 P46集//优雅的写出这样,参数意义看方法!
Shop shop = queryWithPassThrough(CACHE_SHOP_KEY,id,shop.class,id2->getById(id2))
方法:
//具体的上下文代码去b站找黑马redis入门到实战 P46集//我这里只是写泛型和函数式/**<R>代表是返回的泛型<ID>代表参数ID id 因为不确定id之后是什么类型,用泛型指定ID id代表是具体的那个类型,又这个入参决定<ID>Class<R> type 代表是具体的那个类对象,又这个入参决定<R>Funtion<ID,R> dbFallback 函数式(ID是入参,R是返回)String keyPrefix 是redis的key,一般是前缀+id绑定Funtion<ID,R> dbFallback ID表示参数,R表示返回值
*/
pulic <R,ID> R queryWithPassThrough(String keyPrefix,ID id,Class<R> type, Funtion<ID,R> dbFallback){String key = keyPrefix + id;//1.从redis查询商品缓存String json = stringRedisTemplate.opsForValue().get(key);//2.判断是否存在if(StrUtil.isNotBlank(json)){//3.存在,直接返回return JSONUtil.toBean(json,type);}//判断命中的是否是空值if(json != null){return null;}//4.不存在,更加ID查询数据库,函数式声明R r = dbFallback.apply(id);//5.不存在,返回错误if(r == null){//将空值写入redis中 stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL,TimeUnit.MINUTES);return null;}//存在,写入redis中 stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(r),CACHE_NULL_TTL,TimeUnit.MINUTES);return r}