好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

EVCache缓存在Spring Boot中的实战示例

概 述

evcache 是 netflix开源的分布式 缓存 系统,基于 memcached缓存和 spymemcached客户端实现,其用在了大名鼎鼎的 aws亚马逊云上,并且为云计算做了优化,提供高效的缓存服务。

本文利用 memcached作为后端缓存实例服务器,并结合 spring boot,来实践一下 evcache客户端的具体使用。

编译 evcache

第一步:clone

?

1

git clone git @github 测试数据:netflix/evcache.git

第二步:编译构建

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

./gradlew build

downloading https: //services.gradle.org/distributions/gradle-2.10-bin.zip

.................................................................................................................................

 

...

 

:evcache-client:check

:evcache-client:build

:evcache-client-sample:writelicenseheader

:evcache-client-sample:licensemain

missing header in: evcache-client-sample/src/main/java/com/netflix/evcache/sample/evcacheclientsample.java

:evcache-client-sample:licensetest up-to-date

:evcache-client-sample:license

:evcache-client-sample:compiletestjava up-to-date

:evcache-client-sample:processtestresources up-to-date

:evcache-client-sample:testclasses up-to-date

:evcache-client-sample:test up-to-date

:evcache-client-sample:check

:evcache-client-sample:build

 

build successful

 

total time: 22.866 secs

第三步:得到构建生成物

同时 ~/evcache/evcache-client/build/reports 目录下会生成相应构建报告:

接下来我们结合 spring工程,来实战一下 evcache client的具体使用。

环境准备 / 工程搭建

首先准备好两台 memcached实例:

192.168.199.77:11211 192.168.199.78:11211

接下来搭建一个springboot工程,过程不再赘述,需要注意的一点是 pom中需加入 evcache的依赖支持

?

1

2

3

4

5

<dependency>

   <groupid>com.netflix.evcache</groupid>

   <artifactid>evcache-client</artifactid>

   <version> 4.137 . 0 -snapshot</version>

</dependency>

注:我将 spring工程设置在 8899端口启动

evcache client导入

编写 evcache client包装类

?

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

public class evcacheclient {

 

   private final evcache evcache;  // 关键角色在此

 

   public evcacheclient() {

     string deploymentdescriptor = system.getenv( "evc_sample_deployment" );

     if ( deploymentdescriptor == null ) {

       deploymentdescriptor = "servergroup1=192.168.199.77:11211;servergroup2=192.168.199.78:11211" ;

     }

     system.setproperty( "evcache_app1.use.simple.node.list.provider" , "true" );

     system.setproperty( "evcache_app1-nodes" , deploymentdescriptor);

     evcache = new evcache.builder().setappname( "evcache_app1" ).build();

   }

 

   public void setkey(string key, string value, int timetolive) throws exception {

     try {

       future< boolean >[] _future = evcache.set(key, value, timetolive);

       for (future< boolean > f : _future) {

         boolean didsucceed = f.get();

         // system.out.println("per-shard set success code for key " + key + " is " + didsucceed);

         // 此处可以针对 didsucceed做相应判断

       }

       system.out.println( "finished setting key " + key);

     } catch (evcacheexception e) {

       e.printstacktrace();

     }

   }

 

   public string getkey(string key) {

     try {

       string _response = evcache.<string>get(key);

       return _response;

     } catch (exception e) {

       e.printstacktrace();

       return null ;

     }

   }

 

}

很明显上述类主要提供了两个关键工具函数: setkey 和 getkey

evcache config 配置导入

我们将 evcacheclient 注入到spring容器中

?

1

2

3

4

5

6

7

8

9

@configuration

public class evcacheconfig {

 

   @bean

   public evcacheclient evcacheclient() {

     evcacheclient evcacheclient = new evcacheclient();

     return evcacheclient;

   }

}

编写 evcache service

上面几步完成之后,service的编写自然顺理成章,仅仅是一层封装而已

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@service

public class evcacheservice {

 

   @autowired

   private evcacheclient evcacheclient;

 

   public void setkey( string key, string value, int timetolive ) {

     try {

       evcacheclient.setkey( key, value, timetolive );

     } catch (exception e) {

       e.printstacktrace();

     }

   }

 

   public string getkey( string key ) {

     return evcacheclient.getkey( key );

   }

}

编写测试 controller

我们编写一个方便用于测试的控制器,里面进行一系列对于缓存的 set 和 get ,从而便于观察实验结果

?

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

@restcontroller

public class evcachetestcontroller {

 

   @autowired

   private evcacheservice evcacheservice;

 

   @getmapping ( "/testevcache" )

   public void testevcache() {

 

     try {

 

       for ( int i = 0 ; i < 10 ; i++ ) {

         string key = "key_" + i;

         string value = "data_" + i;

         int ttl = 180 ;      // 此处将缓存设为三分钟(180s)生存期,时间一过,缓存即会失效

         evcacheservice.setkey(key, value, ttl);

       }

 

       for ( int i = 0 ; i < 10 ; i++) {

         string key = "key_" + i;

         string value = evcacheservice.getkey(key);

         system.out.println( "get of " + key + " returned " + value);

       }

      

     } catch (exception e) {

       e.printstacktrace();

     }

 

   }

}

实验验证

工程启动后,我们调用 rest接口: localhost:8899/testevcache ,观察控制台中对于 key_0 到 key_9 等十个缓存 key的操作细节如下:

在 memcached集群中插入十条数据: key_0 到 key_9

注意此处是向每个后端 memcached缓存实例中都写入了 10条测试数据

从后端 memcached集群中读取刚插入的 10条数据

为了验证数据确实写入到后端 memcached,我们可以 telnet到后端 memcached中进行一一验证

而且这些数据的有效时间仅3分钟,3分钟后再次验证会发现数据已过期

?

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

[root @localhost ~]# telnet 127.0 . 0.1 11211

trying 127.0 . 0.1 ...

connected to 127.0 . 0.1 .

escape character is '^]' .

get key_0

value key_0 0 6

data_0

end

get key_1

value key_1 0 6

data_1

end

get key_2   

value key_2 0 6

data_2

end

get key_3

value key_3 0 6

data_3

end

get key_4

value key_4 0 6

data_4

end

get key_5

value key_5 0 6

data_5

end

get key_6

value key_6 0 6

data_6

end

get key_7

value key_7 0 6

data_7

end

get key_8

value key_8 0 6

data_8

end

get key_9

value key_9 0 6

data_9

end

本文扩展

当然本文所演示的 evcache配合 memcached使用时,memcached被硬编码进代码,实际过程中使用,可以将其与 zk等服务发现服务进行一个结合,实现灵活运用,这就不在本文进行赘述。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://segmentfault测试数据/a/1190000017242987

查看更多关于EVCache缓存在Spring Boot中的实战示例的详细内容...

  阅读:9次