美文网首页
抽象类的参数延迟 , 缓存使用的一个例子

抽象类的参数延迟 , 缓存使用的一个例子

作者: zxbyh | 来源:发表于2023-06-19 11:46 被阅读0次

这儿建一个抽象类封装缓存, 以后如果换了其他的缓存只需要修改这儿就可以了.

package com.rapid.common.core.cache;

import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.LRUCache;
import cn.hutool.core.date.DateUnit;

import java.util.function.Supplier;

/**
 * @Description: 缓存支持
 * @Author zbh
 * @Date 2023/6/20
 */
public abstract class LRUCacheAble {

    protected final Integer capacity;
    protected final Long milliseconds;
    protected final LRUCache<String, Object> lruCache;

    //todo 抽象类的构造函数只能在子类的构造函数中调用,可以根据构造函数传入的值来打到延迟初始化值的效果,有点等效于模版方法类.
    public LRUCacheAble(int capacity,long milliseconds) {
        this.capacity = capacity;
        this.milliseconds = milliseconds;
        this.lruCache = CacheUtil.newLRUCache(capacity);
    }

    public LRUCacheAble() {
        this(10000, DateUnit.HOUR.getMillis());
    }

    protected <T> T getWithCache(String key, Supplier<T> supplierT){
        if(lruCache.containsKey(key)){
            return (T)lruCache.get(key);
        }
        else{
            T rlt = supplierT.get();
            lruCache.put(key,rlt, milliseconds);
            return rlt;
        }
    }

}

然后在要使用到缓存的地方 继承这个抽象类,并在构造函数里面设置初始值, 上述有一个默认构造函数加入了默认值

package com.rapid.trade.goods.infrastructure.repositories.impl;

import com.rapid.common.core.cache.LRUCacheAble;
import com.rapid.trade.goods.domain.entities.categoryspec.Category;
import com.rapid.trade.goods.infrastructure.repositories.database.daos.CategoryDao;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
@RequiredArgsConstructor
public class CategoryRepository extends LRUCacheAble {

    private final CategoryDao categoryDao;

    //todo 如果要修改缓存参数,就手动创建构造函数.
//    public CategoryRepository(CategoryDao categoryDao) {
//        super(10000, DateUnit.HOUR.getMillis()*6);
//        this.categoryDao = categoryDao;
//    }


    public Category row(int categoryId){
        return categoryDao.getTbCategory().row(categoryId)
            .process(x->x.set("isLeaf", _isLeaf(categoryId)))
            .toClass(Category.class);
    }

    public Category rowCached(int categoryId){
        return getWithCache("row_category_" + categoryId, ()->row(categoryId));
    }

    public List<Category> list(int parentId){
        return categoryDao.getTbCategory().listRow(
            Map.of("parentId",parentId),
            mp->mp.process(x->x.set("isLeaf",_isLeaf(x.i("categoryId")))).toClass(Category.class)
        );
    }

    public List<Category> listCached(int parentId){
        System.out.println(super.milliseconds);
        return getWithCache("list_category_" + parentId, ()->list(parentId));
    }

    private Boolean _isLeaf(Integer categoryId){
        return categoryDao.getTbCategory().listRow(Map.of("parentId",categoryId)).isEmpty();
    }
}

相关文章

  • vue学习笔记

    1、vue生命周期 2、created 里面的参数可以缓存使用,但不能双向数据绑定例子这里面created缓存了d...

  • Scala-9.面向对象-抽象类

    使用抽象类:Scala的trait(特质)比抽象类更加灵活,需要再一下情况中使用抽象类:需要创建一个有构造函数参数...

  • Python进阶 函数缓存 (Function caching)

    函数缓存允许我们将一个函数对于给定参数的返回值缓存起来。当一个I/O密集的函数被频繁使用相同的参数调用的时候,函数...

  • mybatis缓存

    一级缓存 用一个SqlSession、同样的sql、同样的参数,会使用到一级缓存 不过目前经常使用的注解mappe...

  • ThinkPHP实现静态缓存和动态缓存

    静态缓存 要使用静态缓存功能,需要开启HTML_CACHE_ON参数,并且使用HTML_CACHE_RULES配置...

  • scala School笔记

    特质和抽象类怎么选择 优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。 如果你需要构造函数参数...

  • Common Workflow Language [二]

    六、参数引用 能在另一个位置重复使用参数值吗? 在上一个例子中,我们使用tar程序提取了一个文件。 然而,这个例子...

  • CentOS7(Linux)清理yum缓存 和释放内存方法

    清理yum缓存 清理yum缓存使用yum clean 命令,yum clean 的参数有headers, pack...

  • CentOS7(Linux)清理yum缓存 和释放内存方法

    清理yum缓存 清理yum缓存使用yum clean 命令,yum clean 的参数有headers, pack...

  • cpp性能优化

    函数调用的时候,参数传引用。尽量减少传递参数。 缓存buffer,把经常使用的数据缓存下来,避免重复计算。用空间换...

网友评论

      本文标题:抽象类的参数延迟 , 缓存使用的一个例子

      本文链接:https://www.haomeiwen.com/subject/naleydtx.html