商店类型缓存redis实现

商店类型缓存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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值