diff --git a/jetcache/README.md b/jetcache/README.md
new file mode 100644
index 0000000..e9dc1c1
--- /dev/null
+++ b/jetcache/README.md
@@ -0,0 +1,5 @@
+# Spring Boot JetCache
+
+## 概述
+
+Spring Boot JetCache 概述...
\ No newline at end of file
diff --git a/jetcache/pom.xml b/jetcache/pom.xml
new file mode 100644
index 0000000..6036aba
--- /dev/null
+++ b/jetcache/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.6.RELEASE
+
+
+
+ name.guolanren
+ jetcache
+ 1.0.0
+
+
+ 1.8
+ 2.6.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ com.alicp.jetcache
+ jetcache-starter-redis-lettuce
+ ${jetcache.version}
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/jetcache/src/main/java/name/guolanren/JetCacheApplication.java b/jetcache/src/main/java/name/guolanren/JetCacheApplication.java
new file mode 100644
index 0000000..f67ee12
--- /dev/null
+++ b/jetcache/src/main/java/name/guolanren/JetCacheApplication.java
@@ -0,0 +1,70 @@
+package name.guolanren;
+
+import com.alicp.jetcache.anno.config.EnableMethodCache;
+import name.guolanren.model.JetCacheUser;
+import name.guolanren.service.JetCacheService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author guolanren
+ */
+@SpringBootApplication
+@EnableMethodCache(basePackages = "name.guolanren")
+public class JetCacheApplication implements CommandLineRunner {
+
+ private static final Logger logger = LoggerFactory.getLogger(JetCacheApplication.class);
+
+ private long start;
+
+ @Autowired
+ private JetCacheService jetCacheService;
+
+ public static void main(String[] args) {
+ SpringApplication.run(JetCacheApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) throws Exception {
+ logger.info("添加数据");
+ jetCacheService.add(new JetCacheUser(1L, "guolanren"));
+ logger.info("=================================");
+
+ logger.info("第一次查询,缓存结果");
+ start = System.currentTimeMillis();
+ JetCacheUser user = jetCacheService.get(1L);
+ logger.info("use time: {}, data: {}", System.currentTimeMillis() - start, user.toString());
+ logger.info("=================================");
+
+
+ logger.info("缓存命中");
+ start = System.currentTimeMillis();
+ user = jetCacheService.get(1L);
+ logger.info("use time: {}, data: {}", System.currentTimeMillis() - start, user.toString());
+ logger.info("=================================");
+
+ logger.info("更新数据,更新缓存");
+ jetCacheService.update(new JetCacheUser(1L, "guoyaozhan"));
+ logger.info("=================================");
+
+ logger.info("缓存命中");
+ start = System.currentTimeMillis();
+ user = jetCacheService.get(1L);
+ logger.info("use time: {}, data: {}", System.currentTimeMillis() - start, user.toString());
+ logger.info("=================================");
+
+ logger.info("删除数据,删除缓存");
+ jetCacheService.delete(1L);
+ logger.info("=================================");
+
+ logger.info("重新查询");
+ start = System.currentTimeMillis();
+ user = jetCacheService.get(1L);
+ logger.info("use time: {}, data: {}", System.currentTimeMillis() - start, user.toString());
+ }
+
+}
diff --git a/jetcache/src/main/java/name/guolanren/model/JetCacheUser.java b/jetcache/src/main/java/name/guolanren/model/JetCacheUser.java
new file mode 100644
index 0000000..db10335
--- /dev/null
+++ b/jetcache/src/main/java/name/guolanren/model/JetCacheUser.java
@@ -0,0 +1,31 @@
+package name.guolanren.model;
+
+import java.io.Serializable;
+
+/**
+ * @author guolanren
+ */
+public class JetCacheUser implements Serializable {
+
+ private static final long serialVersionUID = 281911666095614238L;
+ private Long id;
+ private String name;
+
+ public JetCacheUser(Long id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("User{");
+ sb.append("id=").append(id);
+ sb.append(", name='").append(name).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/jetcache/src/main/java/name/guolanren/service/JetCacheService.java b/jetcache/src/main/java/name/guolanren/service/JetCacheService.java
new file mode 100644
index 0000000..d555f3b
--- /dev/null
+++ b/jetcache/src/main/java/name/guolanren/service/JetCacheService.java
@@ -0,0 +1,40 @@
+package name.guolanren.service;
+
+import com.alicp.jetcache.anno.CacheInvalidate;
+import com.alicp.jetcache.anno.CacheUpdate;
+import com.alicp.jetcache.anno.Cached;
+import name.guolanren.model.JetCacheUser;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author guolanren
+ */
+@Service
+public class JetCacheService {
+
+ private ConcurrentHashMap store = new ConcurrentHashMap<>();
+
+ public void add(JetCacheUser user) {
+ store.put(user.getId(), user);
+ }
+
+ @Cached(name = "CacheService.get:", key = "#id", expire = 3600)
+ public JetCacheUser get(Long id) throws InterruptedException {
+ TimeUnit.SECONDS.sleep(10);
+ return store.getOrDefault(id, new JetCacheUser(0L, "none"));
+ }
+
+ @CacheUpdate(name = "CacheService.get:", key = "#user.id", value = "#result")
+ public JetCacheUser update(JetCacheUser user) {
+ store.put(user.getId(), user);
+ return user;
+ }
+
+ @CacheInvalidate(name = "CacheService.get:", key="#id")
+ public void delete(Long id) {
+ store.remove(id);
+ }
+}
diff --git a/jetcache/src/main/resources/config/application.yml b/jetcache/src/main/resources/config/application.yml
new file mode 100644
index 0000000..fa2e68a
--- /dev/null
+++ b/jetcache/src/main/resources/config/application.yml
@@ -0,0 +1,21 @@
+jetcache:
+ statIntervalMinutes: 15
+ areaInCacheName: false
+ local:
+ default:
+ type: linkedhashmap
+ keyConvertor: fastjson
+ remote:
+ default:
+ type: redis.lettuce
+ keyConvertor: fastjson
+ valueEncoder: java
+ valueDecoder: java
+ readFrom: slavePreferred
+ uri:
+ - redis://127.0.0.1:6379
+ poolConfig:
+ minIdle: 5
+ maxIdle: 20
+ maxTotal: 50
+ keyPrefix: 'jetcache:'
\ No newline at end of file