网站首页 > java教程 正文
缓存分为本地缓存和远端缓存。
常见的远端缓存有Redis,MongoDB;本地缓存一般使用map的方式保存在本地内存中。
一般我们在业务中操作缓存,都会操作缓存和数据源两部分。
如:
put数据时,先插入DB,再删除原来的缓存;
get数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。
如果访问量大,我们还得兼顾本地缓存的线程安全问题。
必要的时候也要考虑缓存的回收策略。
Guava Cache
回收、驱逐、监听、刷新等功能。
缓存回收的时机
关于这点,只需要知道 Guava cache 缓存不会”自动”执行清理和回收工作,也不会在某个缓存项过期后马上清理,也没有诸如此类的清理机制。相反,它会在写操作时顺带做少量的维护工作,或者偶尔在读操作时做——如果写操作实在太少的话。
这样做的原因在于:如果要自动地持续清理缓存,就必须有一个线程,这个线程会和用户操作竞争共享锁。此外,某些环境下线程创建可能受限制,这样 CacheBuilder 就不可用了。
代码展示
@Component
public class CacheLocalConfigService {
private static Logger logger = LoggerFactory.getLogger(CacheLocalConfigService.class);
/** 缓存值的最大数 */
private int maximumSize = 1000;
private Cache<String,Object> cache = null;
public CacheLocalConfigService()
{
super();
}
public int getMaximumSize()
{
return maximumSize;
}
public void setMaximumSize(int maximumSize)
{
this.maximumSize = maximumSize;
}
/**
* 初始化。
*/
@PostConstruct
public void init() {
cache = CacheBuilder.newBuilder()
//基于容量回收
//基于容量的清除:通过 CacheBuilder.maximumSize() 方法设置 Cache 的最大容量数,当缓存数量达到或接近该最大值时,将清除最近最少使用的缓存;
.maximumSize(this.maximumSize)
//并发级别 设置并发级别,并发级别是指可以同时写缓存的线程数
.concurrencyLevel(2)
//设置多久没被访问(读/写)的过期时间 -- expireAfterAccess指定对象多久没有被访问后过期。
.expireAfterAccess(60*10, TimeUnit.SECONDS)
//设置过期时间(写入3秒内过期)在一定时间内没有创建/覆盖时,会移除key,下次从loading中取
.expireAfterWrite(60*10, TimeUnit.SECONDS)
//.removalListener(async)
//设置缓存的移除通知
.removalListener(new RemovalListener<String, Object>() {
@Override
public void onRemoval(RemovalNotification<String, Object> notification) {
logger.error("*********CacheLocalConfigService removalListener****"+notification.getKey() + " was removed, cause is " + notification.getCause());
}
})
.recordStats()
.build();
}
/**
*
* 获取一个缓存,如果该缓存不存在则返回一个null值
* 获取{@linkplain Object}。
* @return 返回{@code null}表示没有缓存
*/
public Object getIfPresent(String key)
{
return this.cache.getIfPresent(key);
}
/**
* 添加至缓存。
* @param key
* @param o
*/
public void put(String key,Object o)
{
this.cache.put(key, o);
}
/**
* 清除指定名称缓存。
* @param key
*/
public void invalidate(String key)
{
this.cache.invalidate(key);
}
public String stats(){
/* hitRate():缓存命中率;
averageLoadPenalty():加载新值的平均时间,单位为纳秒;
evictionCount():缓存项被回收的总数,不包括显式清除。*/
return this.cache.stats().toString();
}
}
猜你喜欢
- 2024-10-25 Caffeine高性能本地缓存框架初探(caffeine缓存原理)
- 2024-10-25 Redis学习3——Redis应用之缓存(redis的缓存的使用方式)
- 2024-10-25 Java高级——缓存的使用场景(java缓存机制)
- 2024-10-25 java中常用的几种缓存类型介绍(java常用缓存技术)
- 2024-10-25 本地缓存之王caffeine#代码(本地缓存 js)
- 2024-10-25 skywalking agent 本地缓存队列参数设置
- 2024-10-25 史上最实用的:分布式缓存方案(分布式缓存设计方案)
- 2024-10-25 使用Guava作为本地缓存让系统飞起来
- 2024-10-25 深究分布式缓存的九个点(分布式缓存技术有哪些)
- 2024-10-25 面试题之java缓存总结,从单机缓存到分布式缓存架构
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)