目录

 

前言:

 

1、 基于Redis 实现分布式全局id的测试Controller

2、主要测试环境的时候使用的maven依赖配置

3、总结测试类之后的原理


前言:

工作中需要Redis来实现生成主键,通过demo来测试redis的生成主键的测试,最终确定采用redis的生成主键策略。可以通过时间来进行生产,目前我们业务需要是可以在一分钟60万数据入库,通过redis进行主键生成,完全满足业务需要!

 

1、 基于Redis 实现分布式全局id的测试Controller

通过rest-Controller进行线程访问,一次性生产几万进行测试性能!



import lombok.extern.slf4j.Slf4j;
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.text.SimpleDateFormat;
import java.util.Date;

/********************************************
 * 模块名称: 主要功能是做 redis生成主键ID
 * 功能说明:redis生产过程全局ID的测试类 基于Redis 实现分布式全局id
 * 
 * @date 2020年12月16日
 * @author 君子志邦
 * @email
 * @description 基于Redis 实现分布式全局id原理:[网上描述]
 * 
 *              15 18位 前缀=当前日期=2018112921303030-5位自增id(高并发请下 先天性安全) 00001<br>
 *              00010<br>
 *              00100<br>
 *              01000<br>
 *              11000<br>
 *              在相同毫秒情况下,最多只能生成10万-1=99999订单号<br>
 *              假设:双11每毫秒99万笔 <br>
 *              提前生成号订单号码存放在redis中
 * 
 *              9.9万*1000=900万<br>
 *              考虑失效时间问题 24小时 同时作为redis有个特性是单线程,所以在集群中,不会产生相同的id,同时使用的是单线程的集群配置的redis,所以故障率比较低而且保证唯一
 * 开发时间:2020/12/16 16:24   
 * v1.0.0.0 2020/12/16-01    
 *******************************************/


@RestController
@Slf4j
public class TestController {



    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/payId")
    public String payId(String key) {
        RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        for (int i = 0; i < 100; i++) {
            long incrementAndGet = redisAtomicLong.incrementAndGet();
            // 5位
            String payId = prefix() + "-" + String.format("%1$05d", incrementAndGet);
            log.error("测试生产的主键为Long类型:{},原始的全数值:{}", payId,incrementAndGet);
        }
        return "success:";
    }

    @GetMapping("/redisTestId")
    public String redisTestId(String key) {
        RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        // // 起始值,set(这里面有个数据的)
        redisAtomicLong.set(10);
        // 设置步长加10
        redisAtomicLong.addAndGet(9);
        log.error("测试生产的主键为Long类型,起始值是10,步长9,结果:{}", redisAtomicLong.incrementAndGet());
        return redisAtomicLong.incrementAndGet() + "";
    }

    public static String prefix() {
        String temp_str = "";
        Date dt = new Date();
        // 最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        temp_str = sdf.format(dt);
        return temp_str;
    }






}

 

2、主要测试环境的时候使用的maven依赖配置

依赖了SPringBoot自带的集成spring-boot-starter-data-redis ,详情如下:

   <dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.3</version>
		</dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>


		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>


	</dependencies>

3、总结测试类之后的原理

1、使用redis的好处有很多:

 * 功能说明:redis生产过程全局ID的测试类 基于Redis 实现分布式全局id
 * 
 * @date 2020年12月16日
 * @author 君子志邦
 * @email
 * @description 基于Redis 实现分布式全局id原理:[网上描述]
 * 
 *              15 18位 前缀=当前日期=2018112921303030-5位自增id(高并发请下 先天性安全) 00001<br>
 *              00010<br>
 *              00100<br>
 *              01000<br>
 *              11000<br>
 *              在相同毫秒情况下,最多只能生成10万-1=99999订单号<br>
 *              假设:双11每毫秒99万笔 <br>
 *              提前生成号订单号码存放在redis中
 * 
 *              9.9万*1000=900万<br>
 *              考虑失效时间问题 24小时 同时作为redis有个特性是单线程,所以在集群中,不会产生相同的id

对比结果:

// uuid生成 应用场景:数据库主键 或者Token 不占用宽带
 // 数据库 递增 1 2 3 4 6 数据库集群 分表分库,特别依赖数据库
 //redis 生产的id 唯一并且依赖事件,不会冲突!

 

测试出来的数据:

2020-12-16 16:36:01.880|测试生产的主键为Long类型,起始值是10,步长9,结果:20

2020-12-16 16:34:31.405|测试生产的主键为Long类型:20201216163431-00001,原始的全数值:1
2020-12-16 16:34:31.420|测试生产的主键为Long类型:20201216163431-00002,原始的全数值:2
2020-12-16 16:34:31.432|测试生产的主键为Long类型:20201216163431-00003,原始的全数值:3
2020-12-16 16:34:31.445|测试生产的主键为Long类型:20201216163431-00004,原始的全数值:4
2020-12-16 16:34:31.456|测试生产的主键为Long类型:20201216163431-00005,原始的全数值:5
2020-12-16 16:34:31.469|测试生产的主键为Long类型:20201216163431-00006,原始的全数值:6
2020-12-16 16:34:31.499|测试生产的主键为Long类型:20201216163431-00007,原始的全数值:7
2020-12-16 16:34:31.511|测试生产的主键为Long类型:20201216163431-00008,原始的全数值:8
2020-12-16 16:34:31.524|测试生产的主键为Long类型:20201216163431-00009,原始的全数值:9
2020-12-16 16:34:31.536|测试生产的主键为Long类型:20201216163431-00010,原始的全数值:10
2020-12-16 16:34:31.549|测试生产的主键为Long类型:20201216163431-00011,原始的全数值:11
2020-12-16 16:34:31.561|测试生产的主键为Long类型:20201216163431-00012,原始的全数值:12
2020-12-16 16:34:31.575|测试生产的主键为Long类型:20201216163431-00013,原始的全数值:13
2020-12-16 16:34:31.587|测试生产的主键为Long类型:20201216163431-00014,原始的全数值:14
2020-12-16 16:34:31.600|测试生产的主键为Long类型:20201216163431-00015,原始的全数值:15
2020-12-16 16:34:31.612|测试生产的主键为Long类型:20201216163431-00016,原始的全数值:16
2020-12-16 16:34:31.625|测试生产的主键为Long类型:20201216163431-00017,原始的全数值:17
2020-12-16 16:34:31.637|测试生产的主键为Long类型:20201216163431-00018,原始的全数值:18
2020-12-16 16:34:31.647|测试生产的主键为Long类型:20201216163431-00019,原始的全数值:19
2020-12-16 16:34:31.659|测试生产的主键为Long类型:20201216163431-00020,原始的全数值:20
2020-12-16 16:34:31.670|测试生产的主键为Long类型:20201216163431-00021,原始的全数值:21
2020-12-16 16:34:31.682|测试生产的主键为Long类型:20201216163431-00022,原始的全数值:22
2020-12-16 16:34:31.695|测试生产的主键为Long类型:20201216163431-00023,原始的全数值:23
2020-12-16 16:34:31.709|测试生产的主键为Long类型:20201216163431-00024,原始的全数值:24
2020-12-16 16:34:31.721|测试生产的主键为Long类型:20201216163431-00025,原始的全数值:25
2020-12-16 16:34:31.733|测试生产的主键为Long类型:20201216163431-00026,原始的全数值:26
2020-12-16 16:34:31.752|测试生产的主键为Long类型:20201216163431-00027,原始的全数值:27
2020-12-16 16:34:31.764|测试生产的主键为Long类型:20201216163431-00028,原始的全数值:28
2020-12-16 16:34:31.777|测试生产的主键为Long类型:20201216163431-00029,原始的全数值:29
2020-12-16 16:34:31.790|测试生产的主键为Long类型:20201216163431-00030,原始的全数值:30
2020-12-16 16:34:31.802|测试生产的主键为Long类型:20201216163431-00031,原始的全数值:31
2020-12-16 16:34:31.814|测试生产的主键为Long类型:20201216163431-00032,原始的全数值:32
2020-12-16 16:34:31.826|测试生产的主键为Long类型:20201216163431-00033,原始的全数值:33
2020-12-16 16:34:31.836|测试生产的主键为Long类型:20201216163431-00034,原始的全数值:34
2020-12-16 16:34:31.847|测试生产的主键为Long类型:20201216163431-00035,原始的全数值:35
2020-12-16 16:34:31.859|测试生产的主键为Long类型:20201216163431-00036,原始的全数值:36
2020-12-16 16:34:31.870|测试生产的主键为Long类型:20201216163431-00037,原始的全数值:37
2020-12-16 16:34:31.880|测试生产的主键为Long类型:20201216163431-00038,原始的全数值:38
2020-12-16 16:34:31.891|测试生产的主键为Long类型:20201216163431-00039,原始的全数值:39
2020-12-16 16:34:31.902|测试生产的主键为Long类型:20201216163431-00040,原始的全数值:40
2020-12-16 16:34:31.913|测试生产的主键为Long类型:20201216163431-00041,原始的全数值:41
2020-12-16 16:34:31.924|测试生产的主键为Long类型:20201216163431-00042,原始的全数值:42
2020-12-16 16:34:31.936|测试生产的主键为Long类型:20201216163431-00043,原始的全数值:43
2020-12-16 16:34:31.948|测试生产的主键为Long类型:20201216163431-00044,原始的全数值:44
2020-12-16 16:34:31.959|测试生产的主键为Long类型:20201216163431-00045,原始的全数值:45
2020-12-16 16:34:31.971|测试生产的主键为Long类型:20201216163431-00046,原始的全数值:46
2020-12-16 16:34:31.983|测试生产的主键为Long类型:20201216163431-00047,原始的全数值:47
2020-12-16 16:34:31.993|测试生产的主键为Long类型:20201216163431-00048,原始的全数值:48
2020-12-16 16:34:32.004|测试生产的主键为Long类型:20201216163432-00049,原始的全数值:49
2020-12-16 16:34:32.016|测试生产的主键为Long类型:20201216163432-00050,原始的全数值:50
2020-12-16 16:34:32.028|测试生产的主键为Long类型:20201216163432-00051,原始的全数值:51
2020-12-16 16:34:32.041|测试生产的主键为Long类型:20201216163432-00052,原始的全数值:52
2020-12-16 16:34:32.053|测试生产的主键为Long类型:20201216163432-00053,原始的全数值:53
2020-12-16 16:34:32.064|测试生产的主键为Long类型:20201216163432-00054,原始的全数值:54
2020-12-16 16:34:32.074|测试生产的主键为Long类型:20201216163432-00055,原始的全数值:55
2020-12-16 16:34:32.087|测试生产的主键为Long类型:20201216163432-00056,原始的全数值:56
2020-12-16 16:34:32.100|测试生产的主键为Long类型:20201216163432-00057,原始的全数值:57
2020-12-16 16:34:32.112|测试生产的主键为Long类型:20201216163432-00058,原始的全数值:58
2020-12-16 16:34:32.125|测试生产的主键为Long类型:20201216163432-00059,原始的全数值:59
2020-12-16 16:34:32.137|测试生产的主键为Long类型:20201216163432-00060,原始的全数值:60
2020-12-16 16:34:32.148|测试生产的主键为Long类型:20201216163432-00061,原始的全数值:61
2020-12-16 16:34:32.160|测试生产的主键为Long类型:20201216163432-00062,原始的全数值:62
2020-12-16 16:34:32.170|测试生产的主键为Long类型:20201216163432-00063,原始的全数值:63
2020-12-16 16:34:32.181|测试生产的主键为Long类型:20201216163432-00064,原始的全数值:64
2020-12-16 16:34:32.192|测试生产的主键为Long类型:20201216163432-00065,原始的全数值:65
2020-12-16 16:34:32.202|测试生产的主键为Long类型:20201216163432-00066,原始的全数值:66
2020-12-16 16:34:32.213|测试生产的主键为Long类型:20201216163432-00067,原始的全数值:67
2020-12-16 16:34:32.225|测试生产的主键为Long类型:20201216163432-00068,原始的全数值:68
2020-12-16 16:34:32.236|测试生产的主键为Long类型:20201216163432-00069,原始的全数值:69
2020-12-16 16:34:32.246|测试生产的主键为Long类型:20201216163432-00070,原始的全数值:70
2020-12-16 16:34:32.258|测试生产的主键为Long类型:20201216163432-00071,原始的全数值:71
2020-12-16 16:34:32.269|测试生产的主键为Long类型:20201216163432-00072,原始的全数值:72
2020-12-16 16:34:32.279|测试生产的主键为Long类型:20201216163432-00073,原始的全数值:73
2020-12-16 16:34:32.293|测试生产的主键为Long类型:20201216163432-00074,原始的全数值:74
2020-12-16 16:34:32.304|测试生产的主键为Long类型:20201216163432-00075,原始的全数值:75
2020-12-16 16:34:32.316|测试生产的主键为Long类型:20201216163432-00076,原始的全数值:76
2020-12-16 16:34:32.327|测试生产的主键为Long类型:20201216163432-00077,原始的全数值:77
2020-12-16 16:34:32.337|测试生产的主键为Long类型:20201216163432-00078,原始的全数值:78
2020-12-16 16:34:32.347|测试生产的主键为Long类型:20201216163432-00079,原始的全数值:79
2020-12-16 16:34:32.359|测试生产的主键为Long类型:20201216163432-00080,原始的全数值:80
2020-12-16 16:34:32.370|测试生产的主键为Long类型:20201216163432-00081,原始的全数值:81
2020-12-16 16:34:32.382|测试生产的主键为Long类型:20201216163432-00082,原始的全数值:82
2020-12-16 16:34:32.392|测试生产的主键为Long类型:20201216163432-00083,原始的全数值:83
2020-12-16 16:34:32.404|测试生产的主键为Long类型:20201216163432-00084,原始的全数值:84
2020-12-16 16:34:32.419|测试生产的主键为Long类型:20201216163432-00085,原始的全数值:85
2020-12-16 16:34:32.431|测试生产的主键为Long类型:20201216163432-00086,原始的全数值:86
2020-12-16 16:34:32.442|测试生产的主键为Long类型:20201216163432-00087,原始的全数值:87
2020-12-16 16:34:32.454|测试生产的主键为Long类型:20201216163432-00088,原始的全数值:88
2020-12-16 16:34:32.467|测试生产的主键为Long类型:20201216163432-00089,原始的全数值:89
2020-12-16 16:34:32.480|测试生产的主键为Long类型:20201216163432-00090,原始的全数值:90
2020-12-16 16:34:32.491|测试生产的主键为Long类型:20201216163432-00091,原始的全数值:91
2020-12-16 16:34:32.505|测试生产的主键为Long类型:20201216163432-00092,原始的全数值:92
2020-12-16 16:34:32.515|测试生产的主键为Long类型:20201216163432-00093,原始的全数值:93
2020-12-16 16:34:32.527|测试生产的主键为Long类型:20201216163432-00094,原始的全数值:94
2020-12-16 16:34:32.538|测试生产的主键为Long类型:20201216163432-00095,原始的全数值:95
2020-12-16 16:34:32.550|测试生产的主键为Long类型:20201216163432-00096,原始的全数值:96
2020-12-16 16:34:32.562|测试生产的主键为Long类型:20201216163432-00097,原始的全数值:97
2020-12-16 16:34:32.574|测试生产的主键为Long类型:20201216163432-00098,原始的全数值:98
2020-12-16 16:34:32.584|测试生产的主键为Long类型:20201216163432-00099,原始的全数值:99
2020-12-16 16:34:32.597|测试生产的主键为Long类型:20201216163432-00100,原始的全数值:100

 

Logo

鸿蒙生态一站式服务平台。

更多推荐