Spring Boot集成Redis实现数据缓存

在这里插入图片描述

🌿欢迎来到@衍生星球的CSDN博文🌿
🍁本文主要学习Spring Boot集成Redis实现数据缓存 🍁
🌱我是衍生星球,一个从事集成开发的打工人🌱
⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️
💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者交流学习。
💠我希望通过每一次学习,让更多读者了解我,也希望能结识更多志同道合的朋友。
💠在今后的日子里,我将继续努力,不断提升自己的专业技能,创造更多价值。

在这里插入图片描述

目录

  • 1.Spring Boot对Redis的支持
    • 1.1 Jedis与Lettuce的区别
    • 1.2 组件的依赖关系
  • 2.RedisTemplate
    • 2.1 操作
    • 2.2 BoundValueOperations
    • 2.3 Spring Boot项目中实现Redis数据缓存
  • 3. Redis缓存的常用操作
    • 3.1 创建与读取缓存数据
    • 3.2 删除缓存数据
    • 3.3 缓存超时失效

学习目标:

  • Spring Boot项目如何集成Redis
  • Redis实现缓存数据的创建、更新以及缓存失效操作
  • 介绍如何将Redis的相关操作封装成通用的工具类

1.Spring Boot对Redis的支持

Spring Boot提供了集成Redis的组件包spring-boot-starter-data-redis,能够非常方便地集成到项目中。spring-boot-starter-data-redis组件主要依赖spring-data-redis和lettuce库。Spring Boot 1.0默认使用的是Jedis客户端,Spring Boot 2.0版本之后改为Lettuce客户端。

1.1 Jedis与Lettuce的区别

虽然Lettuce与Jedis都是连接Redis的客户端程序,但是两者在实现上还是有些不同的:

  • Jedis在实现上直连Redis服务器,在多线程环境下是非线程安全的,除非使用连接池为每个Jedis实例增加物理连接。
  • Lettuce基于Netty的连接实例(StatefulRedisConnection)可以在多个线程间并发访问,并且是线程安全的,它支持多线程环境下的并发访问,同时也是可伸缩的设计,在一个连接实例不够的情况下可以按需增加连接实例。

因此,SpringBoot 2.0之后将之前的Jedis改成了Lettuce。

1.2 组件的依赖关系

Spring Boot提供的Redis组件spring-boot-starter-data-redis也是基于Spring Data封装的,它们之间的依赖关系如图所示。
在这里插入图片描述
如图所示,spring-boot-starter-data-redis和Spring Data Redis两者是包含与被包含的关系,或者说前者更好地封装了后者。

  • Lettuce:可伸缩的Redis客户端,基于Netty NIO框架来有效地管理多个连接。
  • Spring Data Redis:Spring Data项目中的模块,封装了多个Redis客户端,让开发者对Redis的操作更加高效便捷。
  • Spring Data:Spring框架中的重要组成部分,它极大地简化了构建基于Spring框架应用的数据操作,包括非关系数据库、Map-Reduce框架、云数据服务等,同时也支持关系数据库。
  • spring-boot-starter-data-redis:Spring Boot提供的Redis集成启动器(Starter),依赖于spring-data-redis和lettuce库。

2.RedisTemplate

Spring Boot提供的Redis组件spring-boot-starter-data-redis,其中重要的是RedisTemplate。与JdbcTemplate类似,RedisTemplate是Spring针对Redis封装的一个比较强大的模板,以方便使用。只要在所需的地方注入RedisTemplate即可,无须其他额外配置,开箱即用。

RedisTemplate有两个方法经常用到:

opsForXXX()

boundXXXOps()

XXX是value(值)的数据类型。opsForXXX获取到一个操作(Operation),但是没有指定操作的key(键),可以在一个连接(事务)内操作多个key以及对应的value;boundXXXOps获取到一个指定key的操作,在一个连接内只操作这个key对应的value。

2.1 操作

RedisTemplate针对Redis的String、List、Hash、Set、ZSet五种数据类型提供了下面五个基本类来操作对应的数据类型:

  • ValueOperations:针对String类型,实现简单的键-值操作。
  • SetOperations:针对Set类型的数据操作。
  • ZSetOperations:针对ZSet类型的数据操作。
  • HashOperations:针对Hash类型的数据操作。
  • ListOperations:针对List类型的数据操作。

它们的使用特别简单,在调用类中注入RedisTemplate,操作哪种类型的数据就调用其对应的Operations(操作)。调用示例如下:

// 作string类型
redisTemplate.opsForValue().set("key","value");
// 作Hash类型
redisTemplate.opsForHash().put("hash","test","hello");
//  操作List
redisTemplate.opsForList().leftush("list","ysxq");
//  操作Set
redisTemplate.opsForSet().add("set","ysxq");
// 操作zSet
redisTemplate.opsForZSet().add("zset","ysxq");

通过上面的示例,如果要操作String类型的数据,则调用redisTemplate.opsForValue()方法获取ValueOperations实例,最后调用set()或get()方法即可。

当然,RedisTemplate也提供了DefaultValueOperations对象操作字符串类型数据,比如set()、get()、incr()等方法。调用这些方法可以方便地存储任意的Java类型,而无须进行数据的序列化和反序列化操作。

2.2 BoundValueOperations

RedisTemplate提供了API用于对key执行bound(绑定)便捷化操作,可以通过bound封装指定的key,然后执行一系列的操作,而无须显式地再次指定key,即BoundKeyOperations将事务操作封装,由容器控制。

  • BoundValueOperations是针对String类型的绑定操作。
  • BoundSetOperations是针对Set类型的绑定操作。
  • BoundListOperations是针对List类型的绑定操作。
  • BoundZSetOperations是针对ZSet类型的绑定操作。
  • BoundHashOperations是针对Hash类型的绑定操作

例如,我们在某个类或方法中需要反复操作某个特定的key中的数据,则可以先定义对应的BoundKeyOperations,然后使用此类重复操作key中的数据,无须再调用方法中指定的key。示例代码如下:


String key = "ysxq";
// 获取Redis对value的操作对象,需要先设置key
BoundValueOperations boundTemplate = redisTemplate.boundValueOps(key);
boundTemplate.set("bound test");
// 获取vaLue
String value = boundTemplate.get();

通过上面的示例,首先定义key为“ysxq”的BoundValueOperations实例,然后在后续的操作中直接使用定义的boundTemplate实例,操作这个key对应的数据,无须在调用方法中指定key。

2.3 Spring Boot项目中实现Redis数据缓存

Spring Boot项目集成Redis非常简单,只需在项目中增加spring-boot-starter-data-redis的依赖。下面通过示例演示如何在Spring Boot项目中集成Redis。

步骤01 引入Redis依赖包。

在pom.xml中增加spring-boot-starter-data-redis的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

步骤02 修改配置文件。

在application.properties配置文件增加有关Redis的配置:

# Redis 数据库(默认为0)
spring.redis.database=0
# Redis 服务器地址
spring.redis.host=127.0.0.1
# Redis 服务器连接端口
spring.redis.port=6379
#连接池最大连接数《使用负值表示没有限制),默认为8
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制),默认为-1
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接,默认为10
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接,默认为9
spring.redis.jedis.pool.min-idle=2
# 超时时间
spring.redis.timeout=6000

上面的示例配置中,最主要的就是Redis的连接配置,其他的属性都可以使用默认值。

步骤03 验证测试。

配置完成之后,Redis就集成到项目中了。接下来测试Redis是否配置成功。首先创建单元测试类,注入RedisTemplate,然后调用set()方法写入缓存数据来测试Redis是否集成成功。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class TestRedisTemplate {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString() {//调用set()方法创建缓存redisTemplate.opsForValue().set("hello:redis", "hello spring boot");System.out.println("hello:redis: "+redisTemplate.opsForValue().get("hello:redis"));}
}

在上面的例子中,我们使用redisTemplate的set方法缓存了字符串数据“hello spring boot”,然后调用get()方法获取该缓存数据,从而验证数据是否缓存成功。

缓存数据的修改也特别简单,重新调用set()方法即可,Redis会判断key是否存在,若存在则更新缓存的数据。单击Run Test或在方法上右击,选择Run ‘testString’,运行单元测试方法,结果如图所示。

在这里插入图片描述

结果表明创建的单元测试运行成功,我们使用RedisTemplate成功创建并读取缓存数据。同时也说明Spring Boot项目成功集成Redis。

3. Redis缓存的常用操作

在实际项目中,对Redis缓存的常用操作是:创建与读取缓存数据、删除缓存数据、缓存超时等。下面通过示例演示Redis常用操作。

3.1 创建与读取缓存数据

对于常用的缓存数据的创建与读取操作,调用RedisTemplate中的set()、get()方法即可。下面通过示例演示人员信息的缓存创建与读取。

首先,创建User实体类,示例代码如下:

public class User implements Serializable {private String name;@JsonIgnoreprivate String password;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh", timezone = "GMT+8")private Date birthday;@JsonInclude(JsonInclude.Include.NON_NULL)private String desc;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", password='" + password + '\'' +", age=" + age +", birthday=" + birthday +", desc='" + desc + '\'' +'}';}}

在上面的示例中,我们定义了一个普通的User实体类。需要注意的是,Redis缓存整个实体类对象就需要继承Serializable可序列化接口。

然后,创建TestRedisTemplate单元测试,添加读取、创建缓存的测试方法。示例代码如下:

    @Testpublic void testobj() {User user=new User();user.setName("ysxq");user.setPassword("123456");user.setAge(30);ValueOperations<String, User> operations=redisTemplate.opsForValue();// 调用set()方法创建缓存operations.set("user:ysxq", user);// 调用get()方法获取数据User u=operations.get("user:ysxq");System.out.println("name: "+u.getName()+",u.age:"+u.getAge());}

在上面的例子中,调用redisTemplate类的set()方法存储用户对象数据,存储成功后通过get()方法获取该缓存数据。

最后,单击Run Test或在方法上右击,选择Run ‘testString’,运行单元测试方法,结果如图所示。

在这里插入图片描述

结果表明创建的单元测试运行成功,我们使用RedisTemplate成功创建并读取缓存数据。同时也说明Spring Boot项目成功集成Redis。

3.2 删除缓存数据

有时需要把过期或者没用的缓存数据删除,应该如何实现呢?RedisTemplate提供了delete()方法来删除过期的缓存key。下面我们来测试如何删除缓存,示例代码如下:

    @Testpublic void testDelete() {ValueOperations<String, User> operations = redisTemplate.opsForValue();redisTemplate.opsForValue().set("ysxq:deletekey", "need delete");// 删除缓存redisTemplate.delete("deletekey");// 判断key 是否存在boolean exists = redisTemplate.hasKey("deletekey");if (exists) {System.out.println("exists is true");} else {System.out.println("exists is false");}}

在上面的示例中,首先创建缓存ysxq:deletekey,然后删除此key来判断数据是否存在。如图所示,输出结果表明缓存的key和对应的value字符串已经被成功删除。

在这里插入图片描述

3.3 缓存超时失效

Redis可以对存入数据设置缓存超时时间,超过缓存时间Redis就会自动删除该数据。这种特性非常适合有时效限制的数据缓存及删除的场景。下面创建一个User对象,将user数据存入Redis并设置10秒后缓存失效,然后判断数据是否存在并打印结果。

    @Testpublic void testExpire() throws InterruptedException {User user=new User();user.setName("ysxq expire");user.setAge(30);ValueOperations<String,User> operations=redisTemplate.opsForValue();// 创建缓存并设置缓存失效时间operations.set("ysxq:expire",user,1000, TimeUnit.MILLISECONDS);Thread.sleep(500);// 10秒后判断缓存是否存在boolean exists=redisTemplate.hasKey("ysxq:expire");if(exists){System.out.println("exists is true");}else {System.out.println("exists is false");}Thread.sleep(1000);// 10秒后判断缓存是否存在exists=redisTemplate.hasKey("ysxq:expire");if(exists) {System.out.println("exists is true");}else {System.out.println("exists is false");}}

单击Run Test或在方法上右击,选择Run ‘testExpire’,运行单元测试方法,结果如图所示。

在这里插入图片描述

结果表明Redis缓存中已经不存在之前插入的数据,这说明该数据已经过期并被删除。在这种测试方法中可以使用hasKey方法判断key是否存在。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC-----JSR303以及拦截器

目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架&#xff0c;已经包含在JavaEE6.0中1。 JSR303通过在Bean属性中标…

PostgreSQL 数据类型

文章目录 PostgreSQL数据类型说明PostgreSQL数据类型使用单引号和双引号数据类型转换布尔类型数值类型整型浮点型序列数值的常见操作 字符串类型日期类型枚举类型IP类型JSON&JSONB类型复合类型数组类型 PostgreSQL数据类型说明 PGSQL支持的类型特别丰富&#xff0c;大多数…

爬虫框架Scrapy学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

python 异常

1.捕获异常 2.密码爆破 3.

【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

OpenELB部署及应用 一、OpenELB介绍 网址&#xff1a; openelb.io OpenELB 是一个开源的云原生负载均衡器实现&#xff0c;可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区发…

系统IO和标准IO

一.系统IO 系统 I/O&#xff08;Input/Output&#xff09;是计算机操作系统提供给应用程序的一种输入和输出方式。它通过系统调用&#xff08;系统内核提供的函数&#xff09;来实现数据的读取和写入。系统 I/O 可以用于与文件、设备&#xff08;例如磁盘驱动器、网络接口、串…

【1++的C++进阶】之智能指针

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;什么是智能指针二&#xff0c;为什么需要智能指针三&#xff0c;智能指针的发展 一&#xff0c;什么是智能指针 要了解智能指针&#xff0c;我们先要了解RA…

K8S pod资源、探针

目录 一.pod资源限制 1.pod资源限制方式 2.pod资源限制指定时指定的参数 &#xff08;1&#xff09;request 资源 &#xff08;2&#xff09; limit 资源 &#xff08;3&#xff09;两种资源匹配方式 3.资源限制的示例 &#xff08;1&#xff09;官网示例 2&#xff0…

C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序

凑数的&#xff0c;仅供参考。 1 文本格式 /// <summary> /// 《小白学程序》第二十六课&#xff1a;大数&#xff08;BigInteger&#xff09;的Toom-Cook 3乘法 /// Toom-Cook 3-Way Multiplication /// </summary> /// <param name"a"></par…

WebGL 视图矩阵、模型视图矩阵

目录 立方体由三角形构成 视点和视线 视点、观察目标点和上方向 视点&#xff1a; 观察目标点&#xff1a; 上方向&#xff1a; 在WebGL中&#xff0c;观察者的默认状态应该是这样的&#xff1a; 视图矩阵程序&#xff08;LookAtTriangles.js&#xff09; 实际上&…

【资源监视器】设备占用,强制弹出移动硬盘

设备占用&#xff0c;强制弹出移动硬盘 任务管理器中找到资源监视器 资源监视器&#xff1a;找到CPU 输入磁盘&#xff1a;如H: , 点击旁边的刷新 结束句柄 右键

python-字符串去掉空格的常见方法

python提供了去掉字符串空格的方法&#xff0c;可以满足大部分需求。 但在实际应用中&#xff0c;还需要灵活借助python其他方法&#xff0c;来实现字符串空格的删除。 比如&#xff0c;去掉字符串的全部空格、字符串连续空格保留一个等&#xff0c;都需要结合其他的方法来实现…