使用 StringRedisTemplate 设置过期时间与增量(incr)操作

在现代的微服务架构中,Redis作为内存数据存储的选择越来越普遍。尤其是在需要高效地处理缓存、会话和分布式锁的场景中,Redis发挥了巨大的作用。本文将讨论如何使用 StringRedisTemplate 来设置键的过期时间,以及如何进行增量操作 INCR,并解决一个实际的示例场景。

场景描述

假设我们有一个简单的用户登录系统,需要对登录用户的请求进行计数,并且确保这个计数在一定的时间内有效。比如,设定用户在5分钟内可以发送请求的次数,并在超过这个次数后,暂时禁止访问。我们可以用 Redis 来存储这个用户请求的次数,并设置一个过期时间。

基本使用

首先,我们需要配置 StringRedisTemplate。在 Spring Boot 中,我们可以通过以下方式配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;

@Configuration
public class RedisConfig {

    @Bean
    public StringRedisTemplate stringRedisTemplate() {
        return new StringRedisTemplate();
    }
}

实现增量和设置过期时间

我们可以定义一个服务来处理用户请求计数和过期设置。以下代码展示了如何实现这个逻辑:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class UserService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final long LIMIT_TIME = 5; // 5 minutes
    private static final long MAX_REQUESTS = 10; // max requests in the limit time

    public boolean canUserAccess(String userId) {
        String key = "user:requests:" + userId;

        // Increase the request count
        Long count = stringRedisTemplate.opsForValue().increment(key);

        if (count == null) {
            count = 1L;
            // Set expiration, if this is the first request
            stringRedisTemplate.opsForValue().set(key, count.toString(), LIMIT_TIME, TimeUnit.MINUTES);
        }

        // Check if the limit is reached
        return count <= MAX_REQUESTS;
    }
}

工作流程

  1. 每当用户请求时,canUserAccess 方法会被调用。
  2. 如果这是用户的第一次请求,当前计数会被初始化为1,并且设置过期时间为5分钟。
  3. 如果用户在5分钟内再次请求,计数会增加。
  4. 当计数达到最大请求数后,则返回false,表示禁止访问。

序列图

以下是这个流程的序列图,用于更清晰地展示系统的工作逻辑:

sequenceDiagram
    participant User
    participant UserService
    participant Redis

    User->>UserService: 请求访问
    UserService->>Redis: 增加请求计数
    Redis-->>UserService: 返回当前计数
    UserService-->>User: 返回是否允许访问

结尾

通过使用 StringRedisTemplate,我们轻松实现了对用户请求的计数和控制,同时结合了 Redis 的过期时间特性来保证系统的性能和资源管理。这个简单的计数器可以扩展到更复杂的场景中,为复杂的系统提供重要的基础设施。希望这篇文章能对你在使用 Redis 时有所帮助!