通过Google的Guava基于callback、LoadingCache两种不同方式实现虚拟机内存缓存Cache机制示例demo

一、前言

基于google的guava-19.0.jar开源包基于callback的形式、LoadingCache的形式两种不同的方式实现基于java虚拟机的内存缓存机制(有效生命周期控制expireAfterWrite),主要涉及com.google.common.cache.Cache、com.google.common.cache.CacheBuilder、com.google.common.base.Optional、java.util.concurrent.Callable、com.google.common.cache.CacheLoader、com.google.common.cache.RemovalListener等相关类使用,具体使用示例如下所示。

二、示例说明

1.基于callback的形式实现缓存demo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

package test;

 

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.Callable;

import java.util.concurrent.ConcurrentMap;

import java.util.concurrent.TimeUnit;

 

import com.google.common.base.Optional;

import com.google.common.cache.Cache;

import com.google.common.cache.CacheBuilder;

 

public class GuavaCallbackCacheTest {

     

    private static  Cache<String, Optional<String>> cache = CacheBuilder.newBuilder()

    //.refreshAfterWrite(1, TimeUnit.HOURS)   //写入一小时后自动刷新

    //.expireAfterAccess(1, TimeUnit.HOURS)// 最后一次访问之后多少时间后移除,即失效

      .expireAfterWrite(5, TimeUnit.MINUTES) //最后一次写入之后多少时间后移除,即失效

    .maximumSize(1000)   //最大缓存记录数

    .build();

     

     

     

    private static  Optional<String>   get(String key) throws Exception{

        Optional<String> data = Optional.fromNullable(null);

        data = cache.get(key,  new Callable<Optional<String>>() {

            @Override

            public Optional<String> call() throws Exception {

                List<String> datas=new ArrayList<String>();

                datas.add("data1111");

                datas.add("data2222");

                System.out.println(Thread.currentThread().getName()+"_未经过缓存获取数据!!!!");

                return Optional.fromNullable(datas.get(0));

            }

        });

        return data;

    }

     

    /**

     * 清空缓存内数据

     * 操作基础数据时,清除重新查询

     */

    public static void clearAll(){

        //全部清除缓存

        cache.invalidateAll();

    }

     

    /**

     * 查看缓存中内容

     */

    public static ConcurrentMap<String, Optional<String>> viewCache(){

        //查看内容

        return cache.asMap();

    }

     

    public static void main(String[] args) throws Exception {

        System.out.println(Thread.currentThread().getName()+"_cache get_1:"+get("t1").orNull());

        System.out.println(Thread.currentThread().getName()+"_cache get_2:"+get("t1").orNull());

        clearAll();

        System.out.println(Thread.currentThread().getName()+"_cache get_3:"+get("t1").orNull());

        System.out.println(Thread.currentThread().getName()+"_cache get_4:"+get("t1").orNull());

         

        System.out.println(Thread.currentThread().getName()+"caches_map:"+viewCache());

    }

 

}

控制台结果(第一次get_1、get_1无缓存获取,get_2、get_4通过缓存获取)

1

2

3

4

5

6

7

main_未经过缓存获取数据!!!!

main_cache get_1:data1111

main_cache get_2:data1111

main_未经过缓存获取数据!!!!

main_cache get_3:data1111

main_cache get_4:data1111

maincaches_map:{t1=Optional.of(data1111)}

2.基于LoadingCache的形式实现缓存

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

package test;

 

import java.util.concurrent.ConcurrentMap;

import java.util.concurrent.TimeUnit;

 

import com.google.common.cache.CacheBuilder;

import com.google.common.cache.CacheLoader;

import com.google.common.cache.LoadingCache;

import com.google.common.cache.RemovalListener;

import com.google.common.cache.RemovalNotification;

 

public class GuavaLoadingCacheTest {

     

    private  static  LoadingCache<String, String> cache = CacheBuilder.newBuilder()

    //设置大小,条目数

    .maximumSize(20)

    //设置失效时间,创建时间

    .expireAfterWrite(20, TimeUnit.SECONDS)

    //设置时效时间,最后一次被访问

    .expireAfterAccess(20, TimeUnit.HOURS)

    //移除缓存的监听器

    .removalListener(new RemovalListener<String, String>() {

        public void onRemoval(RemovalNotification<String, String> notification) {

            System.out.println("有缓存数据被移除了");

        }})

    //缓存构建的回调

    .build(new CacheLoader<String, String>(){//加载缓存

        @Override

        public String load(String key) throws Exception {

            System.out.println("缓存中...");

            return "xwood"+"_"+key;

        }

});

     

    public static void get(String name) throws Exception{

        System.out.println(cache.get(name));

//        cache.invalidateAll();

    }

     

    /**

     * 清空缓存内数据

     * 操作基础数据时,清除重新查询

     */

    public static void clearAll(){

        //全部清除缓存

        cache.invalidateAll();

    }

     

    /**

     * 查看缓存中内容

     */

    public static ConcurrentMap<String, String> viewCache(){

        //查看内容

        return cache.asMap();

    }

     

    public static void main(String[] args) throws Exception {

        get("t1");

        get("t1");

        System.out.println(viewCache());

    }

 

}

控制台结果

1

2

3

4

缓存中...

xwood_t1

xwood_t1

{t1=xwood_t1}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值