——Redis 缓存与分布式锁)
系列文章分布式系统开发1——MinIO 对象存储分布式系统开发2——Redis 缓存与分布式锁分布式系统开发3——RabbitMQ独立模块分布式系统开发4——DubboZookeeperRPC服务分布式系统开发5——整合所有组件分布式系统开发6——项目打包部署与Nginx代理前端接上一篇文章分布式系统开发1——MinIO 对象存储本文在上文基础上开发。本文先要启动Redis默认配置。Redis下载和启动教程可以查看Windows下安装运行Redis环境IDEA :2026.1JDK:17maven:3.9.xredis:3.x1.创建ds-redis模块名称写 ds-redis构建系统选mavenJDK这里选17然后点击”创建“2.新增依赖打开当前模块的依赖pom.xml注意是当前模块不是父模块然后添加下面的代码dependencies!-- SpringDataRedis--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--连接池--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency/dependencies添加完后刷新依赖。这里说要一下因为父工程继承了 spring-boot-starter-parent它已经通过 管理了大量 Spring Boot 相关依赖的版本包括 spring-boot-starter-data-redis 和 commons-pool2所以父工程中并没有加入spring-boot-start-data-redis和commons-pool2。但是子模块使用的时候需要注明一下。3.新增配置文件application.yml右击本模块的resources文件夹选择”新建“—“文件”文件的名字为application.yml参考代码如下server:port:8082spring:application:name:redis-demo# 应用名# Redis 配置data:redis:host:localhostport:6379password:# 你的Redis密码database:0# 库索引timeout:5000mslettuce:pool:max-active:8max-idle:8min-idle:0max-wait:1000ms配置完界面后如下说明这个配置文件的原则是”谁用谁配置“最后一章节整合的时候会把这个模块删除配置文件也会删除。到时候其他模块谁需要使用reids,就在其所在模块的配置文件中 定义上面redis的相关配置即可。本文只是为了单独演示模块功能。4.新增配置类RedisConfig右击当前模块的java文件夹选择”新建“—“软件包”这里软件包名为com.guo.redis.config然后继续右击创建 的config文件夹选择”新建“—“Java类”类名为RedisConfig参考相关代码如下importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.RedisSerializer;ConfigurationpublicclassRedisConfig{//配置 RedisTemplate//RedisConnectionFactory 是Spring 中创建、管理 Redis 连接的工厂负责根据配置建立 Redis 连接读取配置文件BeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryfactory){RedisTemplateString,ObjecttemplatenewRedisTemplate();//创建 RedisTemplate 对象操作 Redis 的核心工具template.setConnectionFactory(factory);//绑定 Redis 连接工厂让它能连上 Redis// 定义序列化工具RedisSerializerStringstringSerializerRedisSerializer.string();// 创建【JSON 序列化器】// 作用把 Java 对象转成 JSON 存进 Redis// 取出来又能自动转回对象GenericJackson2JsonRedisSerializerjsonSerializernewGenericJackson2JsonRedisSerializer();// key 序列化template.setKeySerializer(stringSerializer);//key 一律使用字符串序列化普通 Redis 键template.setHashKeySerializer(stringSerializer);//hash 类型的 key 也用字符串序列化// value 序列化template.setValueSerializer(jsonSerializer);//value 使用 JSON 序列化template.setHashValueSerializer(jsonSerializer);//hash 类型的 value 也用 JSON 序列化//让配置生效template.afterPropertiesSet();returntemplate;}}创建完后项目截图如下注意上面的 factory 地下出现红色波浪线在此处没有问题暂时不用处理。5. 封装工具类RedisUtil注意这一步并非一定要做也可以用Cache注解实现。区别是Cacheable 自动查询缓存一行注解不用写 Redis 代码RedisUtils 手动操作 Redis灵活强大适合复杂场景。本文先使用RedisUtils实现。右击本项目的redis文件夹选择”新建“——软件包”软件包名为com.guo.redis.utils然后继续右击刚才创建的utils文件夹选择“新建”—“Java类”类名为RedisUtil参考代码如下importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.Set;importjava.util.concurrent.TimeUnit;ComponentpublicclassRedisUtil{AutowiredprivateRedisTemplateString,ObjectredisTemplate;// 公共方法 /** * 指定缓存过期时间 * param key 键 * param time 时间秒 */publicbooleanexpire(Stringkey,longtime){try{if(time0){redisTemplate.expire(key,time,TimeUnit.SECONDS);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 根据key获取过期时间 */publiclonggetExpire(Stringkey){returnredisTemplate.getExpire(key,TimeUnit.SECONDS);}/** * 判断key是否存在 */publicbooleanhasKey(Stringkey){try{returnredisTemplate.hasKey(key);}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 删除缓存 */publicvoiddel(String...key){if(key!nullkey.length0){if(key.length1){redisTemplate.delete(key[0]);}else{redisTemplate.delete(Arrays.asList(key));}}}// String 类型 /** * 获取缓存 */publicObjectget(Stringkey){returnkeynull?null:redisTemplate.opsForValue().get(key);}/** * 设置缓存 */publicbooleanset(Stringkey,Objectvalue){try{redisTemplate.opsForValue().set(key,value);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 设置缓存并设置时间 */publicbooleanset(Stringkey,Objectvalue,longtime){try{if(time0){redisTemplate.opsForValue().set(key,value,time,TimeUnit.SECONDS);}else{set(key,value);}returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}/** * 递增 */publiclongincr(Stringkey,longdelta){if(delta0){thrownewRuntimeException(递增因子必须大于0);}returnredisTemplate.opsForValue().increment(key,delta);}/** * 递减 */publiclongdecr(Stringkey,longdelta){if(delta0){thrownewRuntimeException(递减因子必须大于0);}returnredisTemplate.opsForValue().increment(key,-delta);}// Map 类型 publicObjecthget(Stringkey,Stringitem){returnredisTemplate.opsForHash().get(key,item);}publicMapObject,Objecthmget(Stringkey){returnredisTemplate.opsForHash().entries(key);}publicbooleanhmset(Stringkey,MapString,Objectmap){try{redisTemplate.opsForHash().putAll(key,map);returntrue;}catch(Exceptione){e.printStackTrace();returnfalse;}}// Set 类型 publicSetObjectsGet(Stringkey){try{returnredisTemplate.opsForSet().members(key);}catch(Exceptione){e.printStackTrace();returnnull;}}// List 类型 publicListObjectlGet(Stringkey,longstart,longend){try{returnredisTemplate.opsForList().range(key,start,end);}catch(Exceptione){e.printStackTrace();returnnull;}}}添加完后项目截图如下6.新增启动类右击redis文件夹选择“新建”—“Java类”启动类的名字为RedisApplication然后参考代码如下packagecom.guo.redis;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationpublicclassRedisApplication{publicstaticvoidmain(String[]args){SpringApplication.run(RedisApplication.class,args);}}7.新增测试代码这里新增一段测试代码注意右击 test文件夹下面的java文件夹选择“新建”—“Java类”测试类的类名为RedisApplicationTests参考代码如下importcom.guo.redis.RedisApplication;importcom.guo.redis.utils.RedisUtil;importjakarta.annotation.Resource;importorg.junit.jupiter.api.Test;importorg.springframework.boot.test.context.SpringBootTest;SpringBootTest(classesRedisApplication.class)publicclassRedisApplicationTests{ResourceprivateRedisUtilredisUtil;TestvoidcontextLoads(){}//测试新增Testpublicvoidset(){redisUtil.set(name,张三,60);// 60秒过期System.out.println(设置成功);}//测试查询Testpublicvoidget(){ObjectobjectredisUtil.get(name);System.out.println(查询结果object);}//测试删除Testpublicvoiddel(){redisUtil.del(name);System.out.println(删除成功);}//测试过期时间Testpublicvoidexpire(){redisUtil.expire(name,15);System.out.println(设置成功);}//测试是否存在TestpublicvoidhasKey(){booleanhasKeyredisUtil.hasKey(name);System.out.println(是否存在hasKey);}}添加完后界面如下8.执行测试先执行第一个测试set方法往redis中写入数据。然后再执行get方法查看redis中的数据。注意要在60秒内进行查询 不然超时会删掉数据查询出来会是null本文参考代码ds-demo2.zip链接:https://pan.baidu.com/s/1FFQVzUp1SslY3EYph7z5xA?pwd4vm2