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 results = stringRedisTemplate.executePipelined(new RedisCallback() { + + @Override + public Object doInRedis(RedisConnection connection) throws DataAccessException { + // set 写入 + for (int i = 0; i < 3; i++) { + connection.set(String.format("yunai:%d", i).getBytes(), "shuai".getBytes()); + } + + // get + for (int i = 0; i < 3; i++) { + connection.get(String.format("yunai:%d", i).getBytes()); + } + + // 返回 null 即可 + return null; + } + }); + + // 打印结果 + System.out.println(results); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java new file mode 100644 index 00000000..2ced0733 --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/PubSubTest.java @@ -0,0 +1,27 @@ +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.data.redis.core.StringRedisTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class PubSubTest { + + public static final String TOPIC = "TEST"; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Test + public void test01() throws InterruptedException { + for (int i = 0; i < 3; i++) { + stringRedisTemplate.convertAndSend(TOPIC, "yunai:" + i); + Thread.sleep(1000L); + } + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java new file mode 100644 index 00000000..5280c9ca --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/ScriptTest.java @@ -0,0 +1,47 @@ +package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis; + +import org.apache.commons.io.IOUtils; +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.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ScriptTest { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Test + public void test01() throws IOException { + // 读取 /resources/lua/compareAndSet.lua 脚本 。注意,需要引入下 commons-io 依赖。 + String scriptContents = IOUtils.toString(getClass().getResourceAsStream("/lua/compareAndSet.lua"), "UTF-8"); + // 创建 RedisScript 对象 + RedisScript script = new DefaultRedisScript<>(scriptContents, Long.class); + // 执行 LUA 脚本 + Long result = stringRedisTemplate.execute(script, Collections.singletonList("yunai:1"), "shuai02", "shuai"); + System.out.println(result); + } + + @Test + public void test02() throws IOException { + // 读取 /resources/lua/compareAndSet.lua 脚本 。注意,需要引入下 commons-io 依赖。 + String scriptContents = IOUtils.toString(getClass().getResourceAsStream("/lua/test.lua"), "UTF-8"); + // 创建 RedisScript 对象 + RedisScript script = new DefaultRedisScript<>(scriptContents, List.class); + + List result = stringRedisTemplate.execute(script, Arrays.asList("key1", "key2"), "first", "second"); + System.out.println(result); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java new file mode 100644 index 00000000..780cd0db --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/SessionTest.java @@ -0,0 +1,37 @@ +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.core.RedisOperations; +import org.springframework.data.redis.core.SessionCallback; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SessionTest { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Test + public void test01() { + String result = stringRedisTemplate.execute(new SessionCallback() { + + @Override + public String execute(RedisOperations operations) throws DataAccessException { + for (int i = 0; i < 100; i++) { + operations.opsForValue().set(String.format("yunai:%d", i), "shuai02"); + } + return (String) operations.opsForValue().get(String.format("yunai:%d", 0)); + } + + }); + + System.out.println("result:" + result); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java new file mode 100644 index 00000000..af243d1d --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/Test01.java @@ -0,0 +1,54 @@ +package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis; + +import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject.UserCacheObject; +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.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Test01 { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + private RedisTemplate redisTemplate; + + @Test + public void testStringSetKey() { + stringRedisTemplate.opsForValue().set("yunai", "shuai"); + } + + @Test + public void testStringSetKey02() { + redisTemplate.opsForValue().set("yunai", "shuai"); + } + + @Test + public void testSetAdd() { + stringRedisTemplate.opsForSet().add("yunai_descriptions", "shuai", "cai"); + } + + @Test + public void testStringSetKeyUserCache() { + UserCacheObject object = new UserCacheObject() + .setId(1) + .setName("芋道源码") + .setGender(1); // 男 + String key = String.format("user:%d", object.getId()); + redisTemplate.opsForValue().set(key, object); + } + + @Test + public void testStringGetKeyUserCache() { + String key = String.format("user:%d", 1); + Object value = redisTemplate.opsForValue().get(key); + System.out.println(value); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java new file mode 100644 index 00000000..9cf88fcf --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/TransactionTest.java @@ -0,0 +1,56 @@ +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.data.redis.core.StringRedisTemplate; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringRunner.class) +@SpringBootTest +//@EnableTransactionManagement +public class TransactionTest { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Test + @Transactional + public void test01() { + // 这里是偷懒,没在 RedisConfiguration 配置类中,设置 stringRedisTemplate 开启事务。 + stringRedisTemplate.setEnableTransactionSupport(true); + + // 执行想要的操作 + stringRedisTemplate.opsForValue().set("yunai:1", "shuai"); + stringRedisTemplate.opsForValue().set("yudaoyuanma:1", "dai"); + +// stringRedisTemplate.execute(new SessionCallback() { +// +// @Override +// public String execute(RedisOperations operations) throws DataAccessException { +// return null; +// } +// +//// @Override +//// public List execute(RedisOperations operations) throws DataAccessException { +//// for (int i = 0; i < 100; i++) { +//// operations.opsForValue(String.format("yunai:%d", i), "shuai"); +//// } +//// return null; +//// } +// +// }); + } + + @Test + public void test02() { + stringRedisTemplate.setEnableTransactionSupport(true); + + + stringRedisTemplate.opsForValue().get("user:1"); + stringRedisTemplate.opsForValue().get("user:2"); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java new file mode 100644 index 00000000..dbad4276 --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/UserService02Test.java @@ -0,0 +1,27 @@ +package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis; + +import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.cacheobject.UserCacheObject; +import cn.iocoder.springboot.labs.lab10.springdatarediswithjedis.service.UserService02; +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.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class UserService02Test { + + @Autowired + private UserService02 userService; + + @Test + public void testSet() { + UserCacheObject object = new UserCacheObject() + .setId(1) + .setName("芋道源码") + .setGender(1); // 男 + userService.set(object.getId(), object); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java new file mode 100644 index 00000000..8ba7d7b8 --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/src/test/java/cn/iocoder/springboot/labs/lab10/springdatarediswithjedis/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.springboot.labs.lab10.springdatarediswithjedis; diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module differ diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/application.yml b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/application.yml new file mode 100644 index 00000000..866d5f23 --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/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 diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet.lua b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet.lua new file mode 100644 index 00000000..682737c6 --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/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/target/classes/lua/test.lua b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/test.lua new file mode 100644 index 00000000..35897e5c --- /dev/null +++ b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/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/target/test-classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module b/lab-11/lab-07-spring-data-redis-with-redisson/target/test-classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module new file mode 100644 index 00000000..8fb60192 Binary files /dev/null and b/lab-11/lab-07-spring-data-redis-with-redisson/target/test-classes/META-INF/lab-07-spring-data-redis-with-jedis.kotlin_module differ diff --git a/lab-11/pom.xml b/lab-11/pom.xml index 0c5b76b9..987223ac 100644 --- a/lab-11/pom.xml +++ b/lab-11/pom.xml @@ -13,6 +13,7 @@ pom lab-07-spring-data-redis-with-jedis + lab-07-spring-data-redis-with-redisson