專案需要序號服務,該序號由標誌字母+日期+自增數字。所以,考慮使用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中查...