SpringBoot操作Redis

news2025/1/12 8:57:06

目录

1.IDE创建一个maven项目

2、 添加redis启动器

3.修改配置文件application.properties

4.在测试类中测试 

SpringBoot操作Hash(哈希)

SpringBoot操作List集合类型

SpringBoot操作Set集合类型

SpringBoot操作ZSet集合类型


1.IDE创建一个maven项目

2、 添加redis启动器

pring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,它依赖于 spring-data-redislettuce

另外,这里还有两个小细节:

  • Spring Boot 1.x 时代,spring-data-redis 底层使用的是 Jedis;2.x 时代换成了 Lettuce

  • Lettuce依赖于 commons-pool2

<!-- springboot整合redis--> 
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 使用 lettuce 时要加这个包;使用 jedis 时则不需要。-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
</dependency>
  • Lettuce 的 timed out 问题

在 Spring Boot 2.x 默认使用 Lettuce 之后,会偶发性出现 Redis command timed out 问题,从而导致客户端(Java 代码)无法连接到 Redis Server 的问题。

而且该问题无法正面解决。网上通用的解决方案是:放弃使用 Lettuce 驱动,转而使用 Jedis 驱动。

这种情况下,你需要手动排除 spring-data-redis 对 Lettuce 的依赖,并引入 Jedis 依赖。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <exclusions> <!-- 从依赖关系中排除 -->
    <exclusion>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>
<!-- 此时,也就不想再需要使用 apache 的 commons-pool 包了。-->

如果springboot的版本是2.3.7 中这个问题不存在了  

3.修改配置文件application.properties

## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0

## 以下非必须,有默认值
## Redis 服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)默认 8
spring.redis.lettuce.pool.max-active=8
## 连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1
spring.redis.lettuce.pool.max-wait=-1
## 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
## 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

一般情况下我们用到的就是前三行

## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0

4.在测试类中测试 

SpringBoot操作Hash(哈希)

一般我们存储一个键,很自然的就会使用 get/set 去存储,实际上这并不是很好的做法。Redis 存储一个 key 会有一个最小内存,不管你存的这个键多小,都不会低于这个内存,因此合理的使用 Hash 可以帮我们节省很多内存。

Hash Set 就在哈希表 Key 中的域(Field)的值设为 value。如果 Key 不存在,一个新的哈希表被创建并进行 HSET 操作;如果域(field)已经存在于哈希表中,旧值将被覆盖。

先来看 Redis 对 Pojo 的支持,新建一个 Student 对象(需要实现 Serializable 接口),放到缓存中,再取出来。

  @Test
    void contextLoads() {
        //测试hash
        // ValueOperations valueOperations = redisTemplate.opsForValue();
        //生成操作hash类型数据类
        HashOperations hashOperations = redisTemplate.opsForHash();
        //参数1:数据分组
        //参数2:Field
        //参数3:value
        hashOperations.put("good", "name", "面包");
        hashOperations.put("good", "price", "30");
        hashOperations.put("good", "num", "10");


        Object o = hashOperations.get("good", "name");
        System.out.println(o);
    }

如上述代码所示,hash是使用set,get来添加和获取,这里添加hash需要三个参数分别是,这个数据分组,然后是上述的域,之后是值,同时,获取的时候我们则也是通过两个参数来获取,第一个参数是组,之后是域, 执行测试

SpringBoot操作List集合类型

Redis List 的应用场景非常多,也是 Redis 最重要的数据结构之一。 使用 List 可以轻松的实现一个队列, List 典型的应用场景就是消息队列,可以利用 List 的 Push 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。

@Test
    void testRedisList() {
        //测试list
        ListOperations listOperations = redisTemplate.opsForList();
        //leftPush是从左往后排
        //listOperations.leftPush("list", "hello");
        //listOperations.leftPush("list", "world");
        //listOperations.leftPush("list", "!!!");
        //遍历
        //从第一元素到向后找两个元素
        //List list = listOperations.range("list", 0, 2);
        //list.forEach(e -> System.out.println(e));

        //拿最左边的数据,会删除该数据
        Object leftList = listOperations.leftPop("list");
        System.out.println(leftList);
        //拿最右边数据,会删除该数据
        Object rightList = listOperations.rightPop("list");
        System.out.println(rightList);
    }

list类型,我们这里放入可以通过leftpush和rightpush来进行放入数据,leftpush是作为从左往后放,每次放都会放在左边(即最前边),同理,rightpush的时候是从右往后放,每次放都会放在右边(即最后边),

通过range来遍历集合则是需要三个参数,分别需要的是集合之后两个参数是集合的下标的开始和要找的元素个数,上述代码就是从第一元素开始向后找两个元素,如果使用leftpop,则会显示集合中最左边的元素,但是同时也会删除该元素,即在redis中删除,所以只能使用一次,下次使用的话即是下一个最左边元素,rightpop同理 

Redis List 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

SpringBoot操作Set集合类型

Redis Set 对外提供的功能与 List 类似,是一个列表的功能,特殊之处在于 Set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择,并且 Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。

   @Test
    void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();
        setOperations.add("set","hello");
        setOperations.add("set","hello");
        setOperations.add("set","world");
        setOperations.add("set","!!!");
        setOperations.add("set","!!!");


        Set set = setOperations.members("set");
        set.forEach(e->
                System.out.println(e));
    }

输出结果 

set可以理解为无序排列,但是可以去重

SpringBoot操作ZSet集合类型

Redis Sorted Set 的使用场景与 Set 类似,区别是 Set 不是自动有序的,而 Sorted Set 可以通过用户额外提供一个优先级(Score)的参数来为成员排序,并且是插入有序,即自动排序。

在使用 Zset 的时候需要额外的输入一个参数 Score,Zset 会自动根据 Score 的值对集合进行排序,我们可以利用这个特性来做具有权重的队列,比如普通消息的 Score 为 1,重要消息的 Score 为 2,然后工作线程可以选择按 Score 的倒序来获取工作任务。

   @Test
    void testZset(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
       // zSetOperations.add("news","hello",1);
       // zSetOperations.add("news","world",4);
        //zSetOperations.add("news","good",2);
        //zSetOperations.add("news","bye",3);
        //根据score 从小到大排序,0和3是集合的下标
        Set samll = zSetOperations.range("news", 0, 3);
        samll.forEach(e-> System.out.println(e));
        System.out.println("========================================");
        //根据score 从大到小排序,0和3是集合的下标
        Set big = zSetOperations.reverseRange("news", 0, 3);
        big.forEach(e-> System.out.println(e));
        System.out.println("========================================");
        //根据score的大小权重查询
        Set score = zSetOperations.rangeByScore("news", 3, 4);
        score.forEach(e-> System.out.println(e));
    }

上述输出结果是 

range在这里是按照设置参数时的大小,从小到大排序,后面参数为下标来代表启始和结束

reverseRange则是按照设置参数时的从小到大排序,后面参数为下标来代表启始和结束

rangeByScore则是根据当时设置的score的大小权重来进行查询,后面参数是权重是3和4,排序也是按照这个权重大小

 

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

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

相关文章

dubbo(尚硅谷)学习笔记2

我们现在来做dubbo和springboot整合&#xff1a; 我们先来创建一个springboot项目&#xff1a; 然后把serviceimpl层拷贝过来。 因为我们这个也需要用到公用接口和实体类&#xff0c;所以还是需要导入一下这个依赖&#xff1a; 同样的我们也需要创建一个服务的消费者&#xf…

设计模式之美总结(行为型篇)

title: 设计模式之美总结&#xff08;行为型篇&#xff09; date: 2022-12-26 17:25:29 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. 观察者/发布订阅模式&#xff08;Observer Design Pattern/Publish-Subscribe Design Pattern…

Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例

目录 前言 什么是帧&#xff1f; 什么是Aseprite&#xff1f; 运行环境 正文 示例&#xff1a;绘制人物 制作多帧动画 微调 导出精灵表 总结 作品欣赏 附一个下载链接&#xff1a; 前言 什么是帧&#xff1f; 我们看到的动画都是由一张张图片连续播放而成的&#…

scipy

scipy.interpolate插值方法 import numpy as np def func(x, y):return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2grid_x, grid_y np.mgrid[0:1:100j, 0:1:200j]rng np.random.default_rng() points rng.random((1000, 2)) values func(points[:,0], points[:…

高颜值蓝牙耳机有哪些?音质好颜值高的蓝牙耳机推荐

喜欢安静的人们&#xff0c;相信都会有一副蓝牙耳机吧&#xff0c;作为我们生活当中必不可少的数码产品&#xff0c;除了手机以外&#xff0c;蓝牙耳机几乎也是使用率很高的&#xff0c;它通过蓝牙连接&#xff0c;非常方便&#xff0c;下面是小编精心挑选的四款蓝牙耳机。 一…

告别“限速”,个人网盘进入云时代

配图来自Canva可画 在数字经济广泛渗透的条件下&#xff0c;个人网盘市场也得到了长足发展。而在5G和AI的加持下&#xff0c;个人网盘不断进行技术融合和迭代&#xff0c;云盘已然成为互联网用户以及智能设备存储的基本服务&#xff0c;而其应用场景也顺理成章地开始向各个细分…

window11 node.js 安装与下载

最近电脑莫名其妙的被一些恶意流氓软件捆绑了&#xff0c;今天我直接给恢复出厂设置了。顺便记录一下软件的安装步骤。 1. 先去官网下载 官网地址 ① 进入到官网后如下图所示 ②根据自己电脑选择合适的版本下载&#xff08;我是wiindows 64位 &#xff09; ③ 双击安装包点击…

道路交通警示牌数据集以及训练好的YOLO模型权重文件

道路交通警示牌yolo模型1.交通标志数据集的介绍2.训练出权重文件1.交通标志数据集的介绍 交通标志&#xff08;国外的交通标志&#xff09;数据集是经过标注过的数据集&#xff0c;包括77个类别&#xff1b;标注类别如下&#xff1a; ‘200m’, ‘50-100m’, ‘Ahead-Left’, …

如何写好一份数据分析报告?

数据分析报表怎么做&#xff1f;这是一个很笼统的问题&#xff0c;所以这篇尝试从数据分析报表的3个方面来说下&#xff0c;准备了3天&#xff0c;内容较长&#xff0c;心急的小伙伴先看索引&#xff1a; 数据分析报表的原则数据分析报表的数据来源数据分析报表的可视化展示 0…

【按钮的两种状态 Objective-C语言】

一、继续上一篇文章的按钮案例 1.先说思路: 1)先把最上面的图片按钮实现了 我们拽1个按钮,给它一个背景图,加一个文字“点我啊” 当你鼠标按下去的时候,换成另1个背景图 当你鼠标按下去的时候,按钮的背景图变了,并且上面的文字也变了,变成“摸我干啥” 当你鼠标抬起…

Doris-集成其他系统(四)

目录0、准备1、Spark 读写 Doris1.1 准备 Spark 环境1.2 使用 Spark Doris Connector1.2.1 SQL 方式读写数据1.2.2 DataFrame 方式读写数据&#xff08;batch&#xff09;1.2.3 RDD 方式读取数据1.2.4 配置和字段类型映射1.3 使用 JDBC 的方式&#xff08;不推荐&#xff09;2、…

京东零售大数据云原生架构实践

通常谈到大数据&#xff0c;想到的是大数据平台、Hadoop生态或者数据湖技术&#xff0c;关注于大数据存储、大数据计算方向上的技术发展与应用&#xff1b;谈到云原生&#xff0c;想到的是微服务架构、容器化或者SRE&#xff08;Site Reliability Engineer&#xff09;运维范畴…

圣诞节快乐,程序员们!

一、前言 为了参加圣诞创意大赛&#xff0c;拖着阳过的病体&#xff0c;在咳嗽的间隔时间变长之后&#xff0c;发个帖子沾点节日气氛。前段时间参加了大模型训练营&#xff0c;趁着热度&#xff0c;刷一下AIGC的氛围。 二、创意名 因为生病了&#xff0c;所以就懒&#xff0…

【Pygamre实战】2023人气超高的模拟经营类游戏:梦想小镇代码版火爆全场,免费体验分享下载哦~

前言 梦想还是要有的&#xff0c;万一实现了呢&#xff1f;&#xff01;今天小编就来用代码实现自己专属的城市——特大都市&#xff1a; 梦想小镇启航。顾名思义&#xff0c;梦想小镇是梦想花开之地。自己当市长不香嘛&#xff01; 所有文章完整的素材源码都在&#x1f447;…

Unity3d C#实现类似于王者荣耀技能读条和CD冷却的功能(含源码)

效果 效果如图&#xff0c;主要是释放技能后&#xff0c;有一定的技能的持续时间&#xff08;也可以设置为0&#xff09;&#xff0c;然后技能释放完成后&#xff0c;技能进入了冷却时间的倒计时&#xff0c;技能冷却完成后就可以再次释放。 实现 UI搭建 UI的搭建较为简单就…

react基本使用

react基本使用1.基础知识1.1 React 介绍1.2 React特点声明式UI组件化学习一次&#xff0c;随处使用2.基本使用2.1 React 脚手架&#xff08;CLI&#xff09;使用 React 脚手架创建项目项目目录结构说明和调整2.2 使用React 的基本步骤2.2.1 导入react和react-dom2.2.2 创建reac…

2023风丘内推计划——“你的同事 你来挑”

招 聘 简 章 &#xff08;一&#xff09;企业文化 愿 景&#xff1a;让科技更简单 使 命&#xff1a;为客户创造更多价值&#xff1b;为员工创造更多机会&#xff1b;为社会贡献更多美好&#xff01; 价值观&#xff1a;诚信敬业、持续创新、团队合作、追求卓越、勇担…

Redis高可用之集群架构(第三部分)

引言 集群的实际环境模拟可以参考我之前的文章 单机模拟集群&#xff08;三主两从&#xff09; 一、集群的工作原理 集群中的节点只能使用0号数据库&#xff0c;而单机数据库没有这个限制。集群中的节点本质上就是一个运行在集群模式下的Redis服务器&#xff0c;Redis服务器在…

【endnote学习】为什么引用文献时期刊名没有显示为缩写名形式

为什么引用文献时期刊名没有显示为缩写名形式问题描述问题解决问题描述 在引用文献时&#xff0c;发现有个别文献引用信息中期刊名没有显示为缩写形式。比如(选择显示格式为AIChE): 引用信息里&#xff0c;期刊名“Physical review B”没有自动显示为缩写名。 出现这种情况有…

c++算法基础必刷题目——前缀和与差分

文章目录前缀和与差分算法&#xff1a;1、校门外的树2、值周3、中位数图4、激光炸弹5、二分6、货仓选址前缀和与差分算法&#xff1a; 前缀和与差分算法主要是为了快速求出某个区间的和&#xff0c;例如有一个数组a[10]{0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4…