10、SpringBoot集成Redis

news2024/11/16 11:25:43

总体概述
jedis-lettuce-RedisTemplate三者的联系

本地Java连接Redis常见问题
● bind配置请注释掉
● 保护模式设置为no
● Linux系统的防火墙设置
● Redis服务器的IP地址和密码是否正确
● 忘记写Redis的服务端口号和auth密码

1、集成Jedis

是什么
Jedis Client是Redis官网推荐的一个面向Java客户端,库文件实现了对各类API进行封装调用

改POM

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>redis7</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.3.1</version>
        </dependency>
    </dependencies>

</project>

案例


public class jedisDemo {
    public static void main(String[] args) {
        //获取连接
        Jedis jedis = new Jedis("192.168.10.101", 6379);
        //指定服务器密码
        jedis.auth("111111");
        //获取redis客户端,可以向jdbc一样访问redis
        System.out.println(jedis.ping()); //PONG

        //keys
        System.out.println(jedis.keys("*"));
        jedis.set("k5", "hello-jedis");
        System.out.println("jedis.get(\"k5\") = " + jedis.get("k5"));

        jedis.lpush("list", "l1,l2,l3");
        System.out.println("jedis.lrange(\"list\",0,-1) = " + jedis.lrange("list", 0, -1));

        Map<String, String> map = new HashMap<>();
        map.put("id", "1");
        map.put("name", "zhangsan");
        map.put("age", "25");
        jedis.hset("user:001", map);
        System.out.println("jedis.hgetAll(\"user:001\") = " + jedis.hgetAll("user:001"));

        jedis.sadd("set", "1,2,3,4,5");
        System.out.println("jedis.smembers(\"set\") = " + jedis.smembers("set"));

        jedis.zadd("zset",100,"zhangsan");
        System.out.println("jedis.zrange(\"zet\",0,-1) = " + jedis.zrange("zset", 0, -1));

    }
}
/**
 * PONG
 * [zset, user:001, set, k5, list]
 * jedis.get("k5") = hello-jedis
 * jedis.lrange("list",0,-1) = [l1,l2,l3, l1,l2,l3]
 * jedis.hgetAll("user:001") = {name=zhangsan, age=25, id=1}
 * jedis.smembers("set") = [1,2,3,4,5]
 * jedis.zrange("zet",0,-1) = [zhangsan]
 */

2、集成lettuce

是什么
Redis的Java驱动包

lettuce vs jedis
● 都可以链接Redis服务器,但是在SpringBoot2.0之后默认使用的是Lettuce这个客户端连接Redis服务器
● Lettuce底层使用的是Netty

在这里插入图片描述
案例
改POM
POM依赖

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

案例


public class LettuceDemo {
    public static void main(String[] args) {
        //使用构建器链式编程builder我们的RedisURI
        RedisURI uri = RedisURI.builder()
        .redis("192.168.10.101")
        .withPort(6379)
        .withAuthentication("default", "111111")
        .build();
        //创建连接客户端
        RedisClient redisClient = RedisClient.create(uri);
        StatefulRedisConnection<String, String> conn = redisClient.connect();

        //通过conn创建操作的command
        RedisCommands<String, String> commands = conn.sync();

        //业务逻辑
        //#######################
        System.out.println("commands.keys(\"*\") = " + commands.keys("*")); //commands.keys("*") = [k5, user:001, list, zset, set]
        commands.set("k7", "hello-lettuce");
        System.out.println("commands.get(\"k7\") = " + commands.get("k7")); //commands.get("k7") = hello-lettuce
        //#######################

        //各种关闭释放资源
        conn.close();
        redisClient.shutdown();

    }
}

3、集成RedisTemplate—推荐使用

连接单机
改POM

<!--SpringBootRedis整合依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
</dependency>

写YML

server:
  port: 7777

spring:
  application:
    name: redis7_study

  redis:
    database: 0
    host: 192.168.10.101
    port: 6379
    password: 111111
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

案例


@Service
@Slf4j
public class OrderService {
    public static final String ORDER_KEY = "ord:";
    @Autowired
    private RedisTemplate redisTemplate;

    public void addOrder() {
        int keyId = ThreadLocalRandom.current().nextInt(1000) + 1;
        String serialNo = UUID.randomUUID().toString();
        String key = ORDER_KEY + keyId;
        String value = "京东订单" + serialNo;

        redisTemplate.opsForValue().set(key, value);
        log.info("***key:{}", key);
        log.info("***value:{}", value);

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

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
        template.setConnectionFactory(connectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

连接集群
改写YML

server:
  port: 7777

spring:
  application:
    name: redis7_study

  redis:
    password: 111111
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0
    cluster:
      max-redirects: 3
      nodes: 192.168.10.101:6381,192.168.10.101:6382,192.168.10.102:6383,192.168.10.102:6384,192.168.10.103:6385,192.168.10.103:6386

直接通过微服务访问Redis集群
在这里插入图片描述
问题来了

  1. 认为模拟,master-6381及其意外宕机,手动shutdown
  2. 先对redis集群命令方式,手动验证各种读写命令,看看6384是否上位

在这里插入图片描述

3.Redis Cluster集群能自动感知并自动完成主备切换,对应的slave6384会被选举为master节点
在这里插入图片描述
4. 微服务客户端再次读写访问试试
a. 故障现象:SpringBoot客户端没有感知到RedisCluster的最新集群信息
在这里插入图片描述
b. 原因:SpringBoot2.X版本,Redis默认的连接池采用Lettuce,当Redis集群节点发生变化后,Lettuce默认是不会刷新节点拓扑。
c. 解决方案:
ⅰ. 排除lettuce采用jedis(不推荐)
ⅱ. 重写连接工厂实例(极度不推荐)
ⅲ. 刷新节点集群拓扑动态感应
1. 在YML配置文件新增两个设置: spring.redis.lettuce.cluster.refresh.adaptive=true支持集群拓扑动态感应刷新,自适应拓扑刷新是否适用所有可用的更新,默认false关闭 和 spring.redis.lettuce.cluster.refresh.period=2000 定时刷新

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

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

相关文章

【MATLAB笔记】基础函数及向量

一、基础函数绘制 版本&#xff1a;Matlab2021a 实例1&#xff1a;生成向量 >> x0:0.1:30; >> ysin(x).*cos(x); >> plot(x,y) 实例2&#xff1a;创建向量 >> xlinspace(0,2*pi); >> ysin(x) >> plot(x,y) 二、向量的点积 >> a…

ueditor富文本编辑器使用

下载百度富文本编辑器 链接&#xff1a;https://pan.baidu.com/s/1E4K8e0WCy9_L6z0-Dz3JkQ?pwdc2gf 提取码&#xff1a;c2gf <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" co…

pgrouting连通性分析

官方文档 1、安装pgrouting库 参考&#xff1a;pgrouting安装 主要涉及的两个函数&#xff1a; 1、 pgr_createTopology&#xff1a;创建空间拓扑&#xff0c;数据自动保存至新创建的表<edge_table>_vertices_pgr&#xff0c;将空间表的linestr的geometry数据拆分&…

云原生系列之管理docker容器中的数据管理实战

前言 在生产环境中使用docker,一方面需要对数据进行保存或者在多个容器之间进行数据共享; 另一方面在docker的容器被删除之后,并不会保留容器的状态信息。 想要实现docker容器的信息持久化,就涉及到docker的数据管理,今天我们就来聊聊docker数据管理那些事。 文章目录 …

Vue3:在 VSCode 中如何成功安装 Mockjs 及成功引入 Mock 的详细过程

Ⅰ、Mock 简介&#xff1a; 1、什么是 Mock&#xff1f; 其一、Mock 的解释一&#xff1a; Mock 服务是指在测试过程中对于某些复杂&#xff08;或者不太好构造&#xff09;的对象&#xff0c;用一个虚拟的对象替代它&#xff1b;对于前端来说&#xff0c;就是后台数据还没有…

Python编程入门:了解Python及其由来

在计算机编程的世界中&#xff0c;Python已经成为一门备受欢迎的高级编程语言。它的简洁、易读和功能强大使得它成为众多开发者的首选。但你是否了解Python的由来以及为什么它如此受欢迎呢&#xff1f;在本篇博客中&#xff0c;我们将一起探索Python编程语言的起源和一些相关知…

shell中awk命令常用用法总结

1、获取分隔的内容 以点为分隔符获取IP地址的最后一个字段 echo $ip | awk -F . {print $4}

YOLO系列v1-v8

YOLO是Region-free方法&#xff0c;只需要一次扫描&#xff0c;也被称为单阶段&#xff08;1-stage&#xff09;模型。而Region-based方法方法&#xff0c;如mask-rcnn &#xff0c;被称为两阶段&#xff08;2-stage&#xff09;方法。 YOLOv1-v3是原作者&#xff0c;v4和v7是…

【C语言】指针进阶[下](回调函数(模拟实现qsort-采用冒泡方式))

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 回调函数 1.1 qsort 函数的使用 1.2 qsort 排序结构体类型 1.3 回调函数模拟实现 qsort&#xff08;排序整型&#xff09; 1.4 回调函数模拟实现 qsort&#xff08;排序结构体类型&#xff09; 1. 回调函数 回…

【WebAssembly】编译c++ Demo ->HelloWorld

好的开始等于成功了一半&#xff0c;本篇逐条讲解如何将一个cpp通过WebAssembly编译并运行在网页上。 一、环境准备 前提条件 需要安装CMake&#xff0c;VS&#xff0c;python2.7及以上 拉取emsdk代码 仓库地址&#xff1a;GitHub - emscripten-core/emsdk: Emscripten SD…

04_前端包管理工具模块化

注意事项: ​ 改模块代码不用重启服务器,修改config文件的时候需要重启服务器 ​ nvm的安装路径和node的安装路径不能在同一路径下面 ​ 有乱码问题使用管理员权限进行使用use方法 下载安装node ​ 使用命令进行安装 1.nvm list 查看已下载所有的node版本 2.nvm install…

VR工地安全虚拟现实体验:多种事故模拟,第三人称回看

建筑工地五大伤害是指&#xff1a;高处坠落、坍塌、物体打击、机械伤害、触电。利用VR(虚拟现实)技术体验建筑工地五大伤害&#xff0c;可以为建筑工人提供更真实、更安全的工作环境&#xff0c;同时也可以帮助他们更好地了解和掌握工作技能。 以下是VR工地安全虚拟现实体验软件…

C++ Primer(读书笔记)

C源文件通常以.cc、.cxx、.cpp、.cp、.C作为后缀来命名 C语言未定义输入输出语句&#xff0c;而是提供了一个全面的标准库来提供IO机制&#xff0c;对应 iostream、fstream、sstream std::cout<<"Enter Two Numbers"<<std::endl;&#xff0c;这条语句执…

在四维轻云使用过程中,出现这些问题应该怎么办?

在四维轻云的使用过程中&#xff0c;可能会出现在地图中无法显示加载的点云或倾斜摄影模型数据、无法上传数据等问题。出现以下这些问题时&#xff0c;可采取一定的措施来解决&#xff0c;若无法解决可联系工作人员处理。 1、在地图中无法显示加载的点云或倾斜摄影模型数据&am…

推特色情机器人账号泛滥,马斯克的“治推谋略”何在?

据BleepingComputer消息&#xff0c;推特虚假机器人账户泛滥的问题不仅还未得到解决&#xff0c;其中传播色情信息的机器人账户近期反而严重泛滥。 在安全研究小组MalwareHunterTeam最近的一项调查研究中曝光了多个传播虚假消息的机器人账户&#xff0c;它们为真实用户发出的帖…

为汽车制造商赋能,CarFramework定制AOSP技术,提升汽车信息娱乐系统

车载CarFramework&#xff08;车载框架&#xff09;是Android Automotive操作系统中的一个关键组件&#xff0c;它提供了与车辆系统交互的基础设施和功能。CarFramework旨在为车载应用程序提供统一的开发和执行环境&#xff0c;以便它们可以与车辆的硬件和软件进行交互。CarFra…

华为云专家出品《字节码编程指南》电子书上线

Javaagent非入侵全链路监控设计和实现入门 ASM、Javassist、Byte-Buddy三套字节码框架案例 市面上少有的成体系字节码知识 都在这里&#xff01; 华为云出品《深入理解边缘计算》电子书上线 本书适合超过3年经验的高级开发者&#xff0c;适合对字节码编程有学习需求或想拓展…

赛效:CAD怎么转PDF

1&#xff1a;打开91ai在线工具并登录自己的账号&#xff0c;从“CAD转换”菜单里点击CAD转PDF。 2&#xff1a;点击上传电脑本地的CAD文件。 3&#xff1a;文件上传成功后点击“开始转换”。 4&#xff1a;转换成功后&#xff0c;点击下载按钮将文件保存本地。 如果你想了解更…

【超详细】MySQL环境安装

文章目录 说明1、关闭不需要的环境2、检查并删除系统安装包3、获取 mysql 官方 yum 源4、安装 mysql yum 源&#xff0c;对比前后 yum 源5、看看 yum 源是否安装成功6、安装 mysql 服务7、查看配置文件和数据存储位置8、启动服务9、登录 mysql方法一&#xff1a;方法二&#xf…

jedis使用,操作Redis数据库2

在刚刚ping通的基础上,再来通过jedis连接池连接redis 在resources下创建redis.properties配置文件,在配置文件中写如下内容 # 必配 # Redis服务器地址(域名或IP) redis.host192.168.40.100 # Redis服务器连接端口(Redis默认端口号是6379) redis.port6379 # Redis服务器连接密码…