Welcome everyone

本地缓存 guava cache

java 汪明鑫 915浏览 0评论

说到缓存我们第一个想到的就是redis

缓存架构在软件世界里很常见,redis,memcached,local cache,mybatis缓存,spring 缓存,JMM,电脑缓存,各种缓存置换算法等等。。。

 

多级缓存架构,单一的redis存储已经不足以支持高并发的访问,我们还需要memcached支撑大并发的读请求,需要local cache解决热点数据的访问

本篇我们主要简单介绍本地缓存的使用  以guava的LoadingCache为例

 

maven依赖:

<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>21.0</version>
</dependency>
package pers.wmx.springbootfreemarkerdemo.cache;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
 * @author: wangmingxin03
 * @date: 2020-06-08
 */
public class CacheTest {
    private static LoadingCache<Long, String> cache;


    /**
     * expireAfterWrite  是在指定项在一定时间内没有创建/覆盖时,会移除该key,下次取的时候从loading中取
     * expireAfterAccess 是指定项在一定时间内没有读写,会移除该key,下次取的时候从loading中取
     * refreshAfterWrite 是在指定时间内没有被创建/覆盖,则指定时间过后,
     *                   再次访问时,会去刷新该缓存,在新值没有到来之前,始终返回旧值
     **/
    public static void main(String[] args) throws ExecutionException {
        cache = CacheBuilder.newBuilder()
                .refreshAfterWrite(1, TimeUnit.SECONDS)
                .build(new CacheLoader<Long, String>() {
                    @Override
                    public String load(Long key) throws Exception {
                        return mockValue(key);
                    }
                });

        System.out.println(cache.get(666l));

        System.out.println(cache.get(666l));

        System.out.println(cache.get(555l));

//        loading...
//        666 xinye
//        666 xinye   第二次读取 不loading直接
//        loading...
//        555 xinye


    }

    private static String mockValue(Long key) {
        System.out.println("loading...");

        //  现实load 是读db 读redis/memcached
        //  多级缓存架构 local cache 解决热点数据问题
        return key + " xinye";
    }

}

 

就这么简单,可以在redis之上再做一层缓存解决热点数据问题

本地缓存比较珍贵,并不是什么数据的访问都需要,只有访问特别频繁的数据,使redis/memcached已经出现性能瓶颈的热点数据才会使用本地缓存

打比方英雄联盟峡谷之巅top10, 很多游戏玩家都会访问,就可以在榜单zset之上整个本地缓存

 

 

 

转载请注明:汪明鑫的个人博客 » 本地缓存 guava cache

喜欢 (1)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz