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
相关文章
|
1月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
50 0
|
18天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
47 5
|
23天前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
36 4
|
1月前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
61 4
SpringBoot必须掌握的常用注解!
|
23天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
69 2
|
23天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
40 2
|
26天前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
31 2
|
27天前
|
JSON Java 数据格式
springboot常用注解
@RestController :修饰类,该控制器会返回Json数据 @RequestMapping(“/path”) :修饰类,该控制器的请求路径 @Autowired : 修饰属性,按照类型进行依赖注入 @PathVariable : 修饰参数,将路径值映射到参数上 @ResponseBody :修饰方法,该方法会返回Json数据 @RequestBody(需要使用Post提交方式) :修饰参数,将Json数据封装到对应参数中 @Controller@Service@Compont: 将类注册到ioc容器
|
27天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
38 2
|
1月前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
57 2
下一篇
DataWorks