概述
之前在营销系统里,开发了一个接口,用于在商品详情页里显示优惠券,方便用户在商详里看到优惠券和领取优惠券。由于商详的访问量比较大,因此显示优惠券的接口必须加上缓存。
缓存时间设计
原先优惠券缓存时间是固定设置为5分钟,但是5分钟过后,就会集体失效,因此便使用一个随机数工具,将缓存时间随机生成。例如:以秒为单位,在240-360这个范围内产生随机数,作为缓存的时间,这样就可以避免优惠券在缓存中集体失效。
随机数工具可以使用线程安全的ThreadLocalRandom
来实现。
import java.util.concurrent.ThreadLocalRandom;
public class CacheTimeUtil {
public static int generateRandomCacheTime(int origin, int bound) {
//万一origin和bound一样,bound默认加300
if (origin == bound) {
return ThreadLocalRandom.current().nextInt(origin,(bound + 300));
}
return ThreadLocalRandom.current().nextInt(origin,bound);
}
}
这样调用方只需要传入两个时间就可以了。
int cacheTime = CacheTimeUtil.generateRandomCacheTime(240,360);
根据不同环境设置不同的时间
为了方便测试人员在测试环境测试,可以在测试环境里,将缓存时间调整小一些。例如,缓存时间设置为1到2秒。 如果是使用Spring Boot
应用的话,可以不同的profile
文件里,指定不同的参数就可以了。
例如可以在application-test.yml
文件里如下指定:
productDetailCouponCache:
begin: 1
end: 2
然后对应的Controller
类可以如下使用这两个参数:
@Value("${productDetailCouponCache.begin}")
private int cacheTimeBegin = 240;
@Value("${productDetailCouponCache.end}")
private int cacheTimeEnd = 361;
当然以防万一,可以设置默认值,防止从配置文件里读取不到。