网站怎么做后期维护,怎么做填表网站,灵山县建设局网站,重庆有没有做网站的#x1f33f;欢迎来到衍生星球的CSDN博文#x1f33f;
#x1f341;本文主要学习Spring Boot集成Redis实现数据缓存 #x1f341;
#x1f331;我是衍生星球#xff0c;一个从事集成开发的打工人#x1f331;
⭐️喜欢的朋友可以关注一下#x1faf0;#x1faf0;欢迎来到衍生星球的CSDN博文
本文主要学习Spring Boot集成Redis实现数据缓存
我是衍生星球一个从事集成开发的打工人
⭐️喜欢的朋友可以关注一下下次更新不迷路⭐️作为一名热衷于分享知识的程序员我乐于在CSDN上与广大开发者交流学习。
我希望通过每一次学习让更多读者了解我也希望能结识更多志同道合的朋友。
在今后的日子里我将继续努力不断提升自己的专业技能创造更多价值。目录 1.Spring Boot对Redis的支持1.1 Jedis与Lettuce的区别1.2 组件的依赖关系 2.RedisTemplate2.1 操作2.2 BoundValueOperations2.3 Spring Boot项目中实现Redis数据缓存 3. Redis缓存的常用操作3.1 创建与读取缓存数据3.2 删除缓存数据3.3 缓存超时失效 学习目标
Spring Boot项目如何集成RedisRedis实现缓存数据的创建、更新以及缓存失效操作介绍如何将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 RedisSpring Data项目中的模块封装了多个Redis客户端让开发者对Redis的操作更加高效便捷。Spring DataSpring框架中的重要组成部分它极大地简化了构建基于Spring框架应用的数据操作包括非关系数据库、Map-Reduce框架、云数据服务等同时也支持关系数据库。spring-boot-starter-data-redisSpring 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以及对应的valueboundXXXOps获取到一个指定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的依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency步骤02 修改配置文件。
在application.properties配置文件增加有关Redis的配置
# Redis 数据库(默认为0
spring.redis.database0
# Redis 服务器地址
spring.redis.host127.0.0.1
# Redis 服务器连接端口
spring.redis.port6379
#连接池最大连接数《使用负值表示没有限制)默认为8
spring.redis.jedis.pool.max-active8
# 连接池最大阻塞等待时间(使用负值表示没有限制)默认为-1
spring.redis.jedis.pool.max-wait-1
# 连接池中的最大空闲连接默认为10
spring.redis.jedis.pool.max-idle10
# 连接池中的最小空闲连接默认为9
spring.redis.jedis.pool.min-idle2
# 超时时间
spring.redis.timeout6000上面的示例配置中最主要的就是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 GMT8)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 usernew User();user.setName(ysxq);user.setPassword(123456);user.setAge(30);ValueOperationsString, User operationsredisTemplate.opsForValue();// 调用set()方法创建缓存operations.set(user:ysxq, user);// 调用get()方法获取数据User uoperations.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() {ValueOperationsString, 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 usernew User();user.setName(ysxq expire);user.setAge(30);ValueOperationsString,User operationsredisTemplate.opsForValue();// 创建缓存并设置缓存失效时间operations.set(ysxq:expire,user,1000, TimeUnit.MILLISECONDS);Thread.sleep(500);// 10秒后判断缓存是否存在boolean existsredisTemplate.hasKey(ysxq:expire);if(exists){System.out.println(exists is true);}else {System.out.println(exists is false);}Thread.sleep(1000);// 10秒后判断缓存是否存在existsredisTemplate.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是否存在。