redis生成唯一流水id,自增

java 复制代码
package com.csgholding.pvgpsp.ums.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
public class CodeController {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 15 18位 前缀=当前日期=2018112921303030-5位自增id(高并发请下 先天性安全) 00001<br>
     * 00010<br>
     * 00100<br>
     * 01000<br>
     * 11000<br>
     * 在相同毫秒情况下,最多只能生成10万-1=99999订单号<br>
     * 假设:双11每毫秒99万笔 <br>
     * 提前生成号订单号码存放在redis中
     * <p>
     * 9.9万*1000=900万<br>
     * 考虑失效时间问题 24小时
     *
     * @return
     */
    // 基于Redis 实现分布式全局id
    @RequestMapping("/getCode")
    public String order(String key, String name) {
        RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        long incrementAndGet = redisAtomicLong.incrementAndGet();
        // 6位
        String orderId = name + prefix() + String.format("%1$06d", incrementAndGet);
        return orderId;
    }

    //自增+sum个,暂时不要
//    @RequestMapping("/addCodeSum")
//    public String order1(String key,Integer sum) {
//        RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
//        // // 起始值
//        // redisAtomicLong.set(10);
//        // 设置步长加10
//        redisAtomicLong.addAndGet(sum);
//        return redisAtomicLong.incrementAndGet() + "";
//    }

    /**
     * @return 日期
     */
    public static String prefix() {
        String[] split = LocalDate.now().toString().split("-");
        String time = "";
        for (String s : split) {
            time += s;
        }
        return time;
    }

}

springBoot集成redis后,可以通过redis的单线程特性,来生成流水号,并且只要多个服务是用的同一个redis服务器,就不会存在重复问题。

我原本想的是用分布式锁来完成,后面发现不管怎么样,都得把计数器放在redis上,所以就直接用redis的原子存储了。

相关推荐
Lethehong1 分钟前
化繁为简,一库统揽:金仓数据库以“一体化替代”战略重构企业数据核心
数据库·重构
A懿轩A1 分钟前
【2026 最新】MySQL 与 DataGrip 详细下载安装教程带图展示(Windows版)
数据库·mysql·datagrip
羊锦磊2 分钟前
AI 助手大模型---阿里云创建AI应用
运维·服务器·数据库
小北方城市网3 分钟前
Elasticsearch 分布式检索生产级优化:从索引设计到查询性能
java·大数据·运维·redis·分布式·elasticsearch·搜索引擎
wei_shuo3 分钟前
金仓数据库 KingbaseES:多模融合架构引领,一库全替代构筑数字化转型底座
数据库·金仓数据库
知识分享小能手3 分钟前
Oracle 19c入门学习教程,从入门到精通,Oracle系统调优 —— 内存结构与参数优化详解(15)
数据库·学习·oracle
程序员敲代码吗4 分钟前
使用Plotly创建交互式图表
jvm·数据库·python
悟能不能悟5 分钟前
oracle中dd/mm/yyyy和dd/mm/rrrrr有什么不一样
数据库·oracle
椰子今天很可爱7 分钟前
Redis基础知识介绍
数据库·redis·缓存
再卷还是菜11 分钟前
网安渗透学习小结--sql注入
数据库·sql·学习