1. 分布式柿扣、高并發(fā)下ID生成要求
- 全局唯一
- 趨勢(shì)遞增
- 效率高(生成肖方、使用、索引)
- 控制并發(fā)
2. 策略一:UUID/GUID (通用唯一識(shí)別碼)
UUID 按照開(kāi)放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算未状。
用到了以太網(wǎng)卡地址(MAC)俯画、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字司草。
由以下幾部分的組合:
- 當(dāng)前日期和時(shí)間
- 時(shí)鐘序列
- 全局唯一的IEEE機(jī)器識(shí)別號(hào)(如果有網(wǎng)卡艰垂,從網(wǎng)卡獲得,沒(méi)有網(wǎng)卡以其他方式獲得)
示例UUID埋虹,長(zhǎng)度為36的字符串: 4cdbc040-657a-4847-b266-7e31d9e2c3d9
3. redis的訂單號(hào)生成策略
Redis的所有命令操作都是單線程的猜憎,本身提供像incr和 increby這樣的自增原子命令,所以能保證生成的ID肯定是唯一有序的搔课。
- 優(yōu)點(diǎn): 不依賴于數(shù)據(jù)庫(kù)胰柑,靈活方便,且性能優(yōu)于數(shù)據(jù)庫(kù);數(shù)字ID天然排序爬泥,對(duì)分頁(yè)或者需要排序的結(jié)果很有幫助
- 缺點(diǎn): 如果系統(tǒng)中沒(méi)有Redis柬讨,還需要引入新的組件,增加系統(tǒng)復(fù)雜度;需要編碼和配置的工作量比較大
考慮到單節(jié)點(diǎn)的性能瓶頸袍啡,可以使用Redis集群來(lái)獲取更高的吞吐量踩官。
4. 基于Redis 自增
思路∶ 利用增長(zhǎng)計(jì)數(shù)API,業(yè)務(wù)系統(tǒng)在自增長(zhǎng)的基礎(chǔ)上境输,配合其他信息組裝成為一個(gè)唯一ID蔗牡。
Redis的 incr(key) API 用于將key的值進(jìn)行遞增,并返回增長(zhǎng)數(shù)值嗅剖。如果key不存在蛋逾,則創(chuàng)建并賦值為0。
利用到Redis的特性:單線程原子操作窗悯、自增計(jì)數(shù)API、數(shù)據(jù)有效期機(jī)制EX
示例:
1偷拔、業(yè)務(wù)編碼+地區(qū)+自增數(shù)值蒋院。(9020 00000000001)
5. 例子
以 【Redis拓展 - 實(shí)現(xiàn)定時(shí)消息通知】 中的項(xiàng)目為基礎(chǔ)亏钩,然后按照以下的內(nèi)容再進(jìn)行后續(xù)。
- 創(chuàng)建IOrderService
package cn.lazyfennec.redisdemo.service;
public interface IOrderService {
public String orderId();
}
- 創(chuàng)建OrderServiceImpl
package cn.lazyfennec.redisdemo.service.impl;
import cn.lazyfennec.redisdemo.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/9/21 17:13
*/
@Service
public class RedisOrderServiceImpl implements IOrderService {
@Autowired
RedisTemplate redisTemplate;
@Override
public String orderId() {
String key = "neco:shop:order:id"; // 所屬 模塊 功能 key
long id = redisTemplate.opsForValue().increment(key, -1); // -1 表示永不過(guò)期
System.out.println("生成的id:" + id);
return getPrefix() + id;
}
private String getPrefix() {
// Here Can Replace With Some Prefix
return "prefix";
}
}
- 修改RedisdemoApplicationTests
package cn.lazyfennec.redisdemo;
import cn.lazyfennec.redisdemo.service.IOrderService;
import org.junit.After;
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisdemoApplication.class)
class RedisdemoApplicationTests {
@Before
public void start() {
}
@After
public void end() {
}
private static final int THREAD_NUM = 500;
private CountDownLatch countDownLatch = new CountDownLatch(THREAD_NUM);
@Autowired
private IOrderService orderService;
@Test
void contextLoads() throws IOException {
for (int i = 0; i < THREAD_NUM; i++) {
Thread thread = new Thread(()->{
try {
countDownLatch.await();
orderService.orderId();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
countDownLatch.countDown();
}
System.in.read();
}
}
- 運(yùn)行結(jié)果
生成的id:5
生成的id:9
生成的id:8
生成的id:7
生成的id:13
生成的id:12
生成的id:6
生成的id:14
生成的id:17
生成的id:4
生成的id:23
生成的id:24
生成的id:22
生成的id:21
生成的id:30
生成的id:31
生成的id:33
生成的id:20
生成的id:19
生成的id:37
生成的id:16
生成的id:18
生成的id:40
生成的id:42
生成的id:44
生成的id:15
生成的id:11
生成的id:48
生成的id:49
生成的id:51
生成的id:52
生成的id:54
生成的id:53
生成的id:10
生成的id:55
生成的id:59
生成的id:58
生成的id:60
生成的id:57
生成的id:61
生成的id:64
生成的id:56
生成的id:50
生成的id:47
生成的id:46
生成的id:45
生成的id:43
生成的id:41
生成的id:39
生成的id:38
生成的id:36
生成的id:34
生成的id:35
生成的id:32
生成的id:29
生成的id:26
生成的id:25
生成的id:27
生成的id:28
生成的id:63
生成的id:62
生成的id:2
生成的id:1
生成的id:3
生成的id:65
生成的id:66
生成的id:67
生成的id:68
生成的id:69
生成的id:70
生成的id:71
生成的id:72
生成的id:73
生成的id:74
生成的id:75
生成的id:76
生成的id:77
生成的id:78
生成的id:79
生成的id:81
生成的id:80
生成的id:83
生成的id:84
生成的id:82
生成的id:85
生成的id:86
生成的id:87
生成的id:88
生成的id:89
生成的id:90
生成的id:91
生成的id:92
生成的id:93
生成的id:95
生成的id:94
生成的id:96
生成的id:97
生成的id:98
生成的id:99
生成的id:100
生成的id:101
生成的id:102
生成的id:103
生成的id:104
生成的id:105
生成的id:106
生成的id:107
生成的id:108
生成的id:109
生成的id:110
生成的id:111
生成的id:112
生成的id:113
生成的id:114
生成的id:115
生成的id:116
生成的id:117
生成的id:118
生成的id:119
生成的id:120
生成的id:121
生成的id:122
生成的id:123
生成的id:124
生成的id:125
生成的id:126
生成的id:127
生成的id:128
生成的id:129
生成的id:130
生成的id:131
生成的id:132
生成的id:133
生成的id:134
生成的id:135
生成的id:136
生成的id:137
生成的id:138
生成的id:139
生成的id:140
生成的id:141
生成的id:142
生成的id:143
生成的id:144
生成的id:145
生成的id:146
生成的id:147
生成的id:148
生成的id:149
生成的id:150
生成的id:151
生成的id:152
生成的id:153
生成的id:154
生成的id:155
生成的id:156
生成的id:157
生成的id:158
生成的id:159
生成的id:160
生成的id:162
生成的id:161
生成的id:163
生成的id:164
生成的id:165
生成的id:166
生成的id:167
生成的id:168
生成的id:169
生成的id:170
生成的id:171
生成的id:172
生成的id:173
生成的id:174
生成的id:175
生成的id:176
生成的id:177
生成的id:179
生成的id:178
生成的id:180
生成的id:181
生成的id:182
生成的id:183
生成的id:184
生成的id:185
生成的id:186
生成的id:187
生成的id:188
生成的id:189
生成的id:190
生成的id:191
生成的id:192
生成的id:193
生成的id:194
生成的id:195
生成的id:196
生成的id:197
生成的id:198
生成的id:199
生成的id:200
生成的id:201
生成的id:202
生成的id:203
生成的id:204
生成的id:205
生成的id:206
生成的id:207
生成的id:208
生成的id:209
生成的id:210
生成的id:211
生成的id:212
生成的id:213
生成的id:214
生成的id:215
生成的id:216
生成的id:217
生成的id:218
生成的id:219
生成的id:220
生成的id:221
生成的id:222
生成的id:223
生成的id:224
生成的id:225
生成的id:226
生成的id:227
生成的id:229
生成的id:228
生成的id:232
生成的id:231
生成的id:230
生成的id:235
生成的id:234
生成的id:238
生成的id:233
生成的id:239
生成的id:237
生成的id:236
生成的id:242
生成的id:241
生成的id:240
生成的id:247
生成的id:246
生成的id:245
生成的id:244
生成的id:243
生成的id:252
生成的id:251
生成的id:250
生成的id:249
生成的id:248
生成的id:256
生成的id:255
生成的id:254
生成的id:253
生成的id:257
生成的id:258
生成的id:259
生成的id:260
生成的id:261
生成的id:262
生成的id:263
生成的id:264
生成的id:265
生成的id:266
生成的id:267
生成的id:268
生成的id:269
生成的id:270
生成的id:271
生成的id:272
生成的id:273
生成的id:274
生成的id:275
生成的id:276
生成的id:277
生成的id:278
生成的id:279
生成的id:280
生成的id:281
生成的id:282
生成的id:283
生成的id:284
生成的id:285
生成的id:286
生成的id:287
生成的id:288
生成的id:289
生成的id:290
生成的id:291
生成的id:292
生成的id:293
生成的id:294
生成的id:295
生成的id:296
生成的id:297
生成的id:298
生成的id:300
生成的id:301
生成的id:299
生成的id:302
生成的id:303
生成的id:304
生成的id:305
生成的id:307
生成的id:306
生成的id:309
生成的id:308
生成的id:311
生成的id:310
生成的id:313
生成的id:315
生成的id:312
生成的id:317
生成的id:318
生成的id:320
生成的id:314
生成的id:319
生成的id:316
生成的id:321
生成的id:322
生成的id:323
生成的id:324
生成的id:325
生成的id:326
生成的id:327
生成的id:328
生成的id:329
生成的id:330
生成的id:331
生成的id:332
生成的id:334
生成的id:333
生成的id:336
生成的id:337
生成的id:335
生成的id:339
生成的id:340
生成的id:338
生成的id:342
生成的id:341
生成的id:343
生成的id:345
生成的id:344
生成的id:346
生成的id:347
生成的id:349
生成的id:348
生成的id:350
生成的id:351
生成的id:352
生成的id:353
生成的id:354
生成的id:356
生成的id:357
生成的id:358
生成的id:366
生成的id:363
生成的id:361
生成的id:377
生成的id:369
生成的id:372
生成的id:378
生成的id:355
生成的id:379
生成的id:382
生成的id:360
生成的id:383
生成的id:381
生成的id:384
生成的id:373
生成的id:380
生成的id:365
生成的id:362
生成的id:375
生成的id:376
生成的id:374
生成的id:371
生成的id:370
生成的id:367
生成的id:359
生成的id:364
生成的id:368
生成的id:385
生成的id:386
生成的id:387
生成的id:388
生成的id:389
生成的id:390
生成的id:391
生成的id:392
生成的id:393
生成的id:394
生成的id:395
生成的id:396
生成的id:397
生成的id:398
生成的id:399
生成的id:400
生成的id:401
生成的id:402
生成的id:403
生成的id:404
生成的id:405
生成的id:406
生成的id:407
生成的id:408
生成的id:409
生成的id:410
生成的id:411
生成的id:412
生成的id:413
生成的id:414
生成的id:415
生成的id:416
生成的id:417
生成的id:418
生成的id:419
生成的id:420
生成的id:421
生成的id:422
生成的id:423
生成的id:424
生成的id:426
生成的id:425
生成的id:428
生成的id:427
生成的id:429
生成的id:430
生成的id:431
生成的id:432
生成的id:433
生成的id:434
生成的id:435
生成的id:436
生成的id:437
生成的id:438
生成的id:440
生成的id:439
生成的id:441
生成的id:442
生成的id:443
生成的id:444
生成的id:445
生成的id:446
生成的id:447
生成的id:448
生成的id:449
生成的id:450
生成的id:451
生成的id:452
生成的id:453
生成的id:454
生成的id:455
生成的id:456
生成的id:457
生成的id:458
生成的id:459
生成的id:460
生成的id:461
生成的id:462
生成的id:463
生成的id:464
生成的id:465
生成的id:466
生成的id:467
生成的id:468
生成的id:469
生成的id:470
生成的id:471
生成的id:472
生成的id:473
生成的id:474
生成的id:475
生成的id:476
生成的id:477
生成的id:478
生成的id:479
生成的id:480
生成的id:481
生成的id:482
生成的id:483
生成的id:484
生成的id:485
生成的id:486
生成的id:487
生成的id:488
生成的id:489
生成的id:490
生成的id:491
生成的id:492
生成的id:493
生成的id:494
生成的id:495
生成的id:496
生成的id:497
生成的id:498
生成的id:499
生成的id:500
如果覺(jué)得有收獲欺旧,歡迎點(diǎn)贊和評(píng)論姑丑,更多知識(shí),請(qǐng)點(diǎn)擊關(guān)注查看我的主頁(yè)信息哦~