您现在的位置是:群英 > 开发技术 > 编程语言
Spring boot缓存redis实现定时过期有哪些方式
Admin发表于 2022-10-09 18:12:04567 次浏览
这篇文章给大家分享的是“Spring boot缓存redis实现定时过期有哪些方式”,文中的讲解内容简单清晰,易于理解,而且实用性强吗,对大家认识和了解“Spring boot缓存redis实现定时过期有哪些方式”有一定的帮助,有需要的朋友可以参考了解看看,那么接下来就跟随小编的思路来往下学习吧

使用redis进行缓存数据,是目前比较常用的缓存解决方案。常用的缓存形式有一下几种:

1.纯原生代码进行redis的增删改查,手工编写缓存工具类,由开发者在代码中进行调用。

优势:代码由实际使用的开发者进行维护,便于定制化的改造。

2.使用市场上已有的缓存工具,也就是大家常说的大佬的轮子

优势:方便快捷,提升开发效率

添加依赖

修改pom文件引入如下配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.test</groupId>
	<artifactId>common-project</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>common-project</name>
	<description></description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.24</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>2.0.7</version>
		</dependency>
	</dependencies>
</project>

添加配置

application.yml中增加redisd 配置信息

spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    password: *****
    timeout: 10000
server:
  port: 8082

常规缓存

在spring 3.1版本以后,注意是spring的版本,不是spring boot的版本。在spring-context包中合并进去了spring Cache的内容。可以使用注解方式进行缓存设定。

开启缓存

开启缓存只需要在入口函数上增加@EnableCaching注解

@SpringBootApplication
@EnableCaching //开启缓存
public class CommonApplication {
    public static void main(String[] args) {
        SpringApplication.run(CommonApplication.class,args);
    }
}

设置缓存空间

设置缓存空间可能大家不好理解,换一个通俗的说法就是设置要缓存的类,把这个类下面要缓存的数据的key加上一个统一的前缀,也是一个注解:@CacheConfig这里可以设置具体的值如下

@RestController
@RequestMapping("/test")
@CacheConfig(cacheNames = "test-controller")
public class TestController {
    @Autowired
    TestService testService;
    @RequestMapping("/testCache")
    @Cacheable(key = "'testCache'",unless = "#result==null")
    public Object testCache(){
        return testService.getUserInfoList();
    }
}

这里的cacheNames就是我上面说的缓存空间,也许这样还是没办法理解,请看在redis中的缓存情况:

就是说如果我在TestController类下设置的接口缓存数据都会缓存到test-controller这个缓存空间里。

设置缓存

这里就是指具体要缓存的接口数据,使用注解:@Cacheable,具体代码参见上面的代码块。

截止到这里,就可以启动服务,调用接口,会发现数据已经可以缓存到redis中了。但是,这里有一个问题,就是缓存下来的数据,是永久缓存,一旦接口实际的数据有更新,只能通过再设置更新方法来更新缓存,或者删除缓存,我们都知道redis本身是支持设置key的过期时间的,这一特性,让缓存变得更加优雅,所以我们的程序也要有!!!

增加设置缓存过期时间

想要设置缓存过期时间,也并不是很麻烦,只是需要单独增加一个redis的配置类,自定义修改一下缓存管理器就可以了

@Configuration
public class RedisCacheManagerConfig {
    /**
     * redis模板配置以及序列化配置
     *
     * @param factory 工厂
     * @return {@link RedisTemplate}<{@link String}, {@link Object}>
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key 采用的String 的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hashde key 也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value 序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash 的 value序列化方式采用jackson
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        template.afterPropertiesSet();
        return template;
    }
    @Bean
    RedisCacheWriter writer(RedisTemplate<String, Object> redisTemplate) {
        return RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
    }
    @Bean
    CacheManager cacheManager(RedisCacheWriter writer) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        Map<String, RedisCacheConfiguration> configurationMap = new HashMap<>();
        // 配置序列化(解决乱码的问题)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1))//time
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        //此处可以自定义缓存空间的缓存的过期时间,可以根据自己实际情况进行设置,也可以不设置,用统一过期时间
        configurationMap.put("test-controller", config.entryTtl(Duration.ofSeconds(200)));
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return RedisCacheManager.builder(writer)
                .initialCacheNames(configurationMap.keySet())
                .withInitialCacheConfigurations(configurationMap)
                //其他缓存空间缓存过期时间为500S
                .cacheDefaults(config.entryTtl(Duration.ofSeconds(500)))
                .build();
    }
}

增加了此配置类之后,之前的代码均不需要更改,直接启动程序,测试验证,可以看到redis中的数据是被设置了过期时间的

此处可能会有个意外惊喜(小坑):就是直接启动程序后,调用接口报错,提示json格式转换异常,这里是由于先前直接用的默认的redisTemplate,value的反序列化问题,可以将之前缓存的数据清理一下,再重新调用就可以了。

总结

注解方式进行接口数据缓存,在实际项目开发过程中比较常见,我分享的这种方式也是大家比较常用的一种方式,配置简单,开发成本低,使用方便。只需要:

  1. 引入依赖包
  2. 增加redis连接信息
  3. 开启缓存
  4. 添加需要缓存的类或者方法

后记

这里题外记录一下缓存注解中的一下参数含义及用法

另外设置缓存的注解中支持spEL表达式,下面是一些可用的表达式含义



感谢各位的阅读,以上就是“Spring boot缓存redis实现定时过期有哪些方式”的内容了,通过以上内容的阐述,相信大家对Spring boot缓存redis实现定时过期有哪些方式已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注群英网络,群英网络将为大家推送更多相关知识点的文章。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-07-15 17:54:38 
摘要:bootstrap remote的用法:首先设置主页面,并放置好一个模态框;然后在主页面上放一个按钮来触发这个模态窗口的显示;接着给这个按钮绑定点击事件;最后通过“remote: '/sys/toAddUser'”从远程加载内容的地址即可。
2022-05-11 17:58:28 
摘要:区别:1、在内存操作中,栈由操作系统自动分配和释放,而堆由开发人员自主分配和释放;2、在数据结构中,栈是一种运算受限的线性表,只允许表的一端进行插入和删除操作,而堆是一种优先队列,会根据优先级找优先度最高的先执行。
2022-06-24 17:51:29 
摘要:在使用 canvas 绘制某字符串的时候,我们可能想要让该字符串在某处按要求换行。那么应该如何实现,本文就来介绍一下,有兴趣的可以了解一下
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部