package com.oying.modules.pc.store.service.impl; import cn.hutool.core.util.NumberUtil; import com.oying.modules.pc.store.domain.Store; import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria; import com.oying.modules.pc.store.mapper.StoreMapper; import com.oying.modules.pc.store.service.StoreQueryService; import com.oying.modules.pc.store.service.StoreService; import com.oying.utils.PageResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class StoreQueryServiceImpl implements StoreQueryService { private final RedisTemplate redisTemplate; private final StoreService storeService; private final StoreMapper storeMapper; @Override public PageResult findPagedStores(StoreQueryCriteria criteria) { PageResult page = new PageResult<>(); // 1. 检查ZSET是否存在 String setKey = criteria.buildConditionCacheKey(); Long total = redisTemplate.opsForZSet().size(setKey); if (total == null || total == 0) { // 初始化缓存 List ids = storeMapper.queryStoreIds(criteria); for (Long id : ids) { redisTemplate.opsForZSet().add(setKey, 1, id); } // 设置缓存过期时间 redisTemplate.expire(setKey, 30, TimeUnit.MINUTES); total = (long) ids.size(); } // 2. 从ZSET获取分页ID Long offset = NumberUtil.mul(criteria.getPage(), criteria.getSize()).longValue(); long end = NumberUtil.add(offset, criteria.getSize()).longValue(); Set storeIds = Optional.ofNullable(redisTemplate.opsForZSet() .range(setKey, offset, end - 1)).orElse(Collections.emptySet()) .stream().map(i-> (Long) i).collect(Collectors.toSet()); // 3. 获取详情数据 List stores = storeService.listByIds(storeIds); page.setContent(stores); page.setTotalElements(total); return page; } }