document
API test

查询当前的秒杀商品

POST

Description or Example

# 知识点 ## 随机码是否需要隐藏? > **这里的随机码不需要隐藏, 因为这里是按照场次的开始时间和结束时间查找的, 即当前时间在某个场次, 这个场次的商品才会查出来, 这意味着这些商品正在秒杀, 不需要隐藏随机码** ## Redis操作的要点 ### `keys`的要点 > **如果想要查找某个前缀的数据, 一定要在写完前缀后加上一个*** # 核心代码 ```java /** * 获取当前的秒杀商品 * @return */ @GetMapping("/getCurrent/skus") public R getCurrentSecKillSkus() { List<SeckillSkuTO> currentSecKillSkus = secKillService.getCurrentSecKillSkus(); return R.ok().setData(currentSecKillSkus); } ``` ```java @Override public List<SeckillSkuTO> getCurrentSecKillSkus() { long nowTime = new Date().getTime(); // 获取当前时间的时间戳 Set<String> sessionKeys = redisTemplate.keys(SecKillConstant.SEC_KILL_SESSION_PREFIX + "*");// 获取所有的场次关联key BoundHashOperations<String, String, String> hashOperations = redisTemplate.boundHashOps(SecKillConstant.SEC_KILL_SKU_MAP_SKU_INFO); // 哈希操作类 // 构建key集合, 通过这个批量查找 List<String> skuKeys = new ArrayList<>(); if (sessionKeys != null && !sessionKeys.isEmpty()) { for (String key : sessionKeys) { // 遍历每一个场次 String[] sessionBody = key.replaceAll("\\w+:\\w+:\\w+:", "").split("_"); long beginTime = Long.parseLong(sessionBody[0]); long endTime = Long.parseLong(sessionBody[1]); // 场次的持续时间 if (nowTime <= endTime && nowTime >= beginTime) { // 当前时间是这个场次的 List<String> keyRange = redisTemplate.opsForList().range(key, 0, -1); // 获取所有的key if (keyRange != null && !keyRange.isEmpty()) skuKeys.addAll(keyRange); } } // 查找 List<String> secKillSkuTOJsons = hashOperations.multiGet(skuKeys); if (secKillSkuTOJsons != null && !secKillSkuTOJsons.isEmpty()) { return secKillSkuTOJsons .stream() .map(secKillSkuTOJson -> JSON.parseObject(secKillSkuTOJson, SeckillSkuTO.class)) .collect(Collectors.toList()); } } return null; } ```