Search in sources :

Example 1 with PmsSkuImage

use of com.xatu.gmall.entity.PmsSkuImage in project GMall by 18391713434.

the class SkuServiceImpl method saveSkuInfo.

public void saveSkuInfo(PmsSkuInfo pmsSkuInfo) {
    // 插入SkuInfo
    skuInfoMapper.insert(pmsSkuInfo);
    // 插入平台属性关联
    List<PmsSkuAttrValue> pmsSkuAttrValueList = pmsSkuInfo.getSkuAttrValueList();
    for (PmsSkuAttrValue pmsSkuAttrValue : pmsSkuAttrValueList) {
        pmsSkuAttrValue.setSkuId(pmsSkuInfo.getId());
        skuAttrValueMapper.insert(pmsSkuAttrValue);
    }
    // 插入销售属性关联
    List<PmsSkuSaleAttrValue> pmsSkuSaleAttrValueList = pmsSkuInfo.getSkuSaleAttrValueList();
    for (PmsSkuSaleAttrValue pmsSkuSaleAttrValue : pmsSkuSaleAttrValueList) {
        pmsSkuSaleAttrValue.setSkuId(pmsSkuInfo.getId());
        skuSaleAttrValueMapper.insert(pmsSkuSaleAttrValue);
    }
    // 插入图片信息
    List<PmsSkuImage> pmsSkuImageList = pmsSkuInfo.getSkuImageList();
    for (PmsSkuImage pmsSkuImage : pmsSkuImageList) {
        pmsSkuImage.setSkuId(pmsSkuInfo.getId());
        skuImageMapper.insert(pmsSkuImage);
    }
}
Also used : PmsSkuAttrValue(com.xatu.gmall.entity.PmsSkuAttrValue) PmsSkuImage(com.xatu.gmall.entity.PmsSkuImage) PmsSkuSaleAttrValue(com.xatu.gmall.entity.PmsSkuSaleAttrValue)

Example 2 with PmsSkuImage

use of com.xatu.gmall.entity.PmsSkuImage in project GMall by 18391713434.

the class SkuServiceImpl method getSkuById.

public PmsSkuInfo getSkuById(String skuId) {
    /*PmsSkuInfo pmsSkuInfo = skuInfoMapper.selectById(skuId);
        List<PmsSkuImage> skuImageList = skuImageMapper.selectList(new QueryWrapper<PmsSkuImage>().eq("sku_id", skuId));
        pmsSkuInfo.setSkuImageList(skuImageList);*/
    PmsSkuInfo pmsSkuInfo = null;
    // 链接缓存
    Jedis jedis = redisUtil.getJedis();
    // 查询缓存
    String skuKey = "sku:" + skuId + ":info";
    String skuJson = jedis.get(skuKey);
    try {
        if (StringUtils.isNotBlank(skuJson)) {
            pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
        } else {
            // 如果缓存没有,查询mysql
            // 设置分布式锁
            // String OK = jedis.set("sku:" + skuId + ":lock",token,"nx","px",10*1000); //拿到10秒控制权限
            String token = UUID.randomUUID().toString();
            // 拿到10秒控制权限
            String OK = jedis.set("sku:" + skuId + ":lock", token, "nx", "px", 10 * 1000);
            if (StringUtils.isNotBlank(OK) && OK.equals("OK")) {
                // 设置成功,有权在10秒的过期时间内访问数据库
                pmsSkuInfo = skuInfoMapper.selectById(skuId);
                List<PmsSkuImage> skuImageList = skuImageMapper.selectList(new QueryWrapper<PmsSkuImage>().eq("sku_id", skuId));
                pmsSkuInfo.setSkuImageList(skuImageList);
                // mysql查询结果存入redis
                if (pmsSkuInfo != null) {
                    jedis.set("sku:" + skuId + ":info", JSON.toJSONString(pmsSkuInfo));
                } else {
                    // 数据库中不存在该sku
                    // 为了防止缓存穿透,null或者空字符串设置给redis
                    jedis.setex("sku:" + skuId + ":info", 60 * 3, JSON.toJSONString(""));
                }
                // 在访问mysql之后,将分布式锁释放
                // jedis.del("sku:" + skuId + ":lock");
                String lockToken = jedis.get("sku:" + skuId + ":lock");
                if (StringUtils.isNotBlank(lockToken) && lockToken.equals(token)) {
                    // 用token确认删除的是自己的锁
                    // jedis.eval("lua"):可以使用lua脚本,在查询key的同时删除该key,防止高并发下的意外发生
                    jedis.del("sku:" + skuId + ":lock");
                }
            } else {
                // 设置失败自旋(该线程睡眠几秒后,重新尝试访问)
                try {
                    Thread.sleep(3000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return getSkuById(skuId);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        jedis.close();
    }
    return pmsSkuInfo;
// //Redisson锁是包装的JUC内的锁策略,是Java代码层面的分布式锁
// RLock lock = redisson.getLock("anyLock");//声明锁
// // 加锁以后10秒钟自动解锁
// // 无需调用unlock方法手动解锁
// PmsSkuInfo pmsSkuInfo = null;
// //链接缓存
// Jedis jedis = RedisUtil.getJedis();
// //查询缓存
// String skuKey = "sku:"+skuId+":info";
// String skuJson = jedis.get(skuKey);
// try{
// if(StringUtils.isNotBlank(skuJson)){
// pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
// }else{
// //如果缓存没有,查询mysql
// //设置分布式锁
// // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
// boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS);
// if (res) {
// try {
// pmsSkuInfo = skuInfoMapper.selectById(skuId);
// List<PmsSkuImage> skuImageList = skuImageMapper.selectList(new QueryWrapper<PmsSkuImage>().eq("sku_id", skuId));
// pmsSkuInfo.setSkuImageList(skuImageList);
// //mysql查询结果存入redis
// if(pmsSkuInfo!=null){
// jedis.set("sku:"+skuId+":info",JSON.toJSONString(pmsSkuInfo));
// }else{
// //数据库中不存在该sku
// //为了防止缓存穿透,null或者空字符串设置给redis
// jedis.setex("sku:"+skuId+":info",60*3, JSON.toJSONString(""));
// }
// }catch (Exception e){
// e.printStackTrace();
// } finally {
// lock.unlock();
// }
// }else{
// return getSkuById(skuId); //如果得不到锁,重新访问
// }
// 
// }
// }catch (Exception e){
// e.printStackTrace();
// }finally {
// jedis.close();
// }
// return pmsSkuInfo;
}
Also used : Jedis(redis.clients.jedis.Jedis) PmsSkuImage(com.xatu.gmall.entity.PmsSkuImage) QueryWrapper(com.baomidou.mybatisplus.core.conditions.query.QueryWrapper) PmsSkuInfo(com.xatu.gmall.entity.PmsSkuInfo)

Aggregations

PmsSkuImage (com.xatu.gmall.entity.PmsSkuImage)2 QueryWrapper (com.baomidou.mybatisplus.core.conditions.query.QueryWrapper)1 PmsSkuAttrValue (com.xatu.gmall.entity.PmsSkuAttrValue)1 PmsSkuInfo (com.xatu.gmall.entity.PmsSkuInfo)1 PmsSkuSaleAttrValue (com.xatu.gmall.entity.PmsSkuSaleAttrValue)1 Jedis (redis.clients.jedis.Jedis)1