diff --git a/README.md b/README.md
index 91630b3..f22ff71 100644
--- a/README.md
+++ b/README.md
@@ -31,8 +31,8 @@ spring-cloud:Finchley.SR2
| [spring-jdbc](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc)
[spring-jdbc-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc-annotation) | spring jdbc-template 的使用 | [Using JdbcTemplat](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate) |
| [spring-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis)
[spring-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis-annotation) | spring 整合 mybatis | [mybatis-spring中文文档](http://www.mybatis.org/spring/zh/index.html) |
| [spring-druid-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis)
[spring-druid-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis-annotation) | spring 整合druid、mybatis | [alibaba druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) |
-| spring-redis
spring-redis-annotation | spring 整合 redis | |
-| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | |
+| spring-redis
spring-redis-annotation | spring 整合 redis | [redisson中文文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) |
+| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | [Xmemcached中文文档](https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97) |
| spring-memcached
spring-memcached-annotation | spring 整合 memcached | |
| spring-rabbitmq
spring-rabbitmq-annotation | spring 整合 rabbitmq | |
| spring-kafka
spring-kafka-annotation | spring 整合 kafka | |
diff --git a/spring/spring-memcached-annotation/pom.xml b/spring/spring-memcached-annotation/pom.xml
new file mode 100644
index 0000000..42118b5
--- /dev/null
+++ b/spring/spring-memcached-annotation/pom.xml
@@ -0,0 +1,79 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-memcached-annotation
+ 1.0-SNAPSHOT
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ com.googlecode.xmemcached
+ xmemcached
+ 2.4.5
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-memcached-annotation/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-memcached-annotation/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..3cc23e4
--- /dev/null
+++ b/spring/spring-memcached-annotation/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,26 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer implements Serializable {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-memcached-annotation/src/main/java/com/heibaiying/config/MemcacheConfig.java b/spring/spring-memcached-annotation/src/main/java/com/heibaiying/config/MemcacheConfig.java
new file mode 100644
index 0000000..00b6fd0
--- /dev/null
+++ b/spring/spring-memcached-annotation/src/main/java/com/heibaiying/config/MemcacheConfig.java
@@ -0,0 +1,67 @@
+package com.heibaiying.config;
+
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.XMemcachedClientBuilder;
+import net.rubyeye.xmemcached.command.TextCommandFactory;
+import net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator;
+import net.rubyeye.xmemcached.transcoders.SerializingTranscoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author : heibaiying
+ */
+@Configuration
+public class MemcacheConfig {
+
+ /*
+ * Memcached 单机版本简单配置
+ */
+ @Bean
+ public MemcachedClient memcachedClient() {
+ XMemcachedClientBuilder builder = new XMemcachedClientBuilder("192.168.200.201:11211");
+ MemcachedClient memcachedClient = null;
+ try {
+ memcachedClient = builder.build();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return memcachedClient;
+ }
+
+ /*
+ * Memcached 集群版本配置
+ */
+ @Bean
+ public MemcachedClient memcachedClientForCluster() {
+
+ List addressList = new ArrayList();
+ addressList.add(new InetSocketAddress("192.168.200.201", 11211));
+ addressList.add(new InetSocketAddress("192.168.200.201", 11212));
+ // 赋予权重
+ int[] weights = {1, 2};
+ XMemcachedClientBuilder builder = new XMemcachedClientBuilder(addressList, weights);
+ // 设置连接池大小
+ builder.setConnectionPoolSize(10);
+ // 协议工厂
+ builder.setCommandFactory(new TextCommandFactory());
+ // 分布策略,一致性哈希KetamaMemcachedSessionLocator或者ArraySessionLocator(默认)
+ builder.setSessionLocator(new KetamaMemcachedSessionLocator());
+ // 设置序列化器
+ builder.setTranscoder(new SerializingTranscoder());
+ MemcachedClient memcachedClient = null;
+ try {
+ memcachedClient = builder.build();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return memcachedClient;
+ }
+
+
+}
\ No newline at end of file
diff --git a/spring/spring-memcached-annotation/src/test/java/memcached/MemObjectSamples.java b/spring/spring-memcached-annotation/src/test/java/memcached/MemObjectSamples.java
new file mode 100644
index 0000000..be54e51
--- /dev/null
+++ b/spring/spring-memcached-annotation/src/test/java/memcached/MemObjectSamples.java
@@ -0,0 +1,37 @@
+package memcached;
+
+import com.heibaiying.bean.Programmer;
+import com.heibaiying.config.MemcacheConfig;
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.exception.MemcachedException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Date;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author : heibaiying
+ * @description :Memcached 序列化与反序列化
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = {MemcacheConfig.class})
+public class MemObjectSamples {
+
+ @Autowired
+ private MemcachedClient memcachedClient;
+
+ @Test
+ public void operate() throws InterruptedException, MemcachedException, TimeoutException {
+ memcachedClient.set("programmer", 0, new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ Programmer programmer = memcachedClient.get("programmer");
+ System.out.println("hello ," + programmer.getName());
+ memcachedClient.delete("programmer");
+ programmer = memcachedClient.get("programmer");
+ Assert.assertNull(programmer);
+ }
+}
diff --git a/spring/spring-memcached-annotation/src/test/java/memcached/MemSamples.java b/spring/spring-memcached-annotation/src/test/java/memcached/MemSamples.java
new file mode 100644
index 0000000..691c916
--- /dev/null
+++ b/spring/spring-memcached-annotation/src/test/java/memcached/MemSamples.java
@@ -0,0 +1,34 @@
+package memcached;
+
+import com.heibaiying.config.MemcacheConfig;
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.exception.MemcachedException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author : heibaiying
+ * @description : Memcached 操作基本对象
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = {MemcacheConfig.class})
+public class MemSamples {
+
+ @Autowired
+ private MemcachedClient memcachedClient;
+
+ @Test
+ public void operate() throws InterruptedException, MemcachedException, TimeoutException {
+ memcachedClient.set("hello", 0, "Hello,cluster xmemcached");
+ String value = memcachedClient.get("hello");
+ System.out.println("hello=" + value);
+ memcachedClient.delete("hello");
+ value = memcachedClient.get("hello");
+ System.out.println("hello=" + value);
+ }
+}
diff --git a/spring/spring-memcached/pom.xml b/spring/spring-memcached/pom.xml
new file mode 100644
index 0000000..14dcba4
--- /dev/null
+++ b/spring/spring-memcached/pom.xml
@@ -0,0 +1,79 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-memcached
+ 1.0-SNAPSHOT
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ com.googlecode.xmemcached
+ xmemcached
+ 2.4.5
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-memcached/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-memcached/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..3cc23e4
--- /dev/null
+++ b/spring/spring-memcached/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,26 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer implements Serializable {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-memcached/src/main/resources/memcached/clusterConfig.xml b/spring/spring-memcached/src/main/resources/memcached/clusterConfig.xml
new file mode 100644
index 0000000..5a29ad3
--- /dev/null
+++ b/spring/spring-memcached/src/main/resources/memcached/clusterConfig.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-memcached/src/main/resources/memcached/singleConfig.xml b/spring/spring-memcached/src/main/resources/memcached/singleConfig.xml
new file mode 100644
index 0000000..854709f
--- /dev/null
+++ b/spring/spring-memcached/src/main/resources/memcached/singleConfig.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-memcached/src/main/resources/springApplication.xml b/spring/spring-memcached/src/main/resources/springApplication.xml
new file mode 100644
index 0000000..9759cca
--- /dev/null
+++ b/spring/spring-memcached/src/main/resources/springApplication.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemObjectSamples.java b/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemObjectSamples.java
new file mode 100644
index 0000000..5f6e033
--- /dev/null
+++ b/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemObjectSamples.java
@@ -0,0 +1,36 @@
+package com.heibaiying.memcached;
+
+import com.heibaiying.bean.Programmer;
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.exception.MemcachedException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Date;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author : heibaiying
+ * @description :Memcached 序列化与反序列化
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class MemObjectSamples {
+
+ @Autowired
+ private MemcachedClient memcachedClient;
+
+ @Test
+ public void operate() throws InterruptedException, MemcachedException, TimeoutException {
+ memcachedClient.set("programmer", 0, new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ Programmer programmer = memcachedClient.get("programmer");
+ System.out.println("hello ," + programmer.getName());
+ memcachedClient.delete("programmer");
+ programmer = memcachedClient.get("programmer");
+ Assert.assertNull(programmer);
+ }
+}
diff --git a/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemSamples.java b/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemSamples.java
new file mode 100644
index 0000000..6a26236
--- /dev/null
+++ b/spring/spring-memcached/src/test/java/com/heibaiying/memcached/MemSamples.java
@@ -0,0 +1,33 @@
+package com.heibaiying.memcached;
+
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.exception.MemcachedException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * @author : heibaiying
+ * @description : Memcached 操作基本对象
+ */
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class MemSamples {
+
+ @Autowired
+ private MemcachedClient memcachedClient;
+
+ @Test
+ public void operate() throws InterruptedException, MemcachedException, TimeoutException {
+ memcachedClient.set("hello", 0, "Hello,cluster xmemcached");
+ String value = memcachedClient.get("hello");
+ System.out.println("hello=" + value);
+ memcachedClient.delete("hello");
+ value = memcachedClient.get("hello");
+ System.out.println("hello=" + value);
+ }
+}
diff --git a/spring/spring-redis-annotation/pom.xml b/spring/spring-redis-annotation/pom.xml
new file mode 100644
index 0000000..0f5e167
--- /dev/null
+++ b/spring/spring-redis-annotation/pom.xml
@@ -0,0 +1,90 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-redis-annotation
+ 1.0-SNAPSHOT
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ redis.clients
+ jedis
+ 3.0.0
+
+
+ org.redisson
+ redisson
+ 3.9.1
+
+
+
+ io.netty
+ netty-all
+ 4.1.32.Final
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..5cff5ab
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,25 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/RedisProperty.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/RedisProperty.java
new file mode 100644
index 0000000..54effa8
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/RedisProperty.java
@@ -0,0 +1,33 @@
+package com.heibaiying.config;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+
+@Configuration
+@PropertySource(value = "classpath:jedis.properties")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class RedisProperty {
+
+ @Value("${redis.host}")
+ private String host;
+ @Value("${redis.port}")
+ private int port;
+ @Value("${redis.timeout}")
+ private int timeout;
+ @Value("${redis.maxIdle}")
+ private int maxIdle;
+ @Value("${redis.maxTotal}")
+ private int maxTotal;
+}
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/ClusterJedisConfig.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/ClusterJedisConfig.java
new file mode 100644
index 0000000..4aa8af8
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/ClusterJedisConfig.java
@@ -0,0 +1,32 @@
+package com.heibaiying.config.jedis;
+
+import com.heibaiying.config.RedisProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import redis.clients.jedis.HostAndPort;
+import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.JedisPoolConfig;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author : heibaiying
+ * @description : Jedis 集群配置
+ */
+@Configuration
+@ComponentScan(value = "com.heibaiying.*")
+public class ClusterJedisConfig {
+
+ @Bean
+ public JedisCluster jedisCluster(RedisProperty property) {
+ JedisPoolConfig poolConfig = new JedisPoolConfig();
+ poolConfig.setMaxIdle(property.getMaxIdle());
+ poolConfig.setMaxTotal(property.getMaxTotal());
+ Set nodes = new HashSet();
+ nodes.add(new HostAndPort("127.0.0.1", 6379));
+ nodes.add(new HostAndPort("127.0.0.1", 6380));
+ return new JedisCluster(nodes, 2000);
+ }
+}
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/SingleJedisConfig.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/SingleJedisConfig.java
new file mode 100644
index 0000000..7d43af4
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/jedis/SingleJedisConfig.java
@@ -0,0 +1,35 @@
+package com.heibaiying.config.jedis;
+
+import com.heibaiying.config.RedisProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+
+import static org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE;
+
+/**
+ * @author : heibaiying
+ * @description : Jedis 单机配置
+ */
+@Configuration
+@ComponentScan(value = "com.heibaiying.*")
+public class SingleJedisConfig {
+
+ @Bean
+ public JedisPool jedisPool(RedisProperty property) {
+ JedisPoolConfig poolConfig = new JedisPoolConfig();
+ poolConfig.setMaxIdle(property.getMaxIdle());
+ poolConfig.setMaxTotal(property.getMaxTotal());
+ return new JedisPool(poolConfig, property.getHost(), property.getPort(), property.getTimeout());
+ }
+
+ @Bean(destroyMethod = "close")
+ @Scope(value = SCOPE_PROTOTYPE)
+ public Jedis jedis(JedisPool jedisPool) {
+ return jedisPool.getResource();
+ }
+}
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/ClusterRedissonConfig.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/ClusterRedissonConfig.java
new file mode 100644
index 0000000..88039b5
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/ClusterRedissonConfig.java
@@ -0,0 +1,26 @@
+package com.heibaiying.config.redisson;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author : heibaiying
+ * @description : redisson 集群配置
+ */
+@Configuration
+public class ClusterRedissonConfig {
+
+ //@Bean
+ public RedissonClient redissonClient() {
+ Config config = new Config();
+ config.useClusterServers()
+ .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒
+ //可以用"rediss://"来启用SSL连接
+ .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380")
+ .addNodeAddress("redis://127.0.0.1:6381");
+ return Redisson.create(config);
+ }
+
+}
diff --git a/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/SingalRedissonConfig.java b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/SingalRedissonConfig.java
new file mode 100644
index 0000000..401072e
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/java/com/heibaiying/config/redisson/SingalRedissonConfig.java
@@ -0,0 +1,25 @@
+package com.heibaiying.config.redisson;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.redisson.config.TransportMode;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author : heibaiying
+ * @description : redisson 单机配置
+ */
+@Configuration
+public class SingalRedissonConfig {
+
+ @Bean
+ public RedissonClient redissonClient() {
+ Config config = new Config();
+ config.setTransportMode(TransportMode.NIO);
+ config.useSingleServer().setAddress("redis://127.0.0.1:6379");
+ return Redisson.create(config);
+ }
+
+}
diff --git a/spring/spring-redis-annotation/src/main/resources/jedis.properties b/spring/spring-redis-annotation/src/main/resources/jedis.properties
new file mode 100644
index 0000000..f25cf51
--- /dev/null
+++ b/spring/spring-redis-annotation/src/main/resources/jedis.properties
@@ -0,0 +1,5 @@
+redis.host=127.0.0.1
+redis.port=6379
+redis.timeout=2000
+redis.maxIdle=8
+redis.maxTotal=16
\ No newline at end of file
diff --git a/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisClusterSamples.java b/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisClusterSamples.java
new file mode 100644
index 0000000..a2782a1
--- /dev/null
+++ b/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisClusterSamples.java
@@ -0,0 +1,42 @@
+package heibaiying.jedis;
+
+import com.heibaiying.config.jedis.ClusterJedisConfig;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import redis.clients.jedis.JedisCluster;
+
+/**
+ * @author : heibaiying
+ * @description :redis 集群测试
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = ClusterJedisConfig.class)
+public class JedisClusterSamples {
+
+ @Autowired
+ private JedisCluster jedisCluster;
+
+ @Test
+ public void Set() {
+ jedisCluster.set("hello", "spring");
+ }
+
+ @Test
+ public void Get() {
+ String s = jedisCluster.get("hello");
+ System.out.println(s);
+ }
+
+ @Test
+ public void setEx() {
+ String s = jedisCluster.setex("spring", 10, "我会在10秒后过期");
+ System.out.println(s);
+ }
+
+
+}
diff --git a/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisSamples.java b/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisSamples.java
new file mode 100644
index 0000000..53f265e
--- /dev/null
+++ b/spring/spring-redis-annotation/src/test/java/heibaiying/jedis/JedisSamples.java
@@ -0,0 +1,41 @@
+package heibaiying.jedis;
+
+import com.heibaiying.config.jedis.SingleJedisConfig;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import redis.clients.jedis.Jedis;
+
+/**
+ * @author : heibaiying
+ * @description :redis 单机版测试
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = SingleJedisConfig.class)
+public class JedisSamples {
+
+ @Autowired
+ private Jedis jedis;
+
+ @Test
+ public void Set() {
+ jedis.set("hello", "spring annotation");
+ }
+
+ @Test
+ public void Get() {
+ String s = jedis.get("hello");
+ System.out.println(s);
+ }
+
+ @Test
+ public void setEx() {
+ String s = jedis.setex("spring", 10, "我会在10秒后过期");
+ System.out.println(s);
+ }
+
+}
diff --git a/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonObjectSamples.java b/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonObjectSamples.java
new file mode 100644
index 0000000..e2d082a
--- /dev/null
+++ b/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonObjectSamples.java
@@ -0,0 +1,50 @@
+package heibaiying.redisson;
+
+import com.heibaiying.bean.Programmer;
+import com.heibaiying.config.jedis.ClusterJedisConfig;
+import com.heibaiying.config.redisson.SingalRedissonConfig;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :redisson 对象序列化与反序列化
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = SingalRedissonConfig.class)
+public class RedissonObjectSamples {
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ // Redisson的对象编码类是用于将对象进行序列化和反序列化 默认采用Jackson
+
+ @Test
+ public void Set() {
+ RBucket rBucket = redissonClient.getBucket("programmer");
+ rBucket.set(new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ redissonClient.shutdown();
+ //存储结果: {"@class":"com.heibaiying.com.heibaiying.bean.Programmer","age":12,"birthday":["java.util.Date",1545714986590],"name":"xiaoming","salary":5000.21}
+ }
+
+ @Test
+ public void Get() {
+ RBucket rBucket = redissonClient.getBucket("programmer");
+ System.out.println(rBucket.get());
+ }
+
+ @After
+ public void close() {
+ redissonClient.shutdown();
+ }
+}
diff --git a/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonSamples.java b/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonSamples.java
new file mode 100644
index 0000000..20e7197
--- /dev/null
+++ b/spring/spring-redis-annotation/src/test/java/heibaiying/redisson/RedissonSamples.java
@@ -0,0 +1,55 @@
+package heibaiying.redisson;
+
+import com.heibaiying.config.redisson.SingalRedissonConfig;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author : heibaiying
+ * @description :redisson 操作普通对象
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = SingalRedissonConfig.class)
+public class RedissonSamples {
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ @Test
+ public void Set() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redisson");
+ rBucket.set("annotation Value");
+ redissonClient.shutdown();
+ }
+
+ @Test
+ public void Get() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redisson");
+ System.out.println(rBucket.get());
+ }
+
+ @Test
+ public void SetEx() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redissonEx");
+ rBucket.set("我在十秒后会消失", 10, TimeUnit.SECONDS);
+ }
+
+
+ @After
+ public void close() {
+ redissonClient.shutdown();
+ }
+}
diff --git a/spring/spring-redis/pom.xml b/spring/spring-redis/pom.xml
new file mode 100644
index 0000000..96775cb
--- /dev/null
+++ b/spring/spring-redis/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ com.heibaiying
+ spring-redis
+ 1.0-SNAPSHOT
+
+
+ 5.1.3.RELEASE
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-beans
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-core
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-web
+ ${spring-base-version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring-base-version}
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring-base-version}
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.4
+ provided
+
+
+
+ redis.clients
+ jedis
+ 3.0.0
+
+
+ org.redisson
+ redisson
+ 3.9.1
+
+
+
+ io.netty
+ netty-all
+ 4.1.32.Final
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/java/com/heibaiying/bean/Programmer.java b/spring/spring-redis/src/main/java/com/heibaiying/bean/Programmer.java
new file mode 100644
index 0000000..5cff5ab
--- /dev/null
+++ b/spring/spring-redis/src/main/java/com/heibaiying/bean/Programmer.java
@@ -0,0 +1,25 @@
+package com.heibaiying.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author : heibaiying
+ * @description :
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Programmer {
+
+ private String name;
+
+ private int age;
+
+ private float salary;
+
+ private Date birthday;
+}
diff --git a/spring/spring-redis/src/main/resources/jedis/jedis.properties b/spring/spring-redis/src/main/resources/jedis/jedis.properties
new file mode 100644
index 0000000..f25cf51
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/jedis/jedis.properties
@@ -0,0 +1,5 @@
+redis.host=127.0.0.1
+redis.port=6379
+redis.timeout=2000
+redis.maxIdle=8
+redis.maxTotal=16
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/resources/jedis/jedis.xml b/spring/spring-redis/src/main/resources/jedis/jedis.xml
new file mode 100644
index 0000000..431cdbd
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/jedis/jedis.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/resources/jedis/jedisCluster.xml b/spring/spring-redis/src/main/resources/jedis/jedisCluster.xml
new file mode 100644
index 0000000..e505247
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/jedis/jedisCluster.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/resources/redisson/redisson.xml b/spring/spring-redis/src/main/resources/redisson/redisson.xml
new file mode 100644
index 0000000..a1ebd49
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/redisson/redisson.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/resources/redisson/redissonCluster.xml b/spring/spring-redis/src/main/resources/redisson/redissonCluster.xml
new file mode 100644
index 0000000..6e20bdd
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/redisson/redissonCluster.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/main/resources/springApplication.xml b/spring/spring-redis/src/main/resources/springApplication.xml
new file mode 100644
index 0000000..54c5440
--- /dev/null
+++ b/spring/spring-redis/src/main/resources/springApplication.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisClusterSamples.java b/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisClusterSamples.java
new file mode 100644
index 0000000..c013c64
--- /dev/null
+++ b/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisClusterSamples.java
@@ -0,0 +1,45 @@
+package com.heibaiying.jedis;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.JedisPool;
+
+/**
+ * @author : heibaiying
+ * @description :redis 集群测试
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class JedisClusterSamples {
+
+ @Autowired
+ private JedisCluster jedisCluster;
+
+ @Test
+ public void Set() {
+ jedisCluster.set("hello", "spring");
+ }
+
+ @Test
+ public void Get() {
+ String s = jedisCluster.get("hello");
+ System.out.println(s);
+ }
+
+ @Test
+ public void setEx() {
+ String s = jedisCluster.setex("spring", 10, "我会在10秒后过期");
+ System.out.println(s);
+ }
+
+
+}
diff --git a/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisSamples.java b/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisSamples.java
new file mode 100644
index 0000000..f7e4c61
--- /dev/null
+++ b/spring/spring-redis/src/test/java/com/heibaiying/jedis/JedisSamples.java
@@ -0,0 +1,43 @@
+package com.heibaiying.jedis;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+/**
+ * @author : heibaiying
+ * @description :redis 单机版测试
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class JedisSamples {
+
+ @Autowired
+ private Jedis jedis;
+
+ @Test
+ public void Set() {
+ jedis.set("hello", "spring");
+ }
+
+ @Test
+ public void Get() {
+ String s = jedis.get("hello");
+ System.out.println(s);
+ }
+
+ @Test
+ public void setEx() {
+ String s = jedis.setex("spring", 10, "我会在10秒后过期");
+ System.out.println(s);
+ }
+
+}
diff --git a/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonObjectSamples.java b/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonObjectSamples.java
new file mode 100644
index 0000000..6701175
--- /dev/null
+++ b/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonObjectSamples.java
@@ -0,0 +1,49 @@
+package com.heibaiying.redisson;
+
+import com.heibaiying.bean.Programmer;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author : heibaiying
+ * @description :redisson 对象序列化与反序列化
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class RedissonObjectSamples {
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ // Redisson的对象编码类是用于将对象进行序列化和反序列化 默认采用Jackson
+
+ @Test
+ public void Set() {
+ RBucket rBucket = redissonClient.getBucket("programmer");
+ rBucket.set(new Programmer("xiaoming", 12, 5000.21f, new Date()));
+ redissonClient.shutdown();
+ //存储结果: {"@class":"com.heibaiying.bean.Programmer","age":12,"birthday":["java.util.Date",1545714986590],"name":"xiaoming","salary":5000.21}
+ }
+
+ @Test
+ public void Get() {
+ RBucket rBucket = redissonClient.getBucket("programmer");
+ System.out.println(rBucket.get());
+ }
+
+ @After
+ public void close() {
+ redissonClient.shutdown();
+ }
+}
diff --git a/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonSamples.java b/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonSamples.java
new file mode 100644
index 0000000..02f843f
--- /dev/null
+++ b/spring/spring-redis/src/test/java/com/heibaiying/redisson/RedissonSamples.java
@@ -0,0 +1,54 @@
+package com.heibaiying.redisson;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author : heibaiying
+ * @description :redisson 操作普通对象
+ */
+
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration({"classpath:springApplication.xml"})
+public class RedissonSamples {
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ @Test
+ public void Set() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redisson");
+ rBucket.set("firstValue");
+ redissonClient.shutdown();
+ }
+
+ @Test
+ public void Get() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redisson");
+ System.out.println(rBucket.get());
+ }
+
+ @Test
+ public void SetEx() {
+ // key 存在则更新 不存在则删除
+ RBucket rBucket = redissonClient.getBucket("redissonEx");
+ rBucket.set("我在十秒后会消失", 10, TimeUnit.SECONDS);
+ }
+
+
+ @After
+ public void close() {
+ redissonClient.shutdown();
+ }
+}