99
1010class AtomicUtil
1111{
12+ private static function autoCleanDB ()
13+ {
14+ if (RandomUtil::percent (20 )) {
15+ ModelUtil::model ('atomic ' )->where ('expire ' , '< ' , time ())->delete ();
16+ }
17+ }
18+
19+
20+
1221 public static function produce ($ name , $ value , $ expire = 3600 )
1322 {
1423 if (RedisUtil::isEnable ()) {
@@ -21,12 +30,11 @@ public static function produce($name, $value, $expire = 3600)
2130 } else {
2231 ModelUtil::insert ('atomic ' , ['name ' => $ name , 'value ' => $ value , 'expire ' => time () + $ expire ]);
2332 }
24- if (RandomUtil::percent (20 )) {
25- ModelUtil::model ('atomic ' )->where ('expire ' , '< ' , time ())->delete ();
26- }
33+ self ::autoCleanDB ();
2734 }
2835 }
2936
37+
3038 public static function consume ($ name )
3139 {
3240 if (RedisUtil::isEnable ()) {
@@ -36,9 +44,7 @@ public static function consume($name)
3644 }
3745 return false ;
3846 } else {
39- if (RandomUtil::percent (20 )) {
40- ModelUtil::model ('atomic ' )->where ('expire ' , '< ' , time ())->delete ();
41- }
47+ self ::autoCleanDB ();
4248 ModelUtil::transactionBegin ();
4349 $ atomic = ModelUtil::getWithLock ('atomic ' , ['name ' => $ name ]);
4450 if (empty ($ atomic )) {
@@ -56,6 +62,7 @@ public static function consume($name)
5662 }
5763 }
5864
65+
5966 public static function remove ($ name )
6067 {
6168 if (RedisUtil::isEnable ()) {
@@ -65,4 +72,57 @@ public static function remove($name)
6572 ModelUtil::delete ('atomic ' , ['name ' => $ name ]);
6673 }
6774 }
75+
76+
77+ public static function acquire ($ name , $ expire = 30 )
78+ {
79+ if (RedisUtil::isEnable ()) {
80+ $ key = "Atomic: $ name " ;
81+ if (RedisUtil::setnx ($ key , time () + $ expire )) {
82+ RedisUtil::expire ($ key , $ expire );
83+ return true ;
84+ }
85+ $ ts = RedisUtil::get ($ key );
86+ if ($ ts < time ()) {
87+ RedisUtil::delete ($ key );
88+ return self ::acquire ($ name , $ expire );
89+ }
90+ return false ;
91+ } else {
92+ self ::autoCleanDB ();
93+ ModelUtil::transactionBegin ();
94+ $ atomic = ModelUtil::getWithLock ('atomic ' , ['name ' => $ name ]);
95+ $ ts = time () + $ expire ;
96+ if (empty ($ atomic )) {
97+ ModelUtil::insert ('atomic ' , [
98+ 'name ' => $ name ,
99+ 'value ' => 1 ,
100+ 'expire ' => $ ts
101+ ]);
102+ ModelUtil::transactionCommit ();
103+ return true ;
104+ }
105+ if ($ atomic ['expire ' ] < time ()) {
106+ ModelUtil::update ('atomic ' , ['name ' => $ name ], [
107+ 'value ' => 1 ,
108+ 'expire ' => $ ts
109+ ]);
110+ ModelUtil::transactionCommit ();
111+ return true ;
112+ }
113+ ModelUtil::transactionCommit ();
114+ return false ;
115+ }
116+ }
117+
118+
119+ public static function release ($ name )
120+ {
121+ if (RedisUtil::isEnable ()) {
122+ $ key = "Atomic: $ name " ;
123+ RedisUtil::delete ($ key );
124+ } else {
125+ ModelUtil::delete ('atomic ' , ['name ' => $ name ]);
126+ }
127+ }
68128}
0 commit comments