springboot集成redis

本文介绍如何在SpringBoot项目中集成Redis实现缓存功能,包括引入依赖、编写工具类、解决乱码问题等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot集成redis


前言

最近使用springboot做项目,使用了springboot+mybatis完成了一些基础接口的开发,其中有个接口,客户端大概需要每个10秒调用一次,每次调用都会连接一次数据库,然后查询,关闭连接,返回。大量频繁的连接数据库,增加了服务器性能的消耗,同时也使接口请求速度变慢。于是使用redis缓存来解决这一问题。
如果有redis不会安装的,可查看我之前的一篇博客,进行安装,地址https://blog.youkuaiyun.com/u012489412/article/details/81218983

1、maven导入依赖包

springboot中要使用redis,先要导入相关的依赖包spring-boot-starter-data-redis,我这里使用maven进行导入。

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

也许你会在别的博客上,还需要导入spring-boot-starter-cache,这种是版本比较老的。我们可以到maven上看一下,spring-boot-starter-cache已经被迁移到spring-boot-starter-data-redis上了。
这里写图片描述

2、编写工具类-方便调用

这里我建立了一个名为RedisUtil的工具类,并定义了几个关于string类型数据的曾删改查。

package com.grg.util.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @Author fangming
 * @Date:2018/7/27
 * @Description:
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 是否存在键为key的某条数据
     *
     * @param key 键值名称
     * @return true表示存在,false表示不存在
     */
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 普通缓存获取
     *
     * @param key
     * @return
     */
    public Object get(String key) {
        if (key == null || !redisTemplate.hasKey(key)) {
            return null;
        }
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 设置永久有效的缓存
     *
     * @param key   键值名称
     * @param value 键值
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置带时间的缓存
     *
     * @param key    键值名称
     * @param value  键值
     * @param offset 失效时间 要大于0 如果time小于等于0 将设置无限期
     */
    public void set(String key, Object value, long offset) {
        redisTemplate.opsForValue().set(key, value, offset);
    }

    /**
     * 删除键为key的数据
     *
     * @param key 键值名称
     */
    public void remove(String key) {
        if (key != null && redisTemplate.hasKey(key)) {
            redisTemplate.delete(key);
        }
    }


}

3、在controller中调用

其实在很多博客中,都是用注解进行缓存,我觉得那些不方便操作,而且会出错。
我喜欢在代码中直接使用。关于缓存什么?我主要是缓存http请求的数据。

    @RequestMapping(value = "/getdata", method = RequestMethod.POST)
    public String getData() {
        Response mResponse = new Response();
        //如果缓存中有,优先从缓存中获取,getStart为key
        if(mRedisUtil.hasKey("getStart")){
           return (String) mRedisUtil.get("getStart");
        }
        List<TestData> mTestData= mITestService.getTestData();
        if (!IsNullUtil.listIsNull(mTestData)) {
            String reStr=mResponse.ok("获取成功",mCcbDevices.get(0));
            //设置缓存
            mRedisUtil.set("getStart",reStr);
            return reStr;
        }else{
            return mResponse.error("获取失败");
        }
    }

    @RequestMapping(value = "/setdata", method = RequestMethod.POST)
    public String setData(String id) {
        Response mResponse = new Response();
        Boolean state = mITestService.updateById(id);
        if (state) {
        //当记录删除时,清掉缓存
            mRedisUtil.remove("getStart");
            return mResponse.ok("设置成功");
        }else{
            return mResponse.error("设置失败");
        }
    }

我在getData方法里,会先判断缓存是否存在,如果存在就从缓存中获取数据返回,如果不存在则从数据库获取数据,并且放到缓存中;
在setData方法里,当数据删除时,我将key为getStart的缓存清理掉。

运行我们的系统,调用接口,查看第一次,从数据库获取了数据,后面都从缓存中获取的。ok效果达到。
我们使用redis desktop manager查看缓存数据,发现缓存数据乱码了,如下
这里写图片描述

4、解决key值和value值乱码

至于为什么会这样,我们可以打开源码看到,它采用的默认序列化和反序列化使用的是
JdkSerializationRedisSerializer,我们这里只修改它的keySerializer和valueSerializer即可。
于是新建一个名为RedisConfig的配置类,修改key值和value值的序列化方式。

/**
 * @Author fangming
 * @Date:2018/7/27
 * @Description:
 */
@Configuration
public class RedisConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate redisTemplateInit() {
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

我们再运行系统,发现已经不会乱码了。
这里写图片描述

好了,系统已经初步集成redis成功。

在 Spring Boot 项目中集成 Redis 数据库,主要涉及以下几个步骤:引入依赖、配置 Redis 连接信息、使用 `RedisTemplate` 或 `StringRedisTemplate` 来操作 Redis 数据库。 ### 引入 Redis 依赖 在 `pom.xml` 文件中添加以下依赖以集成 Redis: ```xml <!-- Redis 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> ``` 这些依赖项将帮助封装与 Redis 交互的底层操作,并提供连接池功能以优化与 Redis 的连接管理,提高性能[^1]。 ### 配置 Redis 连接 在 `application.properties` 或 `application.yml` 文件中配置 Redis 的连接信息。以下是 `application.properties` 的示例配置: ```properties # Redis 配置 spring.redis.host=localhost spring.redis.port=6379 spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=2 spring.redis.lettuce.pool.max-wait=2000ms ``` 如果使用 `application.yml`,则配置如下: ```yaml spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 2 max-wait: 2000ms ``` 这些配置项用于指定 Redis 服务器的地址、端口以及连接池的相关参数。 ### 使用 RedisTemplate 操作 Redis 在 Spring Boot 应用程序中,可以通过注入 `RedisTemplate` 来操作 Redis 数据库。下面是一个简单的示例,展示如何使用 `RedisTemplate` 设置和获取数据: ```java import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class RedisService { private final RedisTemplate<String, Object> redisTemplate; public RedisService(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } } ``` 在这个示例中,`RedisTemplate` 被用来执行基本的键值对操作。`opsForValue()` 方法返回一个 `ValueOperations` 对象,可以用来设置和获取字符串类型的值。 ### 分布式会话场景(Redis-Session) 对于需要支持分布式会话的应用程序,可以利用 Spring Session 提供的功能,通过 Redis 来存储会话信息。这通常涉及到额外的配置和依赖项,但可以极大地简化跨多个服务实例的会话管理。 通过以上步骤,可以在 Spring Boot 项目中成功集成 Redis 数据库,并利用其提供的高性能数据访问能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值