【SpringBoot整合Redis测试Redis集群案例】

news2024/12/26 12:29:56

 1、第一步,创建springboot项目,并导入依赖

如图,创建项目遇到的第一个问题就是,当type选择maven,jdk选择1.8时,java部分没办法选择1.8的版本,这怎么办呢?

原因:搜了一下,原来是官网的3.xx版本出来后,不再支持jdk1.8了,最低版本要求是jdk17

解决办法:如果是个人练习的话,jdk可以安装jdk1.8,也可以再安装一个jdk17,跟上主流版本。如果一定要使用的话,那么SpringBoot的Service URL可以使用阿里的版本:

https://start.aliyun.com/

SpringBoot的版本我建议还是用2.xx的版本,因为后面的swagger依赖对springboot的版本有要求,如果要用3.xx版本,那么建议先在网上看看springboot版本和swagger依赖的对应关系。

                springboot           swagger

版本号        2.xx                 2.6.1~2.9.2                

版本号         3.xx                   3.0.0                       http://127.0.0.1:8080/swagger-ui/index.html

我将我的依赖贴出来了,你可以用3.0版本,也可以直接复制我的。版本不同配置可能有出入,但是这也是一种学习,遇到问题解决就是了。         

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.awd</groupId>
    <artifactId>redis-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>redis-demo</name>
    <description>redis-demo</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--Springboot 与 Redis整合依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>


<!--        <dependency>-->
<!--            <groupId>org.springframework.plugin</groupId>-->
<!--            <artifactId>spring-plugin-core</artifactId>-->
<!--            <version>2.0.0.RELEASE</version>-->
<!--        </dependency>-->



        <!--jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.1</version>
        </dependency>

        <!--lettuce-->
<!--        <dependency>-->
<!--            <groupId>io.lettuce</groupId>-->
<!--            <artifactId>lettuce-core</artifactId>-->
<!--            <version>6.1.8.RELEASE</version>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

                                  

2、配置文件

server.port = 8080
spring.application.name=redis-demo

# ===================== logging ====================
logging.level.root=info
logging.level.com.awd.redisdemo=info
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n

logging.file.name=D:/project/mylogs2024/redis-demo.log
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n

# ======================== swagger ============================
spring.swagger2.enabled=true

spring.mvc.pathmatch.matching-strategy=ant_path_matcher
# ================== redis 单机 ===================
spring.data.redis.database=0
#云服务或虚拟机,总之,ip地址和端口号对应,单机的redis的ip和端口spring.redis.host=192.168.xxx.xxx
spring.redis.port=6379
# redis的启动密码
#spring.redis.password=xxxxx
#spring.redis.lettuce.pool.max-active=8
#spring.redis.lettuce.pool.max-wait=-1ms
#spring.redis.lettuce.pool.max-idle=8
#spring.redis.lettuce.pool.min-idle=0
# ================== redis 集群 ======================
spring.redis.password=abc12345
# 获取失败 最大重定向次数
spring.redis.cluster.max-redirects=3
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# 这里应该不用加,加了也没事,主要是模拟集群某个主机宕机后,让从机上位,变成主机,集群中,根据虚拟机的测试,应该是上位成功了,变成添加key成功,但是springboot有可能没有重新刷新集群拓扑图,还是之前的,导致一直访问那个宕机的主机结点失败。
spring.redis.lettuce.cluster.refresh.adaptive=true
# 定时刷新
spring.redis.lettuce.cluster.refresh.period=2000
# 集群所有的结点配置ip和端口,可以根据构建集群关系的那条语句看
spring.redis.cluster.nodes=192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx

3、Swagger配置文件

不必多说,这个直接复制粘贴就行。

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Value("${spring.swagger2.enabled}")
    private Boolean enabled;

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(enabled)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.awd.redisdemo"))
                .paths(PathSelectors.any())
                .build();
    }

    public ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("springboot 利用swagger2构建api接口文档" + "\t" +
                        DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now()))
                .description("springboot + redis 整合")
                .version("1.0")
                .termsOfServiceUrl("https://www.baidu.com/")
                .build();
    }

}

4、配置Controller层接口

这里遇到了一个问题,使用@Resource注解时,因为是自动引用,导入的包是错误的,缺少的包是:javax.annotation-api

@RestController
@Slf4j
@Api(tags = "订单接口")
public class OrderController {
    @Resource
    private OrderService orderService;

    @Resource
    private OldOrderService oldOrderService;

    @ApiOperation("新增订单")
    @RequestMapping(value = "/order/add",method = RequestMethod.POST)
    public void addOrder(){
        oldOrderService.addOrder();
    }


    @ApiOperation("查询订单")
    @RequestMapping(value = "/order/{keyId}",method = RequestMethod.GET)
    public String getOrderById(@PathVariable Integer keyId){
        return oldOrderService.getOrderById(keyId);
    }

5、Service层配置

别忘了上面的两个注解

@Service
@Slf4j
public class OrderService {

    public static final String ORDER_KEY= "ord:";
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    public void addOrder(){
        int keyId = ThreadLocalRandom.current().nextInt(1000)+1;
        String serialNo = UUID.randomUUID().toString();

        String key = ORDER_KEY + keyId;
        String values = "京东订单" + serialNo;

        stringRedisTemplate.opsForValue().set(key,values);

        log.info("***key:{}",key);
        log.info("***value:{}",values);
    }


    public String getOrderById(Integer keyId){
        return stringRedisTemplate.opsForValue().get(ORDER_KEY + keyId);
    }

}

6、通过java添加进redis库中的value出现乱码问题

这里我用的是SpringRedisTemplate,点击去会发现,对KEY和VALUE,HashKEY和HASHVALUE做了String序列化,所以不会出现乱码。但是如果换做是RedisTemplate,那么肯定是会乱码的,

SpringRedisTemplate继承了RedisTemplate,并在此基础上加了一些配置,包括初始化了String序列化配置。如果你想使用RedisTemplate,那么可以自己手动加序列化:


@Configuration
public class RedisConfig {

    // @Bean
    // public RedisTemplate<String , Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
    //     RedisTemplate<String , Object> redisTemplate = new RedisTemplate<>();
    //     redisTemplate.setConnectionFactory(redisConnectionFactory);
    //     // 开启序列化
    //     redisTemplate.setKeySerializer(new StringRedisSerializer());
    //     redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    //     redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    //     redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    //     redisTemplate.afterPropertiesSet();
    //     return redisTemplate;
    // }


    @Bean
    public RedisTemplate<String , Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String , Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        // 开启序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

7、我顺便做了一下单机的测试,用的jedis和Lettuce

// public static void main(String[] args) {
    //     Jedis jedis = new Jedis("192.168.xxx.xxx",xxxx);
    //     jedis.auth("xxxxxxx");
    //     String k1 = jedis.get("k1");
    //     System.out.println("k1:"+k1);
    // }


    public static void main(String[] args) {
        // 使用构建器链式编程来builder我们RedisURI
        RedisURI uri = RedisURI.builder().withHost("192.168.xxx.xxx")
                .withPort(xxxx)
                .withAuthentication("default","xxxxxxx")
                .build();

        // 创建客户端链接
        RedisClient redisClient = RedisClient.create(uri);
        // 连接客户端
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        // 创建操作的command
        RedisCommands<String, String> commands = connect.sync();

        // 执行操作,会报错
        // sync.set("k2","v2");

        String k1 = commands.get("k1");

        System.out.println(k1);
        // System.out.println(k2);


        // 关闭释放资源
        connect.close();
        redisClient.shutdown();
    }

8、Swagger测试

网址:http://localhost:8080/swagger-ui.html

整个流程大概就是这样子,遇到问题不要着急,看看报错,想一想,再搜一搜,总能找到解决办法的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ Primer Plus习题】17.7

问题: 解答: #include <iostream> #include <vector> #include <string> #include <fstream> #include <algorithm>using namespace std;const int LIMIT 50;void ShowStr(const string& str); void GetStrs(ifstream& fin, vector<…

【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 JUC是“Java Util Concurrency”的缩写&#xff0c;指的是Java并发工具包&#xff0c;它位于java.util.concurrent包及其子包中。JUC包提供了大量用于构建并发应用程序的工具和…

简历信息提取系统源码分享

简历信息提取检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++之stack 和 queue

目录 前言 1.stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack 的模拟 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2.3 queue的模拟 3.适配器 3.1 什么是适配器 3.2 STL标准库中stack和queue的底层结构 3.3 deque 的介绍&#xff08;了解&…

每日OJ题_牛客_ 腐烂的苹果_多源BFS_C++_Java

目录 牛客_腐烂的苹果&#xff08;多源 BFS&#xff09; 题目解析 C代码 Java代码 牛客_腐烂的苹果&#xff08;多源 BFS&#xff09; 腐烂的苹果_牛客题霸_牛客网 题目解析 多源 BFS 问题&#xff0c;固定套路&#xff0c;BFS学习 &#xff1a;Offer必备算法28_多源BFS_…

【C++算法】哈希表

哈希表介绍&#xff1a; 1.哈希表是什么&#xff1f; 存储数据的容器 2.哈希表有什么用&#xff1f; “快速”查找某个元素——O(N) 3.什么时候使用哈希表&#xff1f; 频繁的查找某一个数的时候&#xff0c;频繁也可以使用二分&#xff08;有序&#xff09; 4.怎么用哈希表&…

cadence多版本启动问题

一、问题描述 电脑上安装了 17.4 和16.6两个版本打开16.6时会弹出 **原因&#xff1a;**使用Allegro设计PCB时&#xff0c;当关闭软件后&#xff0c;再次打开Allegro软件&#xff0c;打开的文件为上一次操作过的.brd文件&#xff0c;这是Allegro软件安装的默认设置。 二、解…

单体项目中定时任务的实现-详细教程

单体项目中定时任务的实现 在企业开发中&#xff0c;遇到的项目无非就两种&#xff0c;单体项目和分布式项目 单体项目中实现定时任务有以下几种方式 1. 使用Timer实现定时任务&#xff08;不常用&#xff09; 1.1、JDK1.3推出的定时任务实现工具类java.util.Timer 1.2、API…

学习MRI处理过程中搜到的宝藏网站

今天浏览网页查到了一些宝藏网站&#xff0c;正好记录一下&#xff0c;后面搜到好东东再接着填充&#xff0c;方便查阅~ &#xff08;1&#xff09;牛人网站 这个网站是在搜集seed关键词时发现的&#xff0c;用pdf文档记录&#xff0c;可下载查阅&#xff0c;条理清晰&#xf…

Python | Leetcode Python题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; class Solution:def minMutation(self, start: str, end: str, bank: List[str]) -> int:if start end:return 0def diffOne(s: str, t: str) -> bool:return sum(x ! y for x, y in zip(s, t)) 1m len(bank)adj [[] for _ in ra…

基于Node.js+Express+MySQL+VUE实现的在线电影视频点播网站管理系统的设计与实现

1. 引言 随着互联网技术的快速发展和普及&#xff0c;人们获取信息的方式发生了巨大变化&#xff0c;其中在线视频点播服务因其便捷性和多样性而受到广泛欢迎。在线电影视频点播网站作为这一领域的代表&#xff0c;不仅需要满足用户观看需求&#xff0c;同时也需为管理员提供高…

架构设计读后有感——设计流程

架构也是有套路的 绝大部分的公司中&#xff0c;架构师都是技术人员的终极方向&#xff0c;是技术金字塔的顶端&#xff0c;那么普通人员要想走上这条路&#xff0c;需要掌握适当的方法&#xff0c;逐步完善架构 &#x1f3f9;1 有的放矢——识别复杂度 分析复杂性是设计架构的…

vscode 代码格式setting设置

{"editor.tabSize": 2,"eslint.validate": ["javascript", // 用eslint的规则检测js文件"vue","html","typescript","typescriptreact"],"editor.codeActionsOnSave": {"source.fixAll…

【NLP】daydayup 循环神经网络基本结构,pytorch实现

RNN 循环神经网络 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种神经网络结构&#xff0c;专门用于处理序列数据。 RNN结构原理 RNN架构中&#xff0c;网络通过循环把信息从一个处理步骤传递到下一个&#xff0c;这个循环结构被称为隐…

10个强大的AI驱动售后服务,助力成功

目录 10个AI驱动售后服务 1. 预测性维护以减少停机时间2. 自动化客户支持3. 个性化产品推荐4. 情感分析以改进反馈管理5. AI驱动自助服务平台6. 主动客户沟通7. 智能保修管理8. AI增强服务团队培训9. 高级分析服务优化10. AI驱动忠诚度计划 利用AI提升售后服务体验 在当今竞争…

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

分析二极管的交流响应(1)——直流分析,Q点的计算

二极管的直流电路分析我们可以用理想模型&#xff0c;恒压降模型和折线模型去近似分析&#xff0c;但是这些模型仅限于我们的信号是直流的情况。如果遇到交流信号&#xff0c;我们该如何去分析呢&#xff1f; 首先我们来理解Q点的概念&#xff1a; 看这个Q点里的“Q”是个什么…

【C++】C++中如何处理多返回值

十四、C中如何处理多返回值 本部分也是碎碎念&#xff0c;因为这些点都是很小的点&#xff0c;构不成一篇文章&#xff0c;所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道&#xff0c;当你写一个函数的返回时&#xff0c;那是你想返回…

【Javascript】原生实现deep watch,使用proxy逐层建立数据监听

原理 使用 proxy对象处理数据&#xff0c;添加监听&#xff0c;然后递归再次添加直到全部添加完毕 代码 /*** 给对象递归建立数据监听&#xff0c;可以监测每一层的每个键的变化* * param {*} obj // 目标对象 * param {*} callback //回调。通过key处理对应的变化* param {…

机器学习EDA探查工具Pandas profiling

在最初的数据探查的时候&#xff0c;可以通过pandas的函数&#xff0c;以及matplotlib做图像绘图&#xff0c;这个工作比较重复和低效&#xff0c;所以pandas针对常用的数据列统计和展示&#xff0c;做了EDA工具profiling&#xff0c;可以自动帮助数据分析。 问题1&#xff1a…