TOP K+LRU缓存刷新

本文探讨了一种结合TOP K和LRU的本地缓存机制,用于存储变化不频繁的数据,如商品配置和热数据计算结果。缓存按照请求次数和最近访问时间排序,确保高访问频次且近期活跃的数据得以保留。当缓存满时,优先淘汰请求次数较少的条目。

本地缓存机制常被用来存储系统中变化频率不高的数据,常见的变化频率不高数据有:比如商品配置,可能商家的商品描述信息基本不变化,价格变化也不是很频繁,那可以存在缓存里减少访问数据库。又比如某类计算存在热数据,即某些问题的计算入参在短时间内频繁重,则可以把计算结果缓存起来。

设计了类似LRU+TOP K的思路,针对新来的请求先查缓存,若没有实时计算,并把结果添加到缓存,之后对缓存按照请求次数和最近访问时间排序(先按照时间由近到远,再按照请求次数由大到小,最终顺序为请求次数由大到小,次数相同的时间由近到远),每次更新后删除顺序值大于缓存SIZE的计算结果。

示例代码如下:
public class ComputeServiceWithCache {

    /** 计算结果缓存MAP(用于查询) */
    private volatile Map<String, ComputeResult> resultCacheMap = new HashMap<String, ComputeResult>();

    /** 已排序缓存列表(用于排序,维护在内存中,提高排序效率) */
    private List<ComputeResult>                 cacheRankList  = new ArrayList<ComputeResult>();

    /** 计算服务 */
    private ComputeService                      computeService;

    /** 缓存大小 */
    private static final int                    CACHE_SIZE     = 100;

    /** 数值1 */
    private static final int                    ONE            = 1;

    /**
     * 计算买卖双方的关系
     *
     * @param buyerId 买家ID
     * @param sellerId 卖家ID
     * @return 计算结果
     */
    public ComputeResult computeRelation(String buyerId, String sellerId) {
        String cacheKey = buyerId + sellerId;
        ComputeResult result = findRelationInCache(cacheKey);

        if (null == result) {
            result = computeService.compute(buyerId, sellerId);
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值