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;
}
```