SpringBoot下使用redis缓存机制

本文详细介绍了如何在SpringBoot应用中集成Redis作为缓存机制。从导入依赖、配置数据库,到创建实体类、mapper、service和controller,以及利用navicat和RedisDesktopManager进行数据管理。文中通过实例展示了数据的查询、缓存更新和序列化问题的解决方案,最后总结了SpringBoot中的缓存注解使用。

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

SpringBoot下使用redis缓存机制

  1. 案例的目的是:
    在用户第一次访问时进行mysql查询,然后将该条数据缓存到redis中,后续的查询都直接在redis中进行缓存查询,
    并且在进行修改操作后及时将redis中的数据进行更新

  2. 用到的工具:
    navicat 、RedisDesktopManager、Idea 、Postman

1.导入依赖

        <!--redis缓存-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <!--redis启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <!--myBatisPlus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.配置数据库

application.properties

# mysql配置
spring.datasource.url=jdbc:mysql:///temporary?characterEncoding=utf-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=12345
#redis配置
spring.redis.host=172.16.2.134
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=1

#日志配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3.数据库准备

使用navicat连接mySql
在这里插入图片描述
使用RedisDesktopManager连接redis
在这里插入图片描述

4.实体类 mapper接口 service controller生成

Student

@Data
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String name;

    private String sSex;


}

StudentMapper

public interface StudentMapper extends BaseMapper<Student> {

}

StudentService

public interface StudentService extends IService<Student> {
    Student getById(Integer id);
    Student update(Student student);
}

StudentServiceImpl

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Cacheable(value = "Student",key = "args[0]")
    @Override
    public Student getById(Integer id) {

        return baseMapper.selectById(id);
    }
    @CachePut(value = "Student",key = "args[0].id")
    @Override
    public Student update(Student student) {
        baseMapper.updateById(student);
        return student;
    }
}

StudentController

@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;

    @GetMapping("/demo3/{a}")
    public Student m3(@PathVariable("a") Integer a){
        return studentService.getById(a);
    }

    @PostMapping("/demo4")
    public Student m4(@RequestBody Student student){
        System.out.println(student);
        return studentService.update(student);
    }

}

5.运行程序后的结果

  1. 进行查询
    在这里插入图片描述
    向数据库发送了请求
    在这里插入图片描述

  2. 第二次进行访问
    在这里插入图片描述
    语句没有变化
    在这里插入图片描述

  3. redis中存储状况:
    可以看到redis中自动存放了数据,但是value值是序列化后的数据,不利于解读,文章最后再说解决方案
    在这里插入图片描述

  4. 进行修改
    使用postman发送post请求

在这里插入图片描述
发送了更新的语句
在这里插入图片描述
redis中变化:
可以看到最后的几个字符是不一致的
在这里插入图片描述

浏览器中访问:
信息已经发生变化

在这里插入图片描述

6. redis中的序列化解决

定义一个配置类,加上@Configuration注入到容器中即可

@Configuration
public class MyRedisConfig {
    @Bean
    public RedisCacheConfiguration cacheConfiguration(){
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();

        registerDefaultConverters(conversionService);
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()))
                .withConversionService(conversionService)
                .entryTtl(Duration.ZERO)
                .computePrefixWith(CacheKeyPrefix.simple());

        return configuration;
    }
}

重启后显示结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.缓存注解总结

  1. 项目开启缓存,在主配置类上加@EnableCaching
  2. @Cacheable是表明该方法需要开启缓存,可以指定value即数据缓存存在包名,key属性指定存储时key值
  3. @CachePut(value = "Student",key = "args[0].id")指定该方法进行更新操作后将数据在redis内存中也进行更新
  4. @CacheEvict表示进行数据删除时对redis内存中数据也进行删除
  5. @CacheXX内key设置支持表达式设置,具体参见:Spring缓存注解@Cacheable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值