龙空技术网

springboot-如何集成Redis启用缓存功能

编程少年 399

前言:

而今我们对“redis缓存管理器”大概比较关切,大家都想要剖析一些“redis缓存管理器”的相关内容。那么小编同时在网摘上汇集了一些关于“redis缓存管理器””的相关知识,希望看官们能喜欢,同学们一起来学习一下吧!

一、步骤概览二、步骤说明1.引入依赖

在 pom.xml 文件引入 spring-boot-starter-data-redis、commons-pool2、jackson-databind 依赖包。依赖详情如图所示:

spring-boot-starter-cache:缓存功能集成包。spring-boot-starter-data-redis:Redis 集成包。commons-pool2:Redis 连接池用到的依赖包。jackson-databind:Redis 序列化和反序列需要用到的依赖包。2.定义连接参数

在 aplication.yml 文件中定义 redis 相关连接参数,连接示例如下所示:

spring:  redis:    # Redis所在库索引    database: 1    # Redis 主机地址    host: 127.0.0.1    # Redis 连接端口    port: 6379    # Redis 访问密码    password:    # Redis 连接超时时间    timeout: 5000    # Redis 连接池设置    lettuce:      pool:        # 最大连接数        max-active: 8        # 最大等待时间,单位毫秒        max-wait: 5000
3.定义配置类

定义Redis配置类 RedisConfig(需要添加@Configuration注解),进行Redis的相关配置,主要包括

①. 配置RedisTemplate模板

由于默认情况下,RedisTemplate 使用了 JdkSerializationRedisSerializer 进行键和值的序列化,但是这种方式可能会存在一些问题(如序列化效率低)或者无法满足业务需求(如需要将数据序列化为 JSON 格式),因此需要重新配置 SerializationRedisSerializer 或 Jackson2JsonRedisSerializer 等其他序列化方式,配置代码如下所示:

com.shawn.springboot.integeration.redis.config.redis.RedisConfig#redisTemplate

@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {  RedisTemplate<String, Object> template = new RedisTemplate<>();  template.setConnectionFactory(factory);  Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);  ObjectMapper om = new ObjectMapper();  // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public  om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);  // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常  om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,                           ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);  jacksonSeial.setObjectMapper(om);  // 值采用json序列化  template.setValueSerializer(jacksonSeial);  //使用StringRedisSerializer来序列化和反序列化redis的key值  template.setKeySerializer(new StringRedisSerializer());  // 设置hash key 和value序列化模式  template.setHashKeySerializer(new StringRedisSerializer());  template.setHashValueSerializer(jacksonSeial);  template.afterPropertiesSet();  return template;}
②. 配置缓存管理器

通过配置缓存管理器,可以将 Redis 作为缓存存储介质,并利用缓存管理器来统一管理缓存的创建、读取、更新和删除操作,从而提高系统性能和响应速度。

如果不配置缓存管理器,那么在业务代码中就需要手动调用 RedisTemplate 的一些方法来完成缓存的相关操作,而无法使用相关的缓存注解如 @Cacheable、@CachePut、@CacheEvict等方法,配置代码如下所示:

com.shawn.springboot.integeration.redis.config.redis.RedisConfig#cacheManager

@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {  // 生成两套默认配置,通过 Config 对象即可对缓存进行自定义配置  RedisCacheConfiguration cacheConfig1 = RedisCacheConfiguration.defaultCacheConfig()  // 设置过期时间 10 分钟    .entryTtl(Duration.ofMinutes(10))    .prefixCacheNameWith("cache:user:")  // 禁止缓存 null 值    .disableCachingNullValues()  // 设置 key 序列化    .serializeKeysWith(keyPair())  // 设置 value 序列化    .serializeValuesWith(valuePair());  RedisCacheConfiguration cacheConfig2 = RedisCacheConfiguration.defaultCacheConfig()  // 设置过期时间 30 秒    .entryTtl(Duration.ofSeconds(30))    .prefixCacheNameWith("cache:admin:")    .disableCachingNullValues()    .serializeKeysWith(keyPair())    .serializeValuesWith(valuePair());  // 返回 Redis 缓存管理器  return RedisCacheManager.builder(factory)    .withCacheConfiguration("user", cacheConfig1)    .withCacheConfiguration("admin", cacheConfig2)    .build();}
com.shawn.springboot.integeration.redis.config.redis.RedisConfig#keyPair
// 用于缓存管理器 key 序列化private RedisSerializationContext.SerializationPair<String> keyPair() {  	return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());}
com.shawn.springboot.integeration.redis.config.redis.RedisConfig#valuePair
// 用户缓存管理器value序列化private RedisSerializationContext.SerializationPair<Object> valuePair() {   //使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis的 value值(默认使用JDK的序列化方式)   Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);   ObjectMapper om = new ObjectMapper();   // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public   om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);   // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常   om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,                           ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);   jacksonSeial.setObjectMapper(om);  return RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial);}
4.启用缓存

在 springboot 启动类上添加 @EnableCaching 注解启用缓存功能,当在启动类上添加 @EnableCaching 注解时,Spring Boot 会自动检测项目中的缓存依赖(如 Spring Data Redis、Ehcache 等)并进行相应的配置。这样,你就可以在类中使用 Spring 的缓存注解(如 @Cacheable、@CachePut、@CacheEvict 等)来实现缓存功能。

三、如何使用缓存注解1. @Cacheable

@Cacheable 注解可以标记在方法上,表示该方法的返回结果将会被缓存起来,以便后续直接从缓存中获取数据。示例代码:

@Cacheable(value = {"product"}, key = "#id")@Overridepublic Product select(String id) {  // 模拟从数据库中获取数据  Product product = stringProductHashMap.get(id);  log.info("从 DB 中查询产品:[{}]", id);  return product;}
value: 表示缓存的名称,即指定将结果缓存在哪个缓存区域中。在示例中,value = {"product"} 表示将结果缓存在名为 "product" 的缓存区域中。key: 用于指定缓存的键值,即根据 key 来存储和获取缓存中的数据。在示例中,key = "#id" 表示根据方法的参数 id 来作为缓存的键值。2. @CachePut

@CachePut 注解表示被注解的方法总是会执行,并且将方法返回的结果放入缓存中。示例代码:

@CachePut(value = "product", key = "#product.id")@Overridepublic Product saveOrUpdate(Product product) {  // 模拟数据库保存数据  stringProductHashMap.put(product.getId().toString(), product);  log.info("从 DB 中更新产品:[{}]", product.getId());  return product;}

这里的 key = "#product.id" 表示缓存的键值是根据方法参数 product 对象的 id 属性来确定的。

当 saveOrUpdate 方法执行时,如果缓存中已存在相同 id 的记录,则会使用新的 product 对象更新缓存中的数据。由于缓存的键值是根据 product 的 id 属性来确定的,因此每次更新缓存时都会根据最新的 product 对象重新生成缓存的键值。

3. @CacheEvict

@CacheEvict 注解表示被注解的方法执行后将清除指定的缓存项。示例代码:

@CacheEvict(value = "product", key = "#id")@Overridepublic void delete(String id) {  // 模拟数据库操作  stringProductHashMap.remove(id);  log.info("从 DB 中删除产品:[{}]", id);}

标签: #redis缓存管理器