Java本地缓存

本文介绍了Java内存缓存的概念,解释了为何使用缓存以提升性能和减轻数据库压力。重点讨论了Guava Cache,它是Google Guava库中的一个内存缓存解决方案,适合在单机环境中存储常用数据,以实现快速访问。Guava Cache适用于预期会被多次查询的键,并且内存占用在可接受范围内的场景。
摘要由CSDN通过智能技术生成

Java内存缓存

什么是缓存

  1. 在计算中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存位置快。通过缓存,您可以高效地重用之前检索或计算的数据。

为什么要用缓存

  1. 提升应用程序的性能。
  2. 降低数据库成本。
  3. 减少后端负载。
  4. 可预测的性能。
  5. 消除数据库热点。
  6. 提高读取吞吐量(IOPS)。

Java内存缓存

  1. 在Java应用中,对于访问频次高,更新少的数据,通常的方案是将这类数据加入缓存中。相对于从数据库中读取来说,读缓存效率会有很大提升。

  2. 在集群环境下,常用的分布式缓存有Redis,Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存。

  3. 自己实现一个小缓存。

    public class MapCacheDemo {
         
    
        // 我使用了  ConcurrentHashMap,线程安全的要求。
        //我使用SoftReference <Object>  作为映射值,因为软引用可以保证在抛出OutOfMemory之前,如果缺少内存,将删除引用的对象。
        //在构造函数中,我创建了一个守护程序线程,每5秒扫描一次并清理过期的对象。
        private static final int CLEAN_UP_PERIOD_IN_SEC = 5;
    
        private final ConcurrentHashMap<String, SoftReference<CacheObject>> cache = new ConcurrentHashMap<>();
    
        public MapCacheDemo() {
         
            Thread cleanerThread = new Thread(() -> {
         
                while (!Thread.currentThread().isInterrupted()) {
         
                    try {
         
                        Thread.sleep(CLEAN_UP_PERIOD_IN_SEC * 1000);
                        cache.entrySet().removeIf(entry -> Optional.ofNullable(entry.getValue()).map(SoftReference::get).map(CacheObject::isExpired).orElse(false));
                    } catch (InterruptedException e) {
         
                        Thread.currentThread()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值