SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案

这篇具有很好参考价值的文章主要介绍了SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.非注解式实现

2.1使用之前要明确使用的业务场景

例如我们在登录时,可以让redis缓存验证码,又如在分类下显示菜品数据时,我们可以对分类和菜品进行缓存数据等等。

2.2导入Redis相关依赖

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

2.3在使用的controller层导入RedisTemplate

例如:SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

说明一下:这里为什么使用@Resource注解而不使用@Autowired注解。

在Spring框架中,@Resource和@Autowired都是用来完成依赖注入的注解,它们可以将其他组件或者资源注入到当前的类中。在Spring框架中,@Resource和@Autowired都是用来完成依赖注入的注解,它们可以将其他组件或者资源注入到当前的类中

@Resource是Java提供的一个通用注解,而@Autowired是Spring框架提供的注解。@Resource注解默认按照名称进行装配,通过name属性指定注入的目标对象名称。而@Autowired默认按照类型进行装配,它会自动根据类型选择合适的对象进行注入。另外,@Autowired注解可以配合@Qualifier注解一起使用,通过指定具体的bean名称来完成注入。

其次,@Resource可以用于注入任意的bean,包括其他类、接口、甚至是字符串等类型的资源而@Autowired注解主要用于注入其他的bean对象

此外,@Resource注解可以标注在字段、setter方法、构造方法和方法上,而@Autowired注解通常标注在字段和构造方法上。

在实践中,选择使用@Resource还是@Autowired取决于具体的需求和场景。如果需要按照名称进行注入,或者需要注入的对象是一个非Spring托管的对象,可以使用@Resource注解。如果只是简单的注入Spring托管的对象,并且希望按照类型自动选择合适的bean进行注入,可以使用@Autowired注解。

需要注意的是,@Resource和@Autowired注解都需要对应的类进行配置,以让Spring框架知道需要进行依赖注入的对象。

通过上面的说明,其实我们自己内心里已经有答案,孰强孰弱啦。

 2.4此时,我们要配置Redis

2.4.1配置application.yml

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

2.4.2编写RedisConfig配置类

由于Redis是一个内存数据库,它将数据存储在内存中,因此需要将数据序列化为字节流进行存储。在将数据存入Redis或从Redis中取出数据时,需要进行序列化和反序列化的操作。

@Configuration
public class RedisConfig extends CachingConfigurerSupport {


    /**
     * 自定义RedisTemplate
     * 设置Redis序列化方式,默认使用的是JDKSerializer的序列化方式,效率低,所以这里设置使用FastJsonRedisSerializer
     */
    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 设置redis连接(LettuceConnectionFactory实现了RedisConnectionFactory)
        redisTemplate.setConnectionFactory(connectionFactory);

        FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);

        // key设置StringRedisSerializer序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // Hash key设置序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());


        return redisTemplate;
    }

}

可以参考一下,或许有更好的,大家可以借鉴一下。

2.5使用缓存(验证码为例)

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

 此时我们可以测试一下,在此之前呢,怎么看缓存数据是一个问题,所以,安排一下Redis的可视化工具:

链接:https://pan.baidu.com/s/1OUNza9ea9fQepXqNTeTq-g 
提取码:frpd

2.6测试

 SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

这只是一个简单的应用,然后我们再来一个其他的案例:缓存菜品数据

业务场景如下:

每个分类,比如湘菜,川菜,每次点击都需要再次重新查询数据库,不仅压力更大而且造成资源浪费,我们可以把这些查询的数据,按菜品分类给存入redis中,设置其30分钟生存周期,这样再次点击查看,就不会再查询数据库,直接从redis中获取数据,降低服务器压力也避免资源浪费。

缓存逻辑:

我们先动态构造唯一key值,然后根据key来获取value,接下来判断value是否为空,若不为空则表示redis中有该分类下的数据,直接返回;若为空则需要去数据库查询数据,然后再把查询的数据放入redis缓存中,下次再查询直接走redis缓存,不用再次查询数据库。

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

这个就不再演示了,到这里我们就可以明显觉得,代码量上来了,这只是一个查询都这样,再细想一下,这个查询会不会因为这个缓存出现问题,比如说我们新增了菜品,修改了菜品,删除了菜品,这个缓存区是不是得动一动,那这个重复的代码多不多,显而易见。

2.使用Spring Cache框架优化Redis缓存的过程

简单介绍一下这一位大咖:Spring Cache框架是Spring框架提供的一套基于注解的缓存解决方案,它在应用程序中简化了缓存操作的管理和使用。

Spring Cache框架的核心思想是通过在方法上添加缓存注解,来实现自动缓存的功能。它提供了一些常用的注解,如:

  • @Cacheable:标注在方法上,表示该方法的返回结果可以被缓存,当方法被调用时,会首先检查缓存,如果缓存命中,则直接返回缓存中的结果,不再执行方法体中的逻辑。
  • @CachePut:标注在方法上,表示该方法的返回结果需要更新缓存,每次方法被调用后,都会将返回结果更新到缓存中。
  • @CacheEvict:标注在方法上,表示该方法会清除缓存中的数据,可以用于在更新或删除数据时清除相应的缓存。

2.1导入Spring Cache依赖

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

2.2启动类上加上注解开启缓存

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

 2.3返回结果类实现序列化接口

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

 2.4改造上一个案例的代码

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

不用意外,就是什么关于redis的什么都不剩了 ,我们只需要再控制层的接口上加上一个注解,就完事了。

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

 2.5测试

测试后即会在redis中产生一个这样的目录结构

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

对照接口上的注解再理解一下你就会明白其中的意思了。

这个时候你和非注解方式对比你会发现一个问题,过期时间去哪啦,没法设置过期时间了!

3.再次优化Spring Cache使用 

使用@Cacheable时,无法直接设置过期时间,需要自定义RedisCacheManager来实现ttl设置。

3.1编写TtlRedisCacheManager类来获取注解@Cacheable的参数

public class TtlRedisCacheManager extends RedisCacheManager {
    public TtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }

    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        String[] cells = StringUtils.delimitedListToStringArray(name, "=");
        name = cells[0];
        if (cells.length > 1) {
            long ttl = Long.parseLong(cells[1]);
            // 根据传参设置缓存失效时间,默认单位是秒
            cacheConfig = cacheConfig.entryTtl(Duration.ofMinutes(ttl));
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

3.2修改RedisConfig配置类

@Configuration
public class RedisConfig extends CachingConfigurerSupport {


    /**
     * 自定义RedisTemplate
     * 设置Redis序列化方式,默认使用的是JDKSerializer的序列化方式,效率低,所以这里设置使用FastJsonRedisSerializer
     */
    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 设置redis连接(LettuceConnectionFactory实现了RedisConnectionFactory)
        redisTemplate.setConnectionFactory(connectionFactory);

        FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);

        // key设置StringRedisSerializer序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // Hash key设置序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());


        return redisTemplate;
    }

    /**
     * 实例化自定义的缓存管理器
     */
    @Bean
    @Primary
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
        return new TtlRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }


}

注意:项目中已配置了RedisCacheManager需要在原配置的bean上添加注解@Primary,以免造成干扰

3.3修改controller层数据接口的注解

SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案,Java技术,缓存,redis,数据库

根据你在RedisCacheManager中设置的什么格式来填写value即可。

即完成对Redis缓存数据的使用。有什么问题还请留言。文章来源地址https://www.toymoban.com/news/detail-573187.html

到了这里,关于SpringBoot使用Redis作为缓存器缓存数据的操作步骤以及避坑方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux服务器使用Redis作为数据缓存,并用log4j2进行日志记录

    前言 个人网站使用Vue作为前端,SpringBoot作为后端,MySQL作为数据库,但前端每次请求都会从MySQL数据库中读取数据,而MySQL数据库的数据是存储于服务器磁盘中,所以响应速度有一定影响。之前了解过一点Redis数据库,该数据库数据存储于内存中(也可以持久化于磁盘中),数

    2024年02月08日
    浏览(39)
  • springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库

    代码讲解: 3-点赞功能-定时持久化到数据库(pipeline+lua)-完善过程2_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1w14y1o7BV 本文章代码: blogLike_schedule/like03 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like03 数据

    2024年02月15日
    浏览(40)
  • 使用SpringCache操作Redis缓存数据

    SpringCache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。 SpringCache提供了一层抽象,底层可以切换不同的缓存实现,例如: EHCache Caffeine Redis 使用(导入redis跟SpringCache的 依赖即可) @EnableCaching 开启缓存注解功能,加在启动类上 @Ca

    2024年01月20日
    浏览(24)
  • SpringBoot 如何使用 Ehcache 作为缓存

    在现代分布式应用程序中,跟踪请求和了解应用程序的性能是至关重要的。Spring Boot Sleuth是一个分布式跟踪解决方案,它可以帮助您在分布式系统中跟踪请求并分析性能问题。本文将介绍如何在Spring Boot应用程序中使用Sleuth进行分布式跟踪。 Spring Boot Sleuth是Spring Cloud的一部分

    2024年02月07日
    浏览(27)
  • redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

    目录 1.缓存 2.redis不仅仅可以做缓存,只不过说他的大部分场景,是做缓存。本地缓存重启后缓存里的东西就没有了,但是redis有。 3.redis有几个特性:查询快,但是是放到内存里的〈断电或者重启,数据就丢了),所以他有特定的持久化机制 4.服务器(centos)安装redis 5. redis在

    2024年02月14日
    浏览(31)
  • springboot+redis+mysql+quartz-使用pipeline+lua技术将缓存数据定时更新到数据库

    代码讲解:7.3点赞功能-定时持久化到数据库-Java程序整合pipeline+lua_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1Lg4y1w7U9 代码: blogLike_schedule/like08 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like08 数据库表:

    2024年02月13日
    浏览(32)
  • Redis基本数据类型常用操作以及使用场景

    单值缓存 对象缓存 分布式锁 计数器 分布式系统全局序列号       对象缓存 电商购物车 优缺点 队列 微博消息和微信公号消息  微信抽奖小程序  微信微博点赞,收藏,标签   集合操作实现微博微信关注模型 集合操作实现电商商品筛选  常用操作  Zset集合操作实现排行

    2024年02月11日
    浏览(33)
  • 【Redis】Redis作为缓存

    【Redis】Redis常见面试题(2) 缓存在计算机系统中有着重要的作用,它可以显著提高系统的性能和响应速度 提升系统性能: 缓存将常用的数据或计算结果存储在高速的存储介质中,如内存,以便快速地响应请求。通过减少对慢速存储介质(如硬盘或数据库)的访问次数,可

    2024年02月09日
    浏览(31)
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

    上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 需要注意的点是: 在上锁和释放锁的过程中要保证 原子性操作 核心是上锁和解锁的过程 关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX] 3.1 一个服务按照多个端口同时

    2023年04月10日
    浏览(38)
  • pipeline、lua、redis事务以及操作springboot操作redis的一些学习以及思考

    ai答:在使用 Jedis 进行 Redis 操作时,调用 jedis.close() 的目的是释放与 Redis 服务器的连接并关闭 Jedis 实例,以便释放资源并确保连接的正确关闭。 具体原因如下: 资源释放:调用 jedis.close() 方法会自动释放 Jedis 实例占用的资源,包括网络连接、线程资源等。如果不调用 cl

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包