当前位置: 首页 > article >正文

Redis increment 函数处理并发序列号

1. 创建Spring Boot项目

首先,创建一个新的Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来生成项目结构。选择以下依赖:

  • Spring Web
  • Spring Data Redis
  • Lombok(可选,用于简化代码)

2. 配置application.yml

在你的 ​application.yml​文件中添加Redis配置:

spring:
  cache:
    type: GENERIC
  redis:
    host: ${sy.redis.ip}
    password:
    port: ${sy.redis.port}
    database: ${sy.redis.database}

3. 创建缓存配置类

创建一个配置类来手动配置基于Redis的缓存管理器:

import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间
                .disableCachingNullValues()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
}

4. 创建服务类

创建一个服务类来使用Redis的 ​INCR​方法生成每天的序号

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

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Service
public class SequenceService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    public long getDailySequence() {
        String dateStr = DateUtils.format(new Date(), "yyyy-MM-dd");
        String key = "dailySequence_" + dateStr;
        // 执行 increment 操作
        Long applicantNumber = redisTemplate.opsForValue().increment(key);
        // 设置过期时间为2天,不设置默认永久
        redisTemplate.expire(key, 2, TimeUnit.DAYS);
        //redisTemplate.expire(key) // 查询key的过期时间。
        //-1: 表示键存在但没有设置过期时间。
        //-2: 表示键不存在。
        //返回秒:如上面返回值是 172780,这意味着该键将在大约 172780 秒(约 48 小时)后过期。
        return applicantNumber;
    }
}

5. 创建控制器

创建一个控制器来暴露获取每天序号的API:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SequenceController {

    @Autowired
    private SequenceService sequenceService;

    @GetMapping("/daily-sequence")
    public String getDailySequence() {
        long sequence = sequenceService.getDailySequence();
        return "Daily sequence: " + sequence;
    }
}

6. 启动类

确保你的启动类包含 ​@EnableCaching​注解以启用缓存功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class RedisIncrApplication {

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


http://www.kler.cn/a/281366.html

相关文章:

  • 变电站智能巡检机器人:构建智能化电力运维新模式
  • 2024-8月,有没有那一瞬间让你悟到了过去10多年没有想明白的事
  • Ruby Web服务开发:构建高效RESTful API的秘诀
  • SpringCloud之一IDEA导入已有微服务项目并启动服务
  • 基于jstack、jmap、jstat 进行JVM监控
  • Flask 安装和应用
  • 洛谷刷题(6)
  • kubectl陈述式资源管理方式、声明式资源管理
  • 【PyTorch][chapter 27][李宏毅深度学习][transformer-1]
  • SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)
  • 探索异步之美:aiohttp库的魔力与奥秘
  • 守护核心命脉:国家网络安全战略下的关键基础设施保护
  • Pandas里使用SQL
  • 稚晖君智元机器人远程机器人系列发布:引领具身智能新高度
  • 软考:软件设计师 — 17.程序设计语言与语言处理程序基础
  • XSS LABS - Level 16 过关思路
  • 结构开发笔记(六):solidworks软件(五):绘制M2x3.0mm螺丝
  • MES系统如何灵活适配多种通信协议及数据采集能力
  • 单向链表和双向链表的一些基本算法
  • XR虚拟拍摄和VP有什么区别