mysql和redis實現自定義序號生成

2021-10-14 13:47:41 字數 2786 閱讀 8073

專案需要序號服務,該序號由標誌字母+日期+自增數字。所以,考慮使用redis和mysql的方式去實現它。獲取序號通過redis,可以保證執行緒安全。然後號段通過mysql去操作,對mysql的操作通過redisson分布式鎖保證分布式一致性。

1,所需環境

redis和redisson分布式鎖

mysql

mybatisplus

2,資料庫表

create

table

`t_redis_sequence`

(`biz_tag`

varchar(64

)not

null

comment

'業務標籤'

,`prefix_abc`

varchar(16

)not

null

default

''comment

'最開頭 字母字首'

,`prefix_date`

varchar(16

)not

null

default

''comment

'日期字首'

,`length`

int(11)

notnull

default

'7'comment

'字段長度'

,`current_id`

bigint(20

)not

null

default

'1'comment

'當前編號'

,`refresh`

tinyint(4

)not

null

default

'0'comment

'是否每日重新整理,1 重新整理 0 不重新整理'

,primary

key(

`biz_tag`))

engine

=innodb

default

charset

=utf8mb4 comment

='redis取流水號表'

3,業務實現**
@component

@slf4j

public

class

redisseqgenerator

//從資料庫獲取seq

selectbyid

(biztag);if

(seq == null)

current = seq.

getcurrentid()

; seq.

setcurrentid

(seq.

getcurrentid()

+ section_width)

;updatebyid

(seq)

;//存入redis快取

cache

(biztag, seq,current)

; id = tmsredisutils.

listleftpop

(rediskeyconstant.tms_sequence_prefix + biztag);}

finally

}return id;

}/** 存入redis快取 */

private

void

cache

(string biztag, redissequence seq,long current)

tmsredisutils.

listrightpushall

(rediskeyconstant.tms_sequence_prefix + biztag,ids);}

/** 在前面加0 */

private string addzerotoseq

(long currentid,

int length)

}return c;

}}

4,所依賴的列舉類,實體類
@getter

public

enum redisseqenums

}

@data

@noargsconstructor

@allargsconstructor

@tablename

("t_redis_sequence"

)@accessors

(chain =

true

)public

class

redissequence

implements

serializable

5,序號的每日重新整理

我通過定時任務的方式去重新整理日期字串,大家可以用的定時元件不一致,我這邊只提供**

//修改資料庫中的時間日期字串

string datestr = localdatetime.

now().

format

(timeconstant.formatter)

; list

selectcurrentidbyrefresh()

;if(list != null && list.

size()

>0)

);}//清空redis快取的流水號

for(redisseqenums value : redisseqenums.

values()

)

PHP 通過redis和mysql實現秒殺業務

db mysqldb getinstance info db fetchrow select from goods where goods id 1 判斷是否還有庫存 if info stock 0 減少庫存,num 只是乙個記錄修改資料的次數,可以判斷是否存在超賣現象 result db upda...

redis和mysql的區別

我們知道,mysql是持久化儲存,存放在磁碟裡面,檢索的話,會涉及到一定的io,為了解決這個瓶頸,於是出現了快取,比如現在用的最多的 memcached 簡稱mc 首先,使用者訪問mc,如果未命中,就去訪問mysql,之後像記憶體和硬碟一樣,把資料複製到mc一部分。redis和mc都是快取,並且都是...

Redis和MySQL的區別

mysql是關係型資料庫,是持久化儲存的,查詢檢索的話,會涉及到磁碟io操作,為了提高效能,可以使用快取技術,而memcached就是記憶體資料庫,資料儲存在記憶體中 當然也可以進行持久化儲存 可以用作快取資料庫。使用者首先去memcached查詢資料,如果未查找到 即快取未命中 才去mysql中查...