diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/pom.xml b/lab-11/lab-07-spring-data-redis-with-redisson/pom.xml
new file mode 100644
index 00000000..f1d8d4f6
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/pom.xml
@@ -0,0 +1,62 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.3.RELEASE
+
+
+ 4.0.0
+
+ lab-07-spring-data-redis-with-redisson
+
+
+
+
+
+ org.redisson
+ redisson-spring-boot-starter
+ 3.11.3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.61
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+
+
+
+
+
+
+
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+
+
+
+
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
new file mode 100644
index 00000000..ac6c60ce
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Application.java
@@ -0,0 +1,8 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+//@EnableTransactionManagement
+public class Application {
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
new file mode 100644
index 00000000..cda71ee8
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/ProductCacheObject.java
@@ -0,0 +1,57 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject;
+
+/**
+ * 商品缓存对象
+ */
+public class ProductCacheObject {
+
+ /**
+ * 产品编号
+ */
+ private Integer id;
+ /**
+ * 产品名
+ */
+ private String name;
+ /**
+ * 产品分类编号
+ */
+ private Integer cid;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public ProductCacheObject setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public ProductCacheObject setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getCid() {
+ return cid;
+ }
+
+ public ProductCacheObject setCid(Integer cid) {
+ this.cid = cid;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "ProductCacheObject{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", cid=" + cid +
+ '}';
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
new file mode 100644
index 00000000..f253ad06
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/cacheobject/UserCacheObject.java
@@ -0,0 +1,57 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject;
+
+/**
+ * 用户缓存对象
+ */
+public class UserCacheObject {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserCacheObject setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserCacheObject setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserCacheObject setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "UserCacheObject{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", gender=" + gender +
+ '}';
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
new file mode 100644
index 00000000..dc46ef17
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/config/RedisConfiguration.java
@@ -0,0 +1,57 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.config;
+
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.listener.TestChannelTopicMessageListener;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.listener.ChannelTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+
+@Configuration
+public class RedisConfiguration {
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
+ // 创建 RedisTemplate 对象
+ RedisTemplate template = new RedisTemplate<>();
+
+ // 设置开启事务支持
+ template.setEnableTransactionSupport(true);
+
+ // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
+ template.setConnectionFactory(factory);
+
+ // 使用 String 序列化方式,序列化 KEY 。
+ template.setKeySerializer(RedisSerializer.string());
+
+ // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
+ template.setValueSerializer(RedisSerializer.json());
+ return template;
+ }
+
+ // Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+// ObjectMapper objectMapper = new ObjectMapper();// <1>
+//// objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+//// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+//
+// jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+// template.setValueSerializer(jackson2JsonRedisSerializer);
+
+// @Bean // PUB/SUB 使用的 Bean ,需要时打开。
+ public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory factory) {
+ // 创建 RedisMessageListenerContainer 对象
+ RedisMessageListenerContainer container = new RedisMessageListenerContainer();
+
+ // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。
+ container.setConnectionFactory(factory);
+
+ // 添加监听器
+ container.addMessageListener(new TestChannelTopicMessageListener(), new ChannelTopic("TEST"));
+// container.addMessageListener(new TestChannelTopicMessageListener(), new ChannelTopic("AOTEMAN"));
+// container.addMessageListener(new TestPatternTopicMessageListener(), new PatternTopic("TEST"));
+ return container;
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
new file mode 100644
index 00000000..78dc947c
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 数据库访问层
+ */
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.dao;
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
new file mode 100644
index 00000000..86308946
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/dao/redis/UserCacheDao.java
@@ -0,0 +1,35 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.dao.redis;
+
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject.UserCacheObject;
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.util.JSONUtil;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+
+@Repository
+public class UserCacheDao {
+
+ private static final String KEY_PATTERN = "user:%d"; // user:用户编号
+
+ @Resource(name = "redisTemplate")
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+ private ValueOperations operations;
+
+ private static String buildKey(Integer id) {
+ return String.format(KEY_PATTERN, id);
+ }
+
+ public UserCacheObject get(Integer id) {
+ String key = buildKey(id);
+ String value = operations.get(key);
+ return JSONUtil.parseObject(value, UserCacheObject.class);
+ }
+
+ public void set(Integer id, UserCacheObject object) {
+ String key = buildKey(id);
+ String value = JSONUtil.toJSONString(object);
+ operations.set(key, value);
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
new file mode 100644
index 00000000..5c05afa1
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestChannelTopicMessageListener.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.listener;
+
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.MessageListener;
+
+public class TestChannelTopicMessageListener implements MessageListener {
+
+ @Override
+ public void onMessage(Message message, byte[] pattern) {
+ System.out.println("收到 ChannelTopic 消息:");
+ System.out.println("线程编号:" + Thread.currentThread().getName());
+ System.out.println("message:" + message);
+ System.out.println("pattern:" + new String(pattern));
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
new file mode 100644
index 00000000..fa984333
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/listener/TestPatternTopicMessageListener.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.listener;
+
+import org.springframework.data.redis.connection.Message;
+import org.springframework.data.redis.connection.MessageListener;
+
+public class TestPatternTopicMessageListener implements MessageListener {
+
+ @Override
+ public void onMessage(Message message, byte[] pattern) {
+ System.out.println("收到 PatternTopic 消息:");
+ System.out.println("线程编号:" + Thread.currentThread().getName());
+ System.out.println("message:" + message);
+ System.out.println("pattern:" + new String(pattern));
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
new file mode 100644
index 00000000..65bb361f
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService01.java
@@ -0,0 +1,10 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserService01 {
+
+
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
new file mode 100644
index 00000000..5f4ed2e1
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/service/UserService02.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.service;
+
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject.UserCacheObject;
+import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.dao.redis.UserCacheDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserService02 {
+
+ @Autowired
+ private UserCacheDao userCacheDao;
+
+ public UserCacheObject get(Integer id) {
+ return userCacheDao.get(id);
+ }
+
+ public void set(Integer id, UserCacheObject object) {
+ userCacheDao.set(id, object);
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
new file mode 100644
index 00000000..cea22f21
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/util/JSONUtil.java
@@ -0,0 +1,22 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.util;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * JSON 工具类
+ */
+public class JSONUtil {
+
+ public static T parseObject(String text, Class clazz) {
+ return JSON.parseObject(text, clazz);
+ }
+
+ public static String toJSONString(Object javaObject) {
+ return JSON.toJSONString(javaObject);
+ }
+
+ public static byte[] toJSONBytes(Object javaObject) {
+ return JSON.toJSONBytes(javaObject);
+ }
+
+}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml
new file mode 100644
index 00000000..35104d9a
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+spring:
+ # 对应 RedisProperties 类
+ redis:
+ host: 127.0.0.1
+ port: 6379
+# password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
+ database: 0 # Redis 数据库号,默认为 0 。
+ timeout: 0 # Redis 连接超时时间,单位:毫秒。
+ # 对应 RedissonProperties 类
+ redisson:
+ config: classpath:redisson.yaml # 具体的每个配置项,见 org.redisson.config.Config 类。
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua
new file mode 100644
index 00000000..682737c6
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet.lua
@@ -0,0 +1,5 @@
+if redis.call('GET', KEYS[1]) ~= ARGV[1] then
+ return 0
+end
+redis.call('SET', KEYS[1], ARGV[2])
+return 1
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua
new file mode 100644
index 00000000..8b921f48
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/compareAndSet2.lua
@@ -0,0 +1,5 @@
+if redis.call('GET', KEYS[1]) != ARGV[1] then
+ return {0}
+end
+redis.call('SET', KEYS[2], ARGV[2])
+return {1}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua
new file mode 100644
index 00000000..35897e5c
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/lua/test.lua
@@ -0,0 +1 @@
+return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml b/lab-11/lab-07-spring-data-redis-with-redisson/src/main/resources/redisson.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
new file mode 100644
index 00000000..cd1f0410
--- /dev/null
+++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PipelineTest.java
@@ -0,0 +1,47 @@
+package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class PipelineTest {
+
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Test
+ public void test01() {
+ List