0
点赞
收藏
分享

微信扫一扫

【电商支付项目(七)】购物车模块 & SpringBoot整合Redis

心存浪漫 2022-04-04 阅读 66

文章目录

用户购物车、某条状态、文章点赞

Redis 安装(开发环境、单节点)

Another.Redis.Desktop.Manager.1.2.5.exe(Win)
Another.Redis.Desktop.Manager.1.2.5.dmg(Mac)

1、Linux下安装

2、Windows下:
版本:5.0.x || 下载链接见博客资源
①双击 redis-server,出现以下界面即代表redis正常启动
在这里插入图片描述
②使用redis可视化工具
填写地址和端口,其余空着即可

在这里插入图片描述
TTL :过期时间,不设置就是不过期
在这里插入图片描述

SpringBoot整合Redis

步骤一①:添加依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

步骤二②:配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/mall?characterEncoding=utf-8&&useSSL=false&&serverTimezone=GMT%2B8
  redis:
    host: 127.0.0.1
    port: 6379

引入gson依赖 序列化

 <!-- 也可以用 fastjson 序列化-->
 <dependency>
     <groupId>com.google.code.gson</groupId>
     <artifactId>gson</artifactId>
 </dependency>
@Service
public class CartServiceImpl implements ICartService {

    private final static String CART_REDIS_KEY_TEMPLATE = "cart_%d";

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private StringRedisTemplate redisTemplate;

    private Gson gson = new Gson();

    @Override
    public ResponseVo<CartVo> add(Integer uid, CartAddForm form) {
        Integer quantity = 1;

        Product product = productMapper.selectByPrimaryKey(form.getProductId());

        // 商品是否存在
        if (product == null) {
            return ResponseVo.error(ResponseEnum.PRODUCT_NOT_EXIST);
        }

        // 商品是否正常在售
        if (!product.getStatus().equals(ProductStatusEnum.ON_SALE.getCode())) {
            return ResponseVo.error(ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE);
        }

        // 商品库存是否充足
        if (product.getStock() <= 0) {
            return ResponseVo.error(ResponseEnum.PRODUCT_STOCK_ERROR);
        }

        // 写入到redis
        // key: cart_1
        redisTemplate.opsForValue().set(String.format(CART_REDIS_KEY_TEMPLATE, uid),    // key
                gson.toJson(new Cart(product.getId(), quantity, form.getSelected()))); // 用gson将对象转化为String类型 序列化
        return null;
    }
}

在这里插入图片描述
改进 -> Hashmap 提高查询速度(相对列表)

 // 写入到redis
 // key: cart_1
 HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
 opsForHash.put(String.format(CART_REDIS_KEY_TEMPLATE, uid),    // key
         String.valueOf(product.getId()), // HashMap 的 key
         gson.toJson(new Cart(product.getId(), quantity, form.getSelected()))); // 用gson将对象转化为String类型 序列化

在这里插入图片描述
Redis key 设置为累加

// 写入到redis
// key: cart_1
HashOperations<String, String, String> opsForHash = redisTemplate.opsForHash();
String redisKey = String.format(CART_REDIS_KEY_TEMPLATE, uid);

Cart cart;
String value = opsForHash.get(redisKey, String.valueOf(product.getId()));
if (StringUtils.isEmpty(value)) {
    // 没有该商品,新增
    cart = new Cart(product.getId(), quantity, form.getSelected());
}else {
    // 已经有了,数量 +1
    cart = gson.fromJson(value, Cart.class); // 反序列化
    cart.setQuantity(cart.getQuantity() + quantity);
}
opsForHash.put(redisKey,    // key
        String.valueOf(product.getId()), // HashMap 的 key
        gson.toJson(cart)); // 用gson将对象转化为String类型 序列化
举报

相关推荐

0 条评论