redis生成唯一流水id,自增

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
* 00010
* 00100
* 01000
* 11000
* 在相同毫秒情况下,最多只能生成10万-1=99999订单号
* 假设:双11每毫秒99万笔
* 提前生成号订单号码存放在redis中 *

* 9.9万*1000=900万
* 考虑失效时间问题 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的原子存储了。

你可能感兴趣的:(项目小技巧,redis,数据库,缓存)