Guava内存缓存Cache的常见代码示例用法如下,可直接复制在实际项目中进行使用
主要用于缓存使用频率最高且少量的数据,内存缓存主要将数据缓存在内存中,
大数据量请选择Redis数据存储,节省服务器资源
[expireAfterWrite]如果设置此项===》在指定的时间段内没有更新缓存中数据就会移除,需要重新PUT
[expireAfterAccess]如果设置此项===》在指定的时间段内没有读写缓存中数据就会移除,需要重新PUT
一、内存缓存Cache的日常用法
先来看下Cache的接口代码
@ThreadSafe
public interface Cache<K, V> {
/**
* 从cache中获取值,如果没有直接返回null
*/
@Nullable
V getIfPresent(@Nonnull Object key);
/**
* 从cache中获取值,如果没有则通过给出的Function来加载值
* 如果Function返回的值不为null会被放到缓存中,这个跟后边要讲到的CacheLoad很像
*/
@Nullable
V get(@Nonnull K key, @Nonnull Function<? super K, ? extends V> mappingFunction);
/**
* 按照给定的key返回一个map类型的集合
*/
@Nonnull
Map<K, V> getAllPresent(@Nonnull Iterable<?> keys);
/**
* 存值
*/
void put(@Nonnull K key, @Nonnull V value);
/**
* 批量存放
*/
void putAll(@Nonnull Map<? extends K,? extends V> map);
/**
* 将一个key值从缓存中清除,在方法级别有个@CacheEvict注解,其中有个evict,evict的实现也是调用的invalidate,他们最底层的实现是remove
*/
void invalidate(@Nonnull Object key);
void invalidateAll(@Nonnull Iterable<?> keys);
void invalidateAll();
/**
* 获取当前缓存中的大概存放值,这个数字不一定准确,因为它可能会包含已经过期/失效的值
*/
@Nonnegative
long estimatedSize();
/**
* 当前缓存的一些记录,这块需要自己看下具体值才能了解,下边争取列出来这块
*/
@Nonnull
CacheStats stats();
/**
* 将集合转换为一个ConcurrentMap
*/
@Nonnull
ConcurrentMap<K, V> asMap();
/**
* 清除缓存中一些过期的值
*/
void cleanUp();
/**
* 设定策略,这个后边我尽量也给列出来一块吧(如果记得)
*/
@Nonnull
Policy<K, V> policy();
}
二、业务代码示例参考,可结合业务修改使用
package com.example.demo.dto;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.concurrent.TimeUnit;
/**
* @author lisanwei24282
*/
@Slf4j
public class CacheTest {
public static void main(String[] args) throws InterruptedException {
/**
* 数据内存缓存
*/
Cache<String, String> MEMORY_CACHE = CacheBuilder.newBuilder()
.maximumSize(2)
/* 设置写缓存后5秒钟过期 */
.expireAfterWrite(5, TimeUnit.SECONDS)
/* 设置缓存容器的初始容量为10 */
.initialCapacity(100)
/* 设置要统计缓存的命中率 */
.recordStats()
/* 设置缓存的移除通知 */
.removalListener(notification -> log.info("notification = " + notification.getKey() + "数据缓存was removed, cause is " + notification.getCause()))
.build();
int count = 1000;
for (int i = 0; i < count; i++) {
// TODO 如果缓存中不存在就返回为Null
// TODO [expireAfterWrite]如果设置是此项===》》在指定的时间段内没有更新缓存中数据就会移除,需要重新PUT
// TODO [expireAfterAccess]如果设置是此项===》》在指定的时间段内没有读写缓存中数据就会移除,需要重新PUT
String res = MEMORY_CACHE.getIfPresent("AA");
if (StringUtils.isBlank(res)) {
// TODO 这里是实际使用过程中直接调用DB获取数据放入即可
MEMORY_CACHE.put("AA", "AAA--------------新加入的" + i);
}
log.info("res = " + res);
Thread.sleep(1000);
}
}
}

网友评论