SpringBoot中的Redis 缓存问题及操作方法

Spring Boot中的Redis缓存

Redis是一种开源的内存存储系统,可用于存储键值、缓存和消息队列等数据结构,被广泛用于Web应用程序的缓存方案中。Spring Boot中提供了对Redis的很好的支持,本文将对Spring Boot中Redis的缓存问题及操作方法进行详细讲解。

一、关于Redis缓存

Redis缓存的优势

  • 速度快:将数据存在内存中,读写速度非常快。
  • 支持多种数据结构:Redis支持各种数据类型的操作,例如字符串、哈希表、列表、集合等。
  • 可扩展性强:Redis支持分布式,数据可以分片存储在多个节点上,可以通过添加节点来扩展集群的容量。

Redis缓存的缺点

  • 数据存储在内存中,如果机器重启,则数据将丢失。因此,Redis更适合作为临时数据存储、缓存以及会话解决方案等。
  • 对于一些简单的存储解决方案,例如KV存储,Redis可能不是最好的选择。

二、Spring Boot中Redis缓存的操作

在Spring Boot中使用Redis缓存需要引入spring-boot-starter-data-redis依赖,本文假设此依赖已经添加到项目中。

1. 开启Redis缓存

在Spring Boot中开启Redis缓存非常简单,只需要通过注解开启@EnableCaching即可:

@SpringBootApplication
@EnableCaching
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

在要使用缓存的方法上使用注解@Cacheable即可将查询结果自动缓存到Redis中。

2. 缓存清除

在Redis中,缓存的失效一般是基于时间的,但是如果需要手动清除缓存,可以使用@CacheEvict注解:

@CacheEvict(value = "userCache", key = "'user:'+#id")
public void deleteUser(String id) {
    // delete user from database
}

上述代码中的@CacheEvict注解将清除userCache中键为user:xxx的缓存,其中xxx为传入参数id的值。

3. 多级缓存

在Spring Boot中实现多级缓存也非常容易,可以使用@CacheConfig注解来指定缓存的名称和策略,再在需要使用缓存的方法上使用@Cacheable注解即可:

@Service
@CacheConfig(cacheNames = "userCache", cacheManager = "cacheManager")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    @Cacheable(key = "'user:'+#id")
    public User findById(String id) {
        return userRepository.findById(id);
    }

    // ...
}

上述代码中使用了@CacheConfig注解来指定缓存的名称为userCache,缓存策略为cacheManager。在findById方法上,使用@Cacheable注解将查询结果缓存到Redis中,缓存的键为user:xxx,其中xxx为传入参数id的值。

三、示例说明

示例1:从Redis中获取数据

本示例演示如何使用@Cacheable注解获取Redis缓存中的数据。

  • 添加依赖

在pom.xml中添加spring-boot-starter-data-redis依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 创建Redis配置文件

在application.properties中添加Redis的配置:

spring.redis.host=localhost
spring.redis.port=6379
  • 创建Redis配置类
@Configuration
@EnableCaching
public class RedisConfig {

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

        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();

        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(serializer);
        redisTemplate.setHashValueSerializer(serializer);

        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(factory);
        return cacheManager;
    }
}
  • 编写业务逻辑
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    @Cacheable(value = "user", key = "#id")
    public User findById(String id) {
        System.out.println("query from database");

        return userRepository.findById(id);
    }
}
  • 测试应用
@Service
public class UserServiceImplTest {

    @Autowired
    private UserService userService;

    @Test
    public void testFindById() {
        String id = "1";
        User user1 = userService.findById(id);
        User user2 = userService.findById(id);

        System.out.println(user1);
        System.out.println(user2);
    }
}

在运行测试用例时,第一次查询会从数据库中获取数据并将结果缓存到Redis中,第二次查询将从Redis缓存中获取数据。

示例2:操作缓存

本示例演示如何使用@CacheEvict注解清除缓存。

  • 编写业务逻辑
@Service
public class UserServiceImpl implements UserService {

    @Override
    @CacheEvict(value = "user", key = "#id")
    public void deleteUserById(String id) {
        System.out.println("delete from database");
    }
}
  • 测试应用
@Service
public class UserServiceImplTest {

    @Autowired
    private UserService userService;

    @Test
    public void testDeleteUserById() {
        String id = "1";
        User user1 = userService.findById(id);
        System.out.println(user1);

        userService.deleteUserById(id);

        User user2 = userService.findById(id);
        System.out.println(user2);
    }
}

在测试应用中,首先查询用户数据并将其缓存在Redis中,然后调用deleteUserById方法将用户数据从数据库和Redis中删除,最后再次查询用户数据,因为缓存已经失效,所以将从数据库中查询。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中的Redis 缓存问题及操作方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • windows+mysql集群搭建-三分钟搞定集群

    原文:http://blog.csdn.net/chenxiaochan/article/details/50856072 1、mysql-cluster-gpl-7.4.9-winx64 下载方式:   http://dev.mysql.com/downloads/cluster/ 2、两台电脑 一台配置管理节点,一个数据节点和一个sql节点,一台配置一个…

    MySQL 2023年4月13日
    00
  • MySQL学习(七):Innodb存储引擎索引的实现原理详解

    MySQL学习(七):Innodb存储引擎索引的实现原理详解 索引的概念 索引是一种数据结构,它可以帮助我们快速的定位特定数据。在数据库中,我们可以通过创建合适的索引来提高多种操作的效率,比如查询、排序、连接、聚合等。 Innodb存储引擎 Innodb是MySQL自带的一种存储引擎,它支持事务、行级锁等高级特性,因此被广泛应用在各种复杂应用场景中。 索引的…

    database 2023年5月22日
    00
  • PHP使用SWOOLE扩展实现定时同步 MySQL 数据

    PHP使用SWOOLE扩展实现定时同步MySQL数据可以分为以下几个步骤: 步骤一:安装SWOOLE扩展在PHP的环境中安装SWOOLE扩展,可以采用源码编译、pecl扩展安装等方式进行安装。SWOOLE扩展提供了一种高效的方式可以在PHP中与网络编程、异步编程、并发编程等进行更加方便的交互。 步骤二:编写数据同步脚本在PHP中编写数据同步脚本,通过SWOO…

    database 2023年5月22日
    00
  • SQL 时间格式化函数

    当我们使用 SQL 查询数据库时,经常需要将日期和时间的数据以各种不同的格式显示出来。SQL 时间格式化函数可以将日期和时间类型的数据以指定格式转化为字符串。 下面是SQL支持的三个主要的日期和时间类型: DATE 包含日期信息,以“YYYY-MM-DD”(年-月-日)格式进行存储。 TIME 包含时间信息,以“HH:MM:SS”(小时:分:秒)格式进行存储…

    database 2023年5月22日
    00
  • Python中MySQLdb和torndb模块对MySQL的断连问题处理

    Python中使用MySQLdb和torndb这两个模块对MySQL的断连问题处理,主要分为两步: 设置自动重连 在使用MySQLdb和torndb连接MySQL数据库时,需要在连接时设置connection pool,以确保在连接断开时能够自动尝试重连。具体的实现方式如下: 使用MySQLdb: import MySQLdb db_conn = MySQL…

    database 2023年5月21日
    00
  • Arthas在线java进程诊断工具在线调试神器详解

    Arthas在线java进程诊断工具在线调试神器详解 Arthas是阿里开源的一款基于Java的实时诊断和监控工具。它可以在生产环境中实时诊断Java线程、查看应用内部信息、动态修改变量等,对于线上问题的排查和性能优化非常有帮助。本文主要介绍Arthas的使用方法,包括Arthas的安装、启动和基本功能的应用。 安装Arthas Arthas支持多种安装方式…

    database 2023年5月21日
    00
  • Python的Django框架中的select_related函数对QuerySet 查询的优化

    在Python的Django框架中,Django提供了select_related函数,可以对QuerySet查询进行优化,减少数据库查询次数,提升网站性能。接下来,我将为你详细讲解如何使用select_related函数,以及使用select_related函数的优势。 什么是select_related函数 select_related是Django框架…

    database 2023年5月22日
    00
  • sql format()函数的用法及简单实例

    当我们在开发web应用时,在处理sql查询语句时,往往需要在查询语句中动态地加入一些变量,这些变量来自于用户的输入或系统计算。为了防止sql注入攻击和保持查询语句的可读性,我们通常需要使用特定的sql处理函数来将变量与sql字符串进行拼接。 SQL中的format()函数可以方便地实现将变量与字符串拼接的功能。该函数的基本语法如下: FORMAT( form…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部