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日

相关文章

  • Redis redis-trib集群配置

      redis文档:http://doc.redisfans.com/ 参考:https://www.cnblogs.com/wuxl360/p/5920330.html           http://www.cnblogs.com/carryping/p/7447823.html          https://www.jianshu.com/p/2…

    Redis 2023年4月13日
    00
  • PHP使用PDO抽象层获取查询结果的方法示例

    下面是关于“PHP使用PDO抽象层获取查询结果的方法示例”的完整攻略,包括两条示例说明。 PDO抽象层介绍 PDO(PHP Data Objects)是一种PHP操作数据库的抽象层,使得PHP程序能够标准化地访问多种关系型数据库(如MySQL、SQLite、Oracle等),并提供了一组统一的API,方便程序员进行数据库操作。 PDO抽象层提供的主要类有: …

    database 2023年5月21日
    00
  • Oracle Decode()函数使用技巧分享

    Oracle Decode()函数使用技巧分享 Oracle的Decode()函数是一种非常强大的数据转换函数,可以根据给定的条件在多个选项中进行选择,并返回匹配的值。在本篇攻略中,我们将讲解如何使用Decode()函数完成常见的数据转换任务,并提供两个使用示例。 函数介绍 Decode()函数的语法如下: DECODE(expr, search1, res…

    database 2023年5月21日
    00
  • 如何在Python中使用peewee ORM操作数据库?

    如何在Python中使用peewee ORM操作数据库? Peewee是一个轻量级的Python ORM(对象关系映射)库,它提供了一种简单的方式来操作关系型数据库。使用Peewee,我们可以使用Python代码来创建、读取、更新删除关系型数据库中的数据。以下是如何在Python中使用Peewee ORM操作数据库的完整使用攻略,包括连接数据库、创建表、插入…

    python 2023年5月12日
    00
  • MySQL入门(一) 数据表数据库的基本操作

    下面是关于“MySQL入门(一) 数据表数据库的基本操作”的完整攻略。 一、创建MySQL数据库 在MySQL中,可以通过以下命令创建一个新的数据库: CREATE DATABASE <数据库名>; 其中,<数据库名>指代你所创建的数据库的名字,例如: CREATE DATABASE mydb; 这样就创建了一个名为mydb的数据库。…

    database 2023年5月22日
    00
  • MySQL的23个需要注意的地方

    MySQL的23个需要注意的地方攻略 MySQL是一个流行的关系型数据库管理系统,但在使用MySQL时也有很多注意事项,下面列举了23个需要注意的地方: 1. 数据类型的选择 在创建表时需要根据数据类型的需求选择正确的数据类型以减少存储空间和提高查询效率。例如,如果字段只存储0/1值,则可以使用BIT数据类型。 示例: CREATE TABLE test_t…

    database 2023年5月22日
    00
  • 关于Oracle Dataguard 日志传输状态监控问题

    关于Oracle Dataguard 日志传输状态监控问题的完整攻略 背景 Oracle Dataguard是Oracle数据库的一种可靠的高可用解决方案,通过将一个主数据库的数据传输到一个或多个辅助数据库以保持数据的一致性。在数据处理过程中,监控日志传输状态是数据一致性和复制成功的重要指标之一。 监控日志传输状态的方法 1. 使用Data Guard Br…

    database 2023年5月21日
    00
  • MSSQL中递归SQL查询语句实例说明-

    现在我来详细讲解“MSSQL中递归SQL查询语句实例说明”的完整攻略。 MSSQL中递归SQL查询语句实例说明 什么是递归查询 递归查询是指在一个数据集或表中,通过递归方法逐行查询所需要的数据。这种查询方式通常用于树形结构数据的查询。 MSSQL递归查询语句 MSSQL中的递归查询语句是使用WITH RECURSIVE关键字,然后一次性给出递归查询需要使用的…

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