【本地缓存】

【本地缓存】

先来看几个问题

  • 本地缓存会被垃圾回收器回收吗?
  • 本地缓存会造成服务器内存告急吗?
	缓存并不陌生,最常用的缓存服务器当属redis。那么特殊环境下用不了redis时怎么办呢?
	那只能用本地缓存了。别忘了利用jvm虚拟机的内存呀。

定义一个缓存场景

  • 假设一个热点数据的场景,南京老门东前一天的人流量及区域分布
    /**
     * 本地缓存,用来缓存热点数据
     */
    private static final Map<String, String> HEAT_DATA = Maps.newHashMap();

    public static void main(String[] args) {
        // 人流量
        HEAT_DATA.put("num", "5000");
        // A区域人数
        HEAT_DATA.put("A", "2500");
        // B区域人数
        HEAT_DATA.put("B", "2500");

        System.out.println(HEAT_DATA);
    }
  • 上面是最基本的方式,利用全局变量Map的形式,这种方式的弊端就是如果KEY不确定的话容易造成垃圾数据,从而侵占内存,最终导致OOM;但如果KEY是确定的,这种方式也是可取的
 public static void main(String[] args) throws ExecutionException {

        LoadingCache<String, String> graphs = CacheBuilder.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(
                        new CacheLoader<String, String>() {
                            @Override
                            public String load(String key) {
                                return createExpensiveGraph(key);
                            }
                            // 默认缓存击穿时返回
                            private String createExpensiveGraph(String key) {

                                return "不存在的缓存key: ".concat(key);
                            }
                        });

        graphs.put("num", "5000");
        graphs.put("A", "2500");
        graphs.put("B", "2500");

        String num = graphs.get("num");
        String A = graphs.get("A");
        String B = graphs.get("B");
        System.out.println(num);
        System.out.println(A);
        System.out.println(B);
    }
  • 上面是利用guava库的缓存,好处是可以定义最大缓存数量和缓存过期时间。
  • 再回顾下最开始说的问题,本地缓存会被回收吗?答案是否定的,定义了缓存那么一定会有方法来访问它,我们说的垃圾回收机制算法一个是可达性分析法,一个是引用计数法,既然有方法访问它,那么我想它一定满足上面说的两种算法。那么本地缓存会造成服务器内存告急吗?我想除非大量的存较大的对象,一般来说是不会的,当然了,还要看具体的情况,比如给定jvm虚拟机内存大小还有缓存中到底存多少对象,这个是要实际测试的,不是嘴上说说就能知道的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值