laomao , Life is like a play

LoadingCache缓存的使用

默认分类 0 评

缓存在日常开发中是比不可少的一种性能问题的方法,简单来讲Cache就是为了提升系统性能而开辟的一块内存空间,缓存的主要作用就是暂时在内存中保存业务数据的处理结果,等待访问使用。

导入pom依赖

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.0-jre</version>
</dependency>

编写代码

缓存代码可以单独写一个Configuration配置类配置一个Bean使用的时候可以直接注入对象,代码结构更清晰

LoadingCache<Integer, List<Coupon>> couponCache = CacheBuilder.newBuilder()
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .build(new CacheLoader<Integer, List<Coupon>>() {
                       @Override
                       public List<Coupon> load(Integer o) throws Exception {
                           //从数据库load要缓存的数据
                           return loadCoupon(o);
                       }
                   }
            );

expireAfterWrite:过期时间,在一定时间内没有创建或覆盖时,会移除该KEY
refreshAfterWrite:在写之后隔多久去刷新缓存,是在指定时间内没有被创建/覆盖,则指定时间过后,再次访问时,会去刷新该缓存,在新值没有到来之前,始终返回旧值

常用方法

V getIfPresent(Object key)
//获取缓存中key对应的value,如果缓存没命中,返回null。return value if cached, otherwise return null.

V get(K key) throws ExecutionException  
//获取key对应的value,若缓存中没有,则调用LocalCache的load方法,从数据源中加载,并缓存。return value if cached, otherwise load, cache and return.

void put(K key, V value) 
//if cached, return; otherwise create, cache , and return.
void invalidate(Object key) 
//删除缓存
void invalidateAll() 
//清除所有的缓存,相当远map的clear操作。
long size() 
//获取缓存中元素的大概个数,为什么是大概个数?元素失效时,并不会实时的更新size个数,所以这里的size可能会包含失效元素个数

CacheStats stats() 
//缓存的状态数据,包括(未)命中个数,加载成功/失败个数,总共加载时间,删除个数等。
ConcurrentMap<K, V> asMap() 
//将缓存存储到一个线程安全的map中。

批量操作方法其实也就是循环调用上面对应的方法

ImmutableMap<K, V> getAllPresent(Iterable<?> keys);
void putAll(Map<? extends K,? extends V> m);
void invalidateAll(Iterable<?> keys);
MyBatis Generator 代码生成器生成表字段不正确或选择错数据库
发表评论
撰写评论