SpringBoot系列:Spring Boot集成redis

【Redis系列】Spring Boot 集成 Redis 实现缓存功能_springboot redis缓存配置 log.info(“key:{}在Redis中查不到数据.”, key);log.error(“Jedis delete操作出错”, e);log.error(“Jedis get操作出错”, e);log.error(“Jedis set操作出错”, e);* 根据key查询value值。* 设置key-value。* 获取Jedis资源。* 释放Jedis连接。 阅读详情

一、Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的非关系型数据库,并提供多种语言的API。

由于Redis实现使用C语言编写,且采用了I/O多路复用,在响应速度与并发支持上都要优于关系型数据库,所以常被用来配合关系型数据库做高速缓存、共享Session、分布式锁、消息系统等。

Redis的重要性不言而喻,无论是其对于系统,还是对于自身技能而言,我们都应该好好掌握它,不过这里并不是Redis的教学,仅仅介绍Spring Boot如何集成·Redis。

二、redisTemplate方式使用Redis

要使用Redis,首先得引入Redis的依赖,Redis如此受欢迎,自然Spring Boot为它定制了专属的starter。

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

然后在配置文件中,我们需要在spring.redis节点下配置redis的ip、端口、密码、超时时间等等配置。

spring:
  redis:
    host: localhost
    port: 6379
    password: 1234
    timeout: 60000

在SpringBoot中,我们只要配置好对应的属性,就可以使用Redis了,且SpringBoot自动在容器中生成了一个RedisTemplate和一个StringRedisTemplate的Bean对象。但是,这个RedisTemplate的泛型是<Object,Object>,使用时需要频繁强转,编写代码并不是很方便,且这个RedisTemplate,key及value的序列化方式采用了JDK的序列化,会导致在库中的序列化数据看起来乱码。

一般业务中,我们常使用泛型为<String,Object>形式的RedisTemplate,因此我们自己来注入一个RedisTemplate<String,Object>的Bean。

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        redisTemplate.setValueSerializer(serializer);
        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

@Configuration表示这是一个配置类,@EnableCaching用于开启缓存。当配置类@Configuration和@EnableCaching一起注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。

@Bean表示注入一个Bean对象,其中使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的value值,StringRedisSerializer来序列化和反序列化redis的key值。需要一提的事,当多个系统使用同一个(实际通常是同一个Redis集群)时,需要保证每个系统的序列化和反序列化方式一致。

接着我们创建一个CacheDao,提供了set与get方法用于添加和获取缓存,缓存时间这里设置了一分钟。

@Repository
public class CacheDao {

    @Resource
    private RedisTemplate<String, Object> template;

    public void set(String key, Object value){
        System.out.println("添加缓存key->" + key);
        ValueOperations<String, Object> valueOperations = template.opsForValue();
        // 1分钟过期
        valueOperations.set(key, value, 1, TimeUnit.MINUTES);
    }

    public Object get(String key){
        System.out.println("获取缓存key->" + key);
        ValueOperations<String, Object> valueOperations = template.opsForValue();
        return valueOperations.get(key);
    }

}

那么缓存是否起到了作用呢,我们添加测试类UserApi,这是一个Controller,提供添加用户和获取用户的方法。

@RestController
@RequestMapping("user")
public class UserApi {

    @Autowired
    private UserService userService;

    /**
     * 添加用户
     * @param user
     */
    @PostMapping("addUser")
    public String addUser(User user){
        int id = userService.addUser(user);
        return "添加用户成功,主键id:" + id;
    }

    /**
     * 获取用户信息
     * @param id
     * @return
     */
    @GetMapping("getUser")
    public User getUser(@RequestParam(value = "id") int id){
        return userService.getUser(id);
    }

}

接下来是UserService,与之相对应的保存用户和获取用户的方法。IUserDao使用了mybatis,从数据库中获取,这里就不贴具体的代码了,而CacheDao则是上面展示过的,从缓存中读取。在添加用户的时候,我们将用户同时添加到缓存,或取用户的时候,我们将先从缓存中获取,如果缓存中不存在,则去数据库中查找,并同时进行缓存。

@Service
public class UserService {

    @Autowired
    private IUserDao userDao;

    @Autowired
    private CacheDao cacheDao;

    /**
     * 添加用户
     * @param user
     */
    public int addUser(User user){
        userDao.add(user);
        // 添加缓存
        cacheDao.set("user:id:" + user.getId(), user);
        return user.getId();
    }

    /**
     * 获取用户信息
     * @param id
     * @return
     */
    public User getUser(int id){
        // 从缓存中获取
        User user = (User)cacheDao.get("user:id:" + id);
        if(user == null){
            user = userDao.find(id);
            cacheDao.set("user:id:" + user.getId(), user);
        }
        return user;
    }

}

启动项目,下面我们通过swagger-ui进行测试(本项目已经集成了swagger2),我们添加张三、password的数据。
在这里插入图片描述
调用结果显示成功,且id为1。
在这里插入图片描述
然后我们去获取这条数据,使用/user/getUser接口,可以成功获取。
在这里插入图片描述
然后我们查看后台打印的信息,先是调用了缓存,然后又进行了查询数据库,诶……这好像不对啊,我刚刚添加时不是进行缓存了吗,为什么没有生效?
在这里插入图片描述
这是因为我在获取的时候已经超过了缓存生效时间1分钟,这时再次查询,就不会去数据库中查询了。
在这里插入图片描述

三、注解方式使用Redis

在Spring Boot项目中,注解满天飞,其实也可以使用注解形式进行缓存,该机制依赖于Spring CaChe,但是这种方式一般较少,因为其缓存机制依赖方法的入参和返回结果,缺乏一定的灵活性。

缓存的注解主要有@CachePut、@Cacheable、@CacheEvict,都作用于方法上。

  • @CachePut,添加缓存,key可以从入参中获取,value为方法返回值,注意并不是注解的value属性,value属性是用于表示缓存的空间,例如@CachePut(value=“user”, key="‘anno:user?’ + #user.id"),当然这必须要求方法有返回值,否则缓存的数据为空。
  • @Cacheable,既是获取,也是存储,存在缓存则从缓存中获取,不存在则进行缓存,缓存值为方法返回值
  • @CacheEvict表示清除缓存。
    在UserService中,我们新增updateUser更新用户,使用了@CacheEvict注解,getUserAnno获取用户,使用了@Cacheable。
 		/**
     * 修改用户信息
     * @param user
     */
    // @CachePut,每次都会进行缓存添加,缓存值为方法返回值,该方法无返回值无法使用
    // @CachePut(value="user", key="'anno:user:id:' + #user.id")
    // 直接删除缓存,下次获取重新查库
    @CacheEvict(value="user", key="'anno:user:id:' + #user.id")
    public void updateUser(User user){
        userDao.update(user);
    }


    /**
     * 获取用户信息,注解缓存
     * @param id
     * @return
     */
    // @Cacheable存在缓存则从缓存中获取,不存在则进行缓存,缓存值为方法返回值
    @Cacheable(value="user", key="'anno:user:id:' + #id")
    public User getUserAnno(int id){
        return userDao.find(id);
    }

多次调用getUserAnno方法,可以发现,仅第一遍进行了数据库访问,后面都没有调用数据库查询数据。我们接着再调用更新方法,然后在调用getUserAnno又从数据库中查取了。

源码地址:https://github.com/imyanger/springboot-project/tree/master/p10-springboot-redis

玩转 Spring boot 系列:(五)集成 redis 客户端 Jedis 前言: 玩转 Spring boot 系列:(一)使用 Idea 搭建 Spring boot Maven 多模块父子工程(图解) 玩转 Spring boot 系列:(二)配置多开发环境,集成druid数据源(图解) 玩转 Spring boot 系列:(三)集成mybatis,实现增删改查(图解) 玩转 Spring boot 系列:(四)mybatis 集成分页插件 pagehelper 并自定义分页结果集 springboot集成mybatis和自定义分页插件pagehelper... 阅读详情

相关推荐

SpringBoot系列:Spring Boot集成redis,新网银行java面试

一般业务中,我们常使用泛型为<String,Object>形式的RedisTemplate,因此我们自己来注入一个RedisTemplate<String,Object>的Bean。 @Configuration @EnableCaching public class CacheConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectio

m0_65320833的博客 182

SpringBoot之redis中常用的注解

目录 1. @Cacheable 2. @CachePut 3. @CacheEvict 1. @Cacheable 作用是主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 主要参数说明: 1) value : 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:@Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”}。 2) key :缓存的 key,可...

qq_52445443的博客 3248

SpringBoot2.x系列教程(六十八)Spring Boot集成Redis的坑,踩了!

最近项目中使用SpringBoot集成Redis,踩到了一个坑:从Redis中获取数据为null,但实际上Redis中是存在对应的数据的。是什么原因导致此坑的呢? 本文就带大家从SpringBoot集成Redis、所踩的坑以及自动配置源码分析来学习一下SpringBoot中如何正确的使用Redis。 SpringBoot集成Redis 在SpringBoot项目中只需在pom文件中引入Redis对应的starter,配置Redis连接信息即可进行使用了。pom依赖引入: <dependency>

程序新视界 2231

springboot集成redis使用注解

redis简介: Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统 (区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不 足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到 内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的 应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性

sjgllllll的博客 3799

Spring Boot 基于注解的 Redis 缓存使用详解

本篇文章主要介绍了Spring Boot 基于注解的 Redis 缓存使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

百条网络工程师基础面试题(不断更新)

1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。它还处理带宽管理和各种通道。 4)什么是 LAN? LAN 是局域网的缩写。它是指计算机与位于小物理位置的其他网络设备之间的连接。 5)什么是节点? 节点是指连接发生的点。它可以是作为网络一部分的计算机

weixin_42728126的博客 2万+

概述springboot使用redis注解做缓存的基本操作

首先是添加方法,我们需要在方法上添加@CachePut注解,此注解用在添加以及更新的方法上,其中的key属性,是为了给redis中的key赋值,内容自定义,但一般为了key的唯一性,都取参数对象的id作为值,此处#user.id表示取方法阐述中的user的id属性作为值。我们准备五个方法用于测试,增删改查,以及全部查询,方法的返回值不能随便写,由于我们要添加缓存,添加到缓存中的数据是根据方法的返回值来操作的,所以除了删除的操作,方法的返回值都要给定成相应的对象。发现存储的信息变成了json格式,大功告成。

m0_71890428的博客 2747

局域网ip冲突检测工具_python 小工具实现 windows笔记本与 ipad数据互传

宅在家没事的时候就开始琢磨ipad的进阶使用,由于没有mac无法隔空投送,ipad与windows的数据交互表现极差,所以设计了这个ftp小工具。当然,这个工具不仅仅能用于windows与ipad,还可以用于局域网任意两台设备之间程序源码与下载见文章末尾使用说明windows端:biubiubiu.exeipad端: appsotre下载 FE文件管理器windows端操作在c盘下创建ftp目录...

weixin_39866265的博客 4435

SpringBoot篇——SpringBoot集成Redis,详细教程,一篇搞定!

一、首先我们需要了解为什么我们非得要自定义redisTemplate呢?源码中的模板对于数据序列化是这么处理的二、编写流程在config包下新建一个类,命名为RedisConfig,将来关于Redis的配置都写在这个类中即可这段配置,如果我们真正项目中用到了redis,直接拿着用//Redis配置类,需要用@Configuration注解标记这个类是一个配置类//现在这个配置类是一个固定的模板,如果需要配置redis,直接拿走用即可。

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 3225

基于STM32设计的掌上游戏机(运行NES游戏模拟器)详细开发过程

利用STM32单片机移植NES游戏模拟器,完成NES游戏开发,可以玩标准的NES游戏,已测试超级玛丽、魂斗罗之类的都可以正常运行。

4万+

【人工智能】OpenClaw网关API速率限制报错全解析 API rate limit reached. Please try again later.

对应HTTP标准状态码为429(请求过多)。该报错集中出现在OpenClaw GATEWAY DASHBOARD的聊天会话界面,核心特征为:用户最初以为是单一模型服务商的问题,先后更换OpenAI、Gemini、Ollama、Moonshot、Mercury-2等多个主流大模型API后,该报错仍稳定触发,尤其在执行复杂任务时高频出现。

奶爸的编程之路,也就一周冷个三天 6459

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

本文介绍了如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。文章包括配置 Redis 连接、使用 Jedis 和 RedisTemplate 两种方式进行操作的示例代码,并探讨了它们的优缺点。随着互联网应用的不断发展,对于数据的高效读写和缓存处理变得越来越重要。而 Redis 作为一款高性能的缓存数据库,被广泛应用于各种大型系统中。本文将介绍如何在 Spring Boot 项目中集成 Redis,并利用 Redis 实现缓存功能。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168

32、Redis 7系列:Spring Boot集成Redis

32、Redis 7系列:Spring Boot集成Redis

Eyesmoon的博客 1247

在 VS Code 里配置 SAP Joule for Developers 的 ABAP AI side-by-side 能力

摘要: 随着ABAP开发工具链的演进,VS Code逐渐融入ABAP开发流程,SAP Joule for Developers的ABAP AI能力通过side-by-side模式(基于BTP中央服务)为多系统开发提供统一AI支持。该模式避免了各ABAP后端独立升级AI能力的碎片化问题,由管理员配置BTP订阅URL后,开发者可在ADT或VS Code中全局调用。实际落地需注意角色分工(管理员配置服务,开发者填写URL)、AI units资源规划及配置细节(如区分全局与项目级设置)。建议将Joule URL纳入

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 120

微信小程序 - {errCode: 10008, errno: 1500104, errMsg: “writeBLECharacteristicValue:fail write characteris

微信小程序errCode: 10008, errno: 1500104, errMsg: "writeBLECharacteristicValue:fail write characteristics error. 10008, errMsg=The value's length is invalid.",uni-app微信小程序报错,uniApp小程序调用蓝牙api报错,向低功耗蓝牙设备的某个特征写入数据时错误,UniApp微信小程序蓝牙API调用报错10008解决方案,蓝牙设备进行通信时,向设备写入数据

🏆 前端领域优质创作者 4431

Spring Boot系列教程十二:Spring boot集成Redis

一.创建项目 项目名称为 “springboot_redis”,创建过程中勾选 “Web”,“Redis”,第一次创建Maven需要下载依赖包(耐心等待) 二.实现 properties配置文件中添加配置信息 ##########redis############ #redis的IP地址 spring.redis.host=localhost #redis的端口 ...

码农code之路 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Boot系列教程十三:Spring boot集成Sentinel Redis

前言 上一篇文章介绍了spring boot集成单点的redis,然而实际生产环境使用单点的redis风险很高,一旦宕机整个服务将无法使用,这篇文章介绍如何使用基于sentinel的redis高可用方案。 哨兵sentinel的地址如下: 192.168.12.194:26379 192.168.12.194:36379 192.168.12.194:46379 Redis的地址...

码农code之路 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Redis 7.x 系列【34】Spring Boot 集成

直接集成客户端,需要我们自己维护连接配置,获取客户端连接,再执行操作,最后还需要释放资源。Spring 提供了 Spring Data Redis 和 Spring Boot Data Redis Starter ,在 Spring Boot 环境中,可以很方便的连接并操作 Redis。

记录知识、锤炼自我 1975

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Boot系列教程九:Spring boot集成Redis

一.创建项目 项目名称为 “springboot_redis”,创建过程中勾选 “Web”,“Redis”,第一次创建Maven需要下载依赖包(耐心等待) 二.实现 properties配置文件中添加配置信息 1 ##########redis############ 2 3 #redis的IP地址 4 spring.redis.host=localhost...

weixin_30338743的博客 195

Spring Boot 系列: 集成 Redis 数据库 分布式工具 Redisson 缓存 Spring Cache

Spring Boot 集成 Redis 数据库 分布式工具 Redisson 缓存 Spring Cache

weixin_46812727的博客 1014

Jackson 2.x 系列【29】Spring Boot 集成之 Redis 序列化/反序列化

Redis是一个常用的高性能非关系型内存数据库,接下来我们学习在Spring Boot中使用Redis时,集成基于Jackson的序列化/反序列化。

记录知识、锤炼自我 4339

Java直通车系列35【Spring Boot】(学习与其他技术集成Redis、RabbitMQ)

Java直通车系列正在连载更新中,更新的内容包括JSP、Spring MVC、Spring Boot、Spring Cloud完整学习资料以及详细解释代码示例,关注我,持续学习。

TEUTEU的博客 508
上一篇: SpringBoot系列:事务管理器Transactional
下一篇: SpringBoot系列:Spring Boot多数据源,jdbcTemplate方式
杨小格
博客等级 码龄10年 19粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值