分布式傻铣、高并發(fā)下ID生成 - Redis

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è)信息哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辞友,一起剝皮案震驚了整個(gè)濱河市栅哀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌称龙,老刑警劉巖留拾,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鲫尊,居然都是意外死亡痴柔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門疫向,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咳蔚,“玉大人,你說(shuō)我怎么就攤上這事搔驼√富穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舌涨,是天一觀的道長(zhǎng)糯耍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泼菌,這世上最難降的妖魔是什么谍肤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮哗伯,結(jié)果婚禮上荒揣,老公的妹妹穿的比我還像新娘。我一直安慰自己焊刹,他們只是感情好系任,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著虐块,像睡著了一般俩滥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贺奠,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天霜旧,我揣著相機(jī)與錄音,去河邊找鬼儡率。 笑死挂据,一個(gè)胖子當(dāng)著我的面吹牛以清,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崎逃,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掷倔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了个绍?” 一聲冷哼從身側(cè)響起勒葱,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巴柿,沒(méi)想到半個(gè)月后凛虽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篮洁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年涩维,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁波。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦阐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篷牌,到底是詐尸還是另有隱情睡蟋,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布枷颊,位于F島的核電站戳杀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夭苗。R本人自食惡果不足惜信卡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望题造。 院中可真熱鬧傍菇,春花似錦、人聲如沸界赔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淮悼。三九已至咐低,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袜腥,已是汗流浹背见擦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锡宋。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓儡湾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親执俩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容