重用咖啡因缓存键

我已经使用cache实现了caffeine。我希望它在1 day之后过期,并且可以正常工作。问题是,如果我尝试使用经过修改的查询(根据参数值进行修改)从cache获取数据,我总是会得到相同的结果。仅当我使用相同的参数值(例如,相同的日期范围)执行查询时,我才想获得相同的结果。我的理解是,我不应该重复使用相同的cache-key,但是我不确定怎么做。 这是实现:

@Service
public class SomeServiceImpl implements SomeService {
  private static final String CACHE_KEY = "some-key";
  private Cache<String,List<SomeVO>> someCache;



  public RecentHighestSlotWinsServiceImpl() {

    someCache= caffeine.newBuilder().maximumSize(100).expireAfterWrite(1,TimeUnit.DAYS).build();
  }

  @Override
  public List<SomeVO> checkCacheFordata(Instant startDate,Instant endDate) {

  List<SomeVO> someList= someCache.getIfPresent(CACHE_KEY);
  if (someList!= null) {
      return someList;
  } else {
      log.info("Loading from DB ");
      List<SomeVO> templateResult= getData(startDate,endDate);
      if (templateResult.isSuccessAndNotNull()) {
          someCache.put(CACHE_KEY,Objects.requireNonNull(templateResult.getData()));
      }
      return templateResult;
  }
}
iCMS 回答:重用咖啡因缓存键

多种处理方式:

  1. 就像@Louis Wasserman所说的,有这样的东西:
import java.time.Instant;
import java.util.Objects;

public class CacheKey {
  private Instant startDate;
  private Instant endDate;

  public CacheKey() {
  }

  public CacheKey(Instant startDate,Instant endDate) {
    this.startDate = startDate;
    this.endDate = endDate;
  }

  public Instant getStartDate() {
    return startDate;
  }

  public void setStartDate(Instant startDate) {
    this.startDate = startDate;
  }

  public Instant getEndDate() {
    return endDate;
  }

  public void setEndDate(Instant endDate) {
    this.endDate = endDate;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o)
      return true;
    if (o == null || getClass() != o.getClass())
      return false;
    CacheKey cacheKey = (CacheKey) o;
    return Objects.equals(startDate,cacheKey.startDate) &&
        Objects.equals(endDate,cacheKey.endDate);
  }

  @Override
  public int hashCode() {
    return Objects.hash(startDate,endDate);
  }
}

并在您的方法 checkCacheForData 中使用:

@Service
public class SomeServiceImpl implements SomeService {
  private Cache<CacheKey,List<SomeVO>> someCache;



  public RecentHighestSlotWinsServiceImpl() {

    someCache= Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1,TimeUnit.DAYS).build();
  }

  @Override
  public List<SomeVO> checkCacheForData(Instant startDate,Instant endDate) {

  List<SomeVO> someList= someCache.getIfPresent(new CacheKey(startDate,endDate));
  if (someList!= null) {
      return someList;
  } else {
      log.info("Loading from DB ");
      List<SomeVO> templateResult= getData(startDate,endDate);
      if (templateResult.isSuccessAndNotNull()) {
          someCache.put(new CacheKey(startDate,endDate),Objects.requireNonNull(templateResult.getData()));
      }
      return templateResult;
  }
}
  1. 您可以将开始日期和结束日期的字符串表示形式并用作为缓存键,而不必使用单独的对象。
@Service
public class SomeServiceImpl implements SomeService {
  private Cache<String,Instant endDate) {

String cacheKey = startDate.toString() + endDate.toString();
  List<SomeVO> someList= someCache.getIfPresent(cacheKey);
  if (someList!= null) {
      return someList;
  } else {
      log.info("Loading from DB ");
      List<SomeVO> templateResult= getData(startDate,endDate);
      if (templateResult.isSuccessAndNotNull()) {
          someCache.put(cacheKey,Objects.requireNonNull(templateResult.getData()));
      }
      return templateResult;
  }
}
本文链接:https://www.f2er.com/2018783.html

大家都在问