日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java redis id生成器_基于redis的分布式ID生成器

發(fā)布時(shí)間:2025/3/11 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java redis id生成器_基于redis的分布式ID生成器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

項(xiàng)目地址

基于redis的分布式ID生成器。

準(zhǔn)備

首先,要知道redis的EVAL,EVALSHA命令:

原理

利用redis的lua腳本執(zhí)行功能,在每個(gè)節(jié)點(diǎn)上通過(guò)lua腳本生成唯一ID。

生成的ID是64位的:

使用41 bit來(lái)存放時(shí)間,精確到毫秒,可以使用41年。

使用12 bit來(lái)存放邏輯分片ID,最大分片ID是4095

使用10 bit來(lái)存放自增長(zhǎng)ID,意味著每個(gè)節(jié)點(diǎn),每毫秒最多可以生成1024個(gè)ID

比如GTM時(shí)間 Fri Mar 13 10:00:00 CST 2015 ,它的距1970年的毫秒數(shù)是 1426212000000,假定分片ID是53,自增長(zhǎng)序列是4,則生成的ID是:

15981966696448054276 = 1426212000000 << 22 + 53 << 10 + 4

redis提供了TIME命令,可以取得redis服務(wù)器上的秒數(shù)和微秒數(shù)。因些lua腳本返回的是一個(gè)四元組。

1second, microSecond, partition, seq

客戶端要自己處理,生成最終ID。

1((second * 1000 + microSecond / 1000) << (12 + 10)) + (shardId << 10) + seq;

集群實(shí)現(xiàn)原理

假定集群里有3個(gè)節(jié)點(diǎn),則節(jié)點(diǎn)1返回的seq是:

10, 3, 6, 9, 12 ...

節(jié)點(diǎn)2返回的seq是

11, 4, 7, 10, 13 ...

節(jié)點(diǎn)3返回的seq是

12, 5, 8, 11, 14 ...

這樣每個(gè)節(jié)點(diǎn)返回的數(shù)據(jù)都是唯一的。

單個(gè)節(jié)點(diǎn)部署

下載redis-script-node1.lua,并把它load到redis上。

1

2

3cd redis-directory/

wget https://raw.githubusercontent.com/hengyunabc/redis-id-generator/master/redis-script-node1.lua

./redis-cli script load "$(cat redis-script-node1.lua)"

獲取lua腳本的sha1值,可能是:

1fce3758b2e0af6cbf8fea4d42b379cd0dc374418

在代碼里,通過(guò)EVALSHA命令,傳遞這個(gè)sha1值,就可以得到生成的ID。

比如,通過(guò)命令行執(zhí)行:

1./redis-cli EVALSHA fce3758b2e0af6cbf8fea4d42b379cd0dc374418 2 test 123456789

結(jié)果可能是:

1

2

3

41) (integer) 1426238286

2) (integer) 130532

3) (integer) 277

4) (integer) 4

集群部署

假定集群是3個(gè)節(jié)點(diǎn),則分別對(duì)三個(gè)節(jié)點(diǎn)執(zhí)行:

1

2

3./redis-cli -host node1 -p 6379 script load "$(cat redis-script-node1.lua)"

./redis-cli -host node2 -p 7379 script load "$(cat redis-script-node2.lua)"

./redis-cli -host node3 -p 8379 script load "$(cat redis-script-node3.lua)"

性能

redis默認(rèn)配置。

1

2

3

4

5

6單節(jié)點(diǎn),單線程:

time:0:00:00.959

speed:10427.52867570386

單節(jié)點(diǎn),20線程:

time:0:00:06.710

speed:29806.259314456034

結(jié)論:

單節(jié)點(diǎn),qps約3w

可以線性擴(kuò)展,3個(gè)結(jié)點(diǎn)足以滿足絕大部分的應(yīng)用

java客戶端封裝

在redis-id-generator-java目錄下,有example和benchmark代碼。

在調(diào)用時(shí),要傳入兩個(gè)參數(shù)

tag,即為哪一類服務(wù)生成ID

shardId,即分片由哪個(gè)ID生成,比如一個(gè)用戶的訂單,則分片ID應(yīng)該由userId來(lái)生成

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21public class Example{

public static void main(String[] args){

String tab = "order";

long userId = 123456789;

IdGenerator idGenerator = IdGenerator.builder()

.addHost("127.0.0.1", 6379, "fce3758b2e0af6cbf8fea4d42b379cd0dc374418")

//.addHost("127.0.0.1", 7379, "1abc55928f37176cb934fc7a65069bf32282d817")

//.addHost("127.0.0.1", 8379, "b056d20feb3f89483b10c81027440cbf6920f74f")

.build();

long id = idGenerator.next(tab, userId);

System.out.println("id:" + id);

List result = IdGenerator.parseId(id);

System.out.println("miliSeconds:" + result.get(0) + ", partition:"

+ result.get(1) + ", seq:" + result.get(2));

}

}

多語(yǔ)言客戶端

只要支持redis evalsha命令就可以了。

其它

總結(jié)

以上是生活随笔為你收集整理的java redis id生成器_基于redis的分布式ID生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。