商店类型缓存redis实现
难点分析:
1.首先是查询商店的mysql语句直接将所有商店类型全部查出, 没有像查找某一个具体商店时根据具体id去查询, 这样就加大了redis中设置键值的难度.
2.redis基础类型的选择:没有给具体的查询键的值, 并且查出来的结果还是多个对象. 这里可以在hash,string,list中选择. 我实现了hash和list两种方式.
3.查询结果需要排序
实现逻辑
1.手到前端请求时首先在redis查找是否有缓存
2.若redis中有缓存数据, 就直接将redis中的数据返回, 返回结果根据sort属性排序
3.若redis中没有数据, 就要在数据库中查询
4.若查询结果为空, 返回错误信息或者null
5.若查询结果不为空,则先将数据缓存到redis中,再将数据返回给前端.
实现方式
1.采用hash实现
@Resource
private StringRedisTemplate stringRedisTemplate;
//定义shopType在redis中的缓存类型为hash:
//key为CACHE_SHOP_TYPE_KEY
//field对应每个商店类型的id
//value对应商店属性的json字符串
//@Override
public List<ShopType> queryShopTypeList1() {
List<ShopType>list=new ArrayList<>();
//先到redis中查询所有的商品类型
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(CACHE_SHOP_TYPE_KEY);
//找到了就返回
if(!entries.isEmpty()){
Collection<Object> values = entries.values();
for (Object v:values
) {
//将查询出的结果字符串转换为对象
ShopType shopType = JSONUtil.toBean((String) v, ShopType.class);
list.add(shopType);
}
list.sort((o1, o2) -> {
if (o1.getSort() >= o2.getSort()) {
return 1;
} else {
return -1;
}
});
return list;
}
//若查询结果为空则到数据库中查找
List<ShopType> sort = query().orderByAsc("sort").list();
//数据库中查询结果为空就返回错误信息
if(sort.isEmpty()){
return null;
}
//若找到结果像缓存到redis中,再返回结果
Map<String,Object>map=new HashMap<>();
for (ShopType s:sort
) {
map.put(s.getId().toString(),JSONUtil.toJsonStr(s));
}
stringRedisTemplate.opsForHash().putAll(CACHE_SHOP_TYPE_KEY,map);
return sort;
}
2.string实现
/**
* key为:CACHE_SHOP_TYPE_KEY+s.getId() 如CACHE:SHOP-TYPE1
* value为shopType的json字符串{
* "icon": "/types/ms.png",
* "updateTime": 1640229871000,
* "sort": 1,
* "createTime": 1640175467000,
* "name": "美食",
* "id": 1
* }
*/
@Override
public List<ShopType> queryShopTypeList(){
List<String>ids=new ArrayList<>();
List<ShopType>list=new ArrayList<>();
//先到redis中查询所有的商品类型
//Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(CACHE_SHOP_TYPE_KEY);
if(!ids.isEmpty()){
List<String> strings = stringRedisTemplate.opsForValue().multiGet(ids);
for (String s:strings
) {
list.add(JSONUtil.toBean(s,ShopType.class));
}
list.sort((o1,o2)->{
if(o1.getSort()>o2.getSort()){
return -1;
}else {
return 1;
}
});
return list;
}else{
List<ShopType> sort = query().orderByAsc("sort").list();
if(sort.isEmpty()){
return null;
}else{
Map<String,String> map=new HashMap<>();
for (ShopType s:sort
) {
ids.add(s.getId().toString());
map.put(CACHE_SHOP_TYPE_KEY+s.getId().toString(),JSONUtil.toJsonStr(s));
}
stringRedisTemplate.opsForValue().multiSet(map);
}
return sort;
}