缓存时间小技巧-随机打散

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

概述


之前在营销系统里,开发了一个接口,用于在商品详情页里显示优惠券,方便用户在商详里看到优惠券和领取优惠券。由于商详的访问量比较大,因此显示优惠券的接口必须加上缓存。


缓存时间设计


原先优惠券缓存时间是固定设置为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;

当然以防万一,可以设置默认值,防止从配置文件里读取不到。


原文链接


缓存时间小技巧-随机打散

转载于:https://my.oschina.net/samgege/blog/2993498

你可能感兴趣的:(java,python)