springboot整合spring-data-redis

news2024/9/22 21:15:38

前言

其实,整合是一个循序渐进的学习,你肯定是要了解之前底层的相关知识,才能够具体知道现在框架方法api到底tm有什么作用,所以建议先看看我之前的redis博客。

可以不看,但是可以以我这个为目录,针对性得去了解相关知识(学习任何东西,都应该这样)。

(41条消息) Cenos7 --- Redis下载和安装(Linux版本)_本郡主是喵的博客-CSDN博客

(41条消息) redis学习 -- 常用指令_本郡主是喵的博客-CSDN博客

(41条消息) redis -- 持久化存储方案_本郡主是喵的博客-CSDN博客

(41条消息) redis的4种模式,单机,哨兵、主从复制、集群_本郡主是喵的博客-CSDN博客

1.快速入门

1.1导入相关依赖

	<!--spring-data-redis组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--commons-pools连接池,lettuce没有内置的数据库连接池所以要用第三方的 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
		<!--web组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--test组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

1.2 配置文件

application.yml

server:
  port: 8080


# redis配置
spring:
  redis:
    password: 123456
    # 默认0库
    database: 0
    #连接超时时间
    timeout: 10000ms
    port: 6379
    host: 192.168.88.135
    lettuce:
      pool:
        # 设置最大连接数
        max-active: 1024
        # 最大阻塞时间
        max-wait: 10000ms
        # 最大空间连接,默认8
        max-idle: 200
        # 最小空间连接,默认5
        min-idle: 5

1.3 核心代码

@SpringBootTest
class SpringDataRedisDemo1ApplicationTests {

    @Autowired
    // 这一种完全够用(与第二种,稍微一点差别,具体看下文)
    private RedisTemplate redisTemplate;
    @Autowired
    // 转对redis的string类型的
    private StringRedisTemplate stringRedisTemplate;
   


    @Test
    void testDemo() {
        ValueOperations value = redisTemplate.opsForValue();
        value.set("qhx","name");
        System.out.println(value.get("qhx"));
        
        ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
        System.out.println(stringValueOperations.get("name"));


    }

}

此处可以忽略。

我们在application.yml配置文件信息,按住ctrl + 单击点进去,发现是一个映射redis配置信息的类。

 就是,假如有些配置你不知道,可以依托这个去相应的官网文档上去查找相应的用法。

1.4 自定义模版解决序列化问题

打开redis可视化客户端,发现我们成功存入数据,但是是java字节数据。如何解决?

先看下图。

 RedisConfig.java

@Configuration
public class RedisConf {
    @Bean
  public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        // 为string 的key设置序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 为string类型的value设置序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 为hash类型的value设置json序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // 为hash类型的key设置json序列化
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 设置数据库连接池
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

再次运行。

成功!

此处可以忽略。

可以看出,我们设置key先转成java字节数据,最后存入数据库中。

自定义后,我们设置key先转成java string数据,最后存入数据库中。

2.操作各种类型数据

此处可以忽略

其实,这些api如果你没有学过,需要跟着敲一遍,敲得途中你可能会发现这些api的意思(有基础的前提下)。

2.1 操作string类型数据

 // 添加一条数据
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("name","zhangsan");
        // 获取一条数据
        String name = (String) ops.get("name");
        System.out.println(name);
        // 层级关系
        ops.set("user:01","lisi");
        // 添加多条数据
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("age","20");
        hashMap.put("address","wei");
        ops.multiSet(hashMap);
        // 获取多条数据
        ArrayList<Object> list = new ArrayList<>();
        list.add("age");
        list.add("address");
        List listValue = ops.multiGet(list);
        listValue.forEach(System.out::println);

2.2 操作hash类型数据

  HashOperations hashOps = redisTemplate.opsForHash();
        // 添加hash单条数据
        hashOps.put("user","name","qhx");
        // 获取hash单条数据
        String hash = (String) hashOps.get("user", "name");
        // 添加hash多条数据
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("age","20");
        hashMap.put("address","wei");
        hashOps.putAll("user",hashMap);
        // 获取hash类型的多条数据
        ArrayList<String> list = new ArrayList<>();
        list.add("age");
        list.add("address");
        List user = hashOps.multiGet("user", list);
        user.forEach(System.out::println);
        // 获取hash类型所有数据
        Map entries = hashOps.entries("user");
        entries.forEach((key,value)->{
            System.out.println(key+"-->"+value);
        });
          // 删除Hash类型数据
        hashOps.delete("user","age","name");

2.3 操作list类型数据

 ListOperations listOps = redisTemplate.opsForList();
        // 左添加
        listOps.leftPush("students","w1");
        listOps.leftPushAll("students","w2","w3");
        // 右添加
        listOps.leftPush("students","w4");
        // 在w1前面左添加w0
         listOps.leftPush("students","w1","w0");
        // 获取数据
        List list = listOps.range("students", 0, 4);
        System.out.println(list);
        // 获取总条数
        Long students = listOps.size("students");
        // 删除1条数据
        listOps.remove("students",1,"w0");
        // 左弹出
        listOps.leftPop("students");
        listOps.rightPop("students");

2.4 操作set类型数据

 SetOperations setOps = redisTemplate.opsForSet();
        // 添加数据
        setOps.add("ids","1","2");
        // 获取数据
        Set ids = setOps.members("ids");
        ids.forEach(System.out::println);
        // 删除数据
        setOps.remove("ids","1","2");

2.5 操作sorted-set类型数据

 ZSetOperations zSetOps = redisTemplate.opsForZSet();
        // 添加多条数据(我自己也属实看不懂)将数据封装到hash里。
        ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<>("wls",1D);
        ZSetOperations.TypedTuple<Object> objectTypedTuple2 = new DefaultTypedTuple<>("qhx",2D);
        ZSetOperations.TypedTuple<Object> objectTypedTuple3 = new DefaultTypedTuple<>("zlx",3D);
        Set<ZSetOperations.TypedTuple> tuples = new HashSet<>();
        tuples.add(objectTypedTuple1);
        tuples.add(objectTypedTuple2);
        tuples.add(objectTypedTuple3);
        zSetOps.add("names",tuples);
        // 添加单条数据
        zSetOps.add("names","qhx1",4D);
        // 获取数据
        Set names = zSetOps.range("names", 0, 3);
        names.forEach(System.out::println);
        // 删除数据
        zSetOps.remove("names","qhx","wls");

2.6 获取所有的key和给key设置过期时间

  // 获取所有的keys(当前数据库)
        Set keys = redisTemplate.keys("*");
        keys.forEach(System.out::println);
        // 给已存在key设置失效时间
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("name","qhx",200, TimeUnit.SECONDS);
        // 给key设置失效时间
       redisTemplate.expire("age",30,TimeUnit.SECONDS);

3.配置哨兵模式

先在redis中启用哨兵模式。

还有别忘了用Linux防火墙把相应的端口打开(或者,直接关闭防火墙)。

1.方式一,在aplication.yml文件中新加 spring.redis.sentinel

预览图:

 sentinel:
      # 主节点名称
      master: mysaster
      # 主服务器密码
      password: 123456
      # 哨兵节点
      nodes: 192.168.88.135:26379,192.168.88.135:26380,192.168.88.135:26381

2.方式二,

在上文RedisCong.java中添加

    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration(){
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration()
                // 主节点名称
                .master("mymaster")
                // 哨兵
                .sentinel("192.168.88.135",26379)
                .sentinel("192.168.88.135",26380)
                .sentinel("192.168.88.135",26381);
                // 密码
                redisSentinelConfiguration.setPassword("123456");
                return redisSentinelConfiguration;
    }

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

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

相关文章

python图像处理实战(二)—图像几何变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

Python接口自动化测试实战

目录 前言&#xff1a; 1.接口定义&#xff1a; 2.基本流程 3.需求分析 4.用例设计 5.脚本开发 5.3结果校验 6.结果分析 前言&#xff1a; Python是一款在自动化测试领域应用广泛的编程语言。通过使用Python的测试框架&#xff08;如unittest和pytest&#xff09;&…

【第一次】21级计科计算机组成原理课外练习

【第一次】21级计科计算机组成原理课外练习 一、判断题二、单选题三、多选题四、主观题 一、判断题 1-1 国防科技大学成功研制的“银河-II”通用并行巨型机的峰值速度超过同为国防科技大学研制的“天河一号”超级计算机。 错误 1-2 目前高端光刻机技术被荷兰ASML公司垄断&…

简要介绍 | 行人重识别 Person Re-identification

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对行人重识别进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;“简要介绍"系列的所有创作均使用了AIGC工具辅助” 探索行人重识别技术&#xff1a;原理、挑战与未来展望 行人…

数字IC前端学习笔记:仲裁轮询(二)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…

【代码阅读软件】VSCode最新版本 下载、安装、配置

目录 一、概述二、安装 VSCode 详细步骤三、基础配置3.1 安装中文插件3.2 安装其他插件 一、概述 VSCode 全称是 Visual Studio Code&#xff0c;是一款免费且开源的现代化代码编辑器&#xff0c;几乎支持所有主流开发语言的语法高亮、智能代码补全、代码片段提示、自定义快捷键…

(2023,网络修剪)探索 few-shot 图像生成中的不相容知识迁移

Exploring Incompatible Knowledge Transfer in Few-shot Image Generation 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 基础 4. FSIG 中不兼容的知识转移 4.1 调查不相容的知识 4.2 实验设置 4.3 结果和分析 5. 建议的方法 5.1 通过网络修剪进…

SpringCloud02:Eureka

什么是Eureka&#xff1f; 基于Restful的注册中心 Eureka基本的架构 Springcloud 封装了Netflix公司开发的Eureka模块来实现服务注册与发现 (对比Zookeeper).Eureka采用了C-S的架构设计&#xff0c;EurekaServer作为服务注册功能的服务器&#xff0c;他是服务注册中心.而系统…

React从入门到实战 -组件的三大核心属性(1)state

State state是组件对象最重要的属性&#xff0c;值是对象&#xff08;可以包含多个Key-value的组合&#xff09;组件被称为状态机&#xff0c;通过更新组件的state来更新对应的页面显示&#xff08;重新渲染组件&#xff09; class MyComponent extends React.Component {rend…

023.【回溯算法】

1. 回溯算法 回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题而求解的方法。回溯算法可以找出所有解的一般性&#xff0c;同时可以避免不正确的数值。一旦发现不正确的数值&#xff0c;就不再继续下一层而是返回到上一层&#xff0c;以节省时间。简单来说&#xff0c;回…

OpenVino 2023.0学习使用(1)-简介

模型制备 每一个深度学习工作流程都是从获取模型开始的。您可以选择准备一个自定义的网络&#xff0c;使用现成的解决方案并根据您的需求进行调整&#xff0c;甚至可以从在线数据库下载并运行预先训练的网络&#xff0c;例如TensorFlow Hub&#xff0c;Hugging Face&#xff0…

C++入门:类和对象(中)

目录 前言&#xff1a; 一&#xff1a;类的6个默认成员函数 二&#xff1a;构造函数(第一个成员) (1)概念 (2)特性 (3)特性的解析 ⭐特性4 ⭐特性5 ⭐特性6 ⭐特性7 三&#xff1a;初始化列表 (1)引入 (2)概念 (3)注意 四&#xff1a;析构函数(第二个成员) …

2023年软件测试的高薪机会在哪?

没入行或已经入行测试的小伙伴们&#xff0c;快看过来。来看看你们的高薪机会在哪里&#xff01; 我们先来看几个高薪招聘需求&#xff01; 高薪招聘需求1 要求看起来不是很高&#xff0c;应届生和在校生都可以&#xff0c;而且薪资达到了12K&#xff0c;14薪。 但是&#xff0…

roop 一张图片就能生成换脸视频的开源项目

roop的github地址&#xff1a;https://github.com/s0md3v/roop 安装python&#xff08;pip如果需要也安装&#xff09; 记住到 2023-6-18 这天 一定要是python3的10版本&#xff0c;11版本会有包不兼容&#xff0c;我就这个问题耗费了一天。 我使用的是&#xff1a;python3.1…

图的单源最短路算法:Bellman-Ford

Bell-Ford算法思想 对一个点的松弛操作&#xff0c;就是找到经过这个点的另外一条路径&#xff08;多走一条边&#xff09;&#xff0c;使得花费的代价更小。 如果一个图没有负权环&#xff0c;从一点到另外一点的最短路径&#xff0c;最多经过所有的V个顶点&#xff0c;有V-1…

微信代加什么意思

微信代加什么意思&#xff0c;信息流加粉推广怎么做&#xff0c;信息流怎么做加粉推广&#xff1f;信息流微信加粉#信息流代运营#信息流推广#加粉引流推广#抖音引流推广#信息流加粉链路#抖音#百收助推 近期有客户问信息流微信加粉怎么做&#xff1f; 嗯&#xff0c;首先说一下…

开箱即用的shell脚本(一)

目录 一、通过位置变量创建 Linux 系统账户及密码 二、初始化脚本 三、nginx启动脚本 四、每周 5 使用 tar 命令备份/var/log 下的所有日志文件 五、实时监控本机内存和硬盘剩余空间&#xff0c;剩余内存小于 500M、根分区剩余空间小于 1000M时&#xff0c;发送报警邮件给 …

C语言之动态内存分配(1)

目录 本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量&#xff0c;再申请一个数组 这是我们目前知道的向内存申请…

【小沐学Python】Python实现Web服务器(Flask,gevent )

文章目录 1、简介1.1 功能列表1.2 支持平台1.3 安装 2、gevent入门示例2.1 文件IO2.2 MySQL2.3 redis2.4 time2.5 requests2.6 socket2.7 并发抓取文字2.8 并发抓取图片2.9 生产者 - 消费者 3、gevent其他示例3.1 StreamServer3.2 WSGI server3.3 flask3.4 websocket3.5 udp 结…

LeetCode 1254. 统计封闭岛屿的数目

【LetMeFly】1254.统计封闭岛屿的数目 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-closed-islands/ 二维矩阵 grid 由 0 &#xff08;土地&#xff09;和 1 &#xff08;水&#xff09;组成。岛是由最大的4个方向连通的 0 组成的群&#xff0c;封闭岛是…