Spring基于注解整合Redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【8月更文挑战第5天】

Spring基于注解整合Redis

Redis是一种内存中的数据结构存储系统,被广泛用于缓存、消息队列等场景。Spring提供了对Redis的整合,使得在Spring应用中使用Redis变得更加方便和灵活。本文将介绍如何使用Spring注解来整合Redis。

1. 添加依赖

首先,在pom.xml文件中添加以下依赖,以引入Spring Data Redis:

xmlCopy code
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置Redis连接

application.properties文件中配置Redis连接信息,例如:

propertiesCopy code
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=

你可以根据实际情况修改以上配置项。

3. 创建Redis配置类

创建一个Redis配置类,用于配置Redis相关的bean。我们可以使用@Configuration注解来标识这是一个配置类,并使用@EnableCaching注解来开启Spring缓存支持。

javaCopy code
@Configuration
@EnableCaching
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory);
        return cacheManager;
    }
}

上述配置创建了一个名为redisTemplateRedisTemplate实例,并配置了连接工厂。另外,我们还创建了一个名为cacheManagerCacheManager实例,用于管理缓存。

4. 使用注解操作Redis

现在,我们可以在Spring应用中使用注解来操作Redis。以下是一些常用的注解:

4.1 @Cacheable

@Cacheable注解可以应用在方法上,用于开启缓存。当方法被调用时,Spring会先检查缓存中是否存在对应的结果,如果存在,则直接返回缓存的结果;如果不存在,则执行该方法,并将结果存入缓存。

javaCopy code
@Cacheable(value = "users", key = "#userId")
public User getUserById(String userId) {
    // 从数据库或其他数据源获取用户信息
    return userRepository.findById(userId);
}

以上示例中,@Cacheable注解应用在getUserById方法上,指定缓存名称为users,并根据userId作为缓存的key。

4.2 @CachePut

@CachePut注解可以应用在方法上,用于更新缓存。当方法被调用时,Spring会先执行该方法,并将结果存入缓存,而不会去检查缓存中是否已存在。

javaCopy code
@CachePut(value = "users", key = "#user.id")
public User saveUser(User user) {
    // 保存用户信息到数据库或其他数据源
    return userRepository.save(user);
}

以上示例中,@CachePut注解应用在saveUser方法上,将返回的用户对象存入缓存,并以user.id作为缓存的key。

4.3 @CacheEvict

@CacheEvict注解可以应用在方法上,用于删除缓存。当方法被调用时,Spring会从缓存中删除对应的结果。

javaCopy code
@CacheEvict(value = "users", key = "#userId")
public void deleteUser(String userId) {
    // 从数据库或其他数据源删除用户信息
    userRepository.deleteById(userId);
}

以上示例中,@CacheEvict注解应用在deleteUser方法上,根据userId从缓存中删除对应的用户。

4.4 使用SpEL表达式

在上述示例中,我们使用了SpEL(Spring Expression Language)表达式来动态地生成缓存的key。例如,key = "#userId"中的#表示后面跟随的是一个SpEL表达式。 你可以使用SpEL表达式来引用方法参数、调用方法、访问类的属性等,以灵活地生成缓存的key。

5. 使用Redis作为缓存存储

上述示例中,我们使用了默认的RedisTemplate来操作Redis。除了默认的使用方式外,你还可以使用Spring提供的@EnableRedisRepositories注解和RedisRepository接口来实现基于注解的Redis缓存存储。 具体的使用方式可以参考Spring Data Redis的文档。

电子商务网站,我们可以使用Redis作为商品信息的缓存,以提高访问速度和减轻数据库的压力。以下是一个使用Spring注解整合Redis的示例代码:

javaCopy code
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Cacheable(value = "products", key = "#productId")
    public Product getProductById(String productId) {
        // 先检查缓存
        Product cachedProduct = (Product) redisTemplate.opsForHash().get("products", productId);
        if (cachedProduct != null) {
            return cachedProduct;
        }
        
        // 从数据库获取商品信息
        Product product = productRepository.findById(productId);
        
        // 将商品信息存入缓存
        redisTemplate.opsForHash().put("products", productId, product);
        return product;
    }
    @CacheEvict(value = "products", key = "#productId")
    public void deleteProduct(String productId) {
        // 从数据库删除商品信息
        productRepository.deleteById(productId);
        
        // 从缓存中删除商品信息
        redisTemplate.opsForHash().delete("products", productId);
    }
}

在上述示例代码中,我们定义了一个ProductService类,它使用@Service注解标识为一个Spring服务。在方法getProductById中,我们使用了@Cacheable注解来开启缓存,并指定了缓存名称为products,key为productId。首先,我们先从缓存中检查商品信息是否存在,如果存在则直接返回缓存的商品对象。如果缓存中不存在该商品信息,则从数据库中获取商品信息,并将其存入缓存中。在方法deleteProduct中,我们使用了@CacheEvict注解来删除缓存,将指定的商品信息从缓存中删除。这样,当多次调用getProductById方法时,如果该商品信息已存在于缓存中,则直接从缓存中获取,避免了频繁地访问数据库,提升了访问速度和性能。

在使用Spring集成Redis时,需要进行相应的配置。Spring提供了一个RedisTemplate类来支持与Redis进行交互。下面是一个典型的Spring Redis配置文件示例:

xmlCopy code
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <!-- 配置 Redis 连接池 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 设置最大连接数 -->
        <property name="maxTotal" value="100" />
        <!-- 设置最大空闲连接数 -->
        <property name="maxIdle" value="10" />
        <!-- 设置最大等待时间,单位毫秒 -->
        <property name="maxWaitMillis" value="5000" />
    </bean>
    <!-- 配置 Redis 连接工厂 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:hostName="localhost" p:port="6379" p:poolConfig-ref="jedisPoolConfig" />
    <!-- 配置 RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
          p:connectionFactory-ref="jedisConnectionFactory">
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
    </bean>
    <!-- 其他配置 -->
</beans>

上述配置文件主要包含以下几点:

  1. 配置Redis连接池(jedisPoolConfig):Redis连接池用于管理连接到Redis服务器的连接对象。在这里,我们可以配置连接池的最大连接数、最大空闲连接数和最大等待时间等参数,以满足应用程序的需求。
  2. 配置Redis连接工厂(jedisConnectionFactory):Redis连接工厂用于创建与Redis服务器的连接。在这里,我们指定了Redis服务器的主机名和端口,并引用了之前配置的连接池对象。
  3. 配置RedisTemplate(redisTemplate):RedisTemplate是Spring用于与Redis进行交互的核心类。在这里,我们指定了连接工厂对象,以及key和value的序列化方式。在示例中,key和hashKey使用了StringRedisSerializer进行序列化,value使用了JdkSerializationRedisSerializer进行序列化。根据需要,你还可以选择其他的序列化方式,如Jackson2JsonRedisSerializer、GenericToStringSerializer等。 通过以上配置,我们可以在Spring应用程序中注入redisTemplate对象,并使用它进行Redis数据的读写操作。例如,通过调用redisTemplate.opsForValue().set(key, value)来将数据存入Redis,或通过调用redisTemplate.opsForValue().get(key)来从Redis中获取数据。

结论

本文介绍了如何使用Spring注解来整合Redis,并使用缓存相关的注解来简化对Redis的操作。通过合理使用这些注解,可以提高应用的性能和响应速度。同时,你也可以根据实际需求扩展和定制Redis的使用方式。希望本文能够帮助你在Spring应用中高效地使用Redis。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
21 0
|
23天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
12天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
36 4
SpringBoot必须掌握的常用注解!
|
6天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
21 1
|
14天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
54 2
|
14天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
28 1
|
25天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
62 2
|
28天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
8天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
8 0
|
1月前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解