redisalreadygolang 面试

分布式、高并发下ID生成 - Redis

2022-09-20  本文已影响0人  右耳菌

1. 分布式、高并发下ID生成要求


2. 策略一:UUID/GUID (通用唯一识别码)

UUID 按照开放软件基金会(OSF)制定的标准计算。
用到了以太网卡地址(MAC)、纳秒级时间、芯片ID码和许多可能的数字。

由以下几部分的组合:

示例UUID,长度为36的字符串: 4cdbc040-657a-4847-b266-7e31d9e2c3d9


3. redis的订单号生成策略

Redis的所有命令操作都是单线程的,本身提供像incr和 increby这样的自增原子命令,所以能保证生成的ID肯定是唯一有序的。

考虑到单节点的性能瓶颈,可以使用Redis集群来获取更高的吞吐量。


4. 基于Redis 自增

思路∶ 利用增长计数API,业务系统在自增长的基础上,配合其他信息组装成为一个唯一ID。

Redis的 incr(key) API 用于将key的值进行递增,并返回增长数值。如果key不存在,则创建并赋值为0。

利用到Redis的特性:单线程原子操作、自增计数API、数据有效期机制EX

示例:
1、业务编码+地区+自增数值。(9020 00000000001)


5. 例子

【Redis拓展 - 实现定时消息通知】 中的项目为基础,然后按照以下的内容再进行后续。

package cn.lazyfennec.redisdemo.service;

public interface IOrderService {

    public String orderId();

}
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 表示永不过期
        System.out.println("生成的id:" + id);
        return getPrefix() + id;
    }

    private String getPrefix() {
        // Here Can Replace With Some Prefix
        return "prefix";
    }
}
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();
    }

}
生成的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

如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

上一篇下一篇

猜你喜欢

热点阅读