Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cache
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Odysseus
cache
Commits
99276f71
Commit
99276f71
authored
Jan 25, 2024
by
vicotor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add user info to cache
parent
85e94860
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
269 additions
and
20 deletions
+269
-20
errors.go
cachedata/errors.go
+7
-0
payment.go
cachedata/payment.go
+1
-0
task.go
cachedata/task.go
+12
-0
userInfo.go
cachedata/userInfo.go
+228
-0
payment.go
payment.go
+19
-12
redislock.go
redisService/redislock.go
+2
-8
No files found.
cachedata/errors.go
0 → 100644
View file @
99276f71
package
cachedata
import
"errors"
var
(
ErrNotExist
=
errors
.
New
(
"not exist"
)
)
cachedata/payment.go
0 → 100644
View file @
99276f71
package
cachedata
cachedata/task.go
View file @
99276f71
...
@@ -95,3 +95,15 @@ func (c *CacheData) GetTaskWithId(id int64) (*model.TaskType, error) {
...
@@ -95,3 +95,15 @@ func (c *CacheData) GetTaskWithId(id int64) (*model.TaskType, error) {
return
nil
,
err
return
nil
,
err
}
}
}
}
func
(
c
*
CacheData
)
SetTaskDataToRedis
(
task
*
model
.
TaskType
)
error
{
taskIdKey
:=
"task-id-"
+
strconv
.
FormatInt
(
task
.
ID
,
10
)
if
data
,
err
:=
json
.
Marshal
(
task
);
err
==
nil
{
if
err
=
c
.
rdb
.
Set
(
c
.
ctx
,
taskIdKey
,
string
(
data
),
0
)
.
Err
();
err
==
nil
{
return
nil
}
return
err
}
else
{
return
err
}
}
cachedata/userInfo.go
0 → 100644
View file @
99276f71
package
cachedata
import
(
"github.com/odysseus/payment/model"
"github.com/odysseus/payment/redisService"
goredislib
"github.com/redis/go-redis/v9"
log
"github.com/sirupsen/logrus"
"strconv"
"time"
)
const
(
USER_INFO_LOCK_PRE
=
"u-lock:"
USER_INFO_KEY_PRE
=
"u-info:"
USER_INFO_DELETED_KEY
=
USER_INFO_KEY_PRE
+
"deleted:"
USER_INFO_LEVEL_KEY
=
USER_INFO_KEY_PRE
+
"level:"
USER_INFO_BALANCE_KEY
=
USER_INFO_KEY_PRE
+
"bal:"
USER_INFO_CHARGE_KEY
=
USER_INFO_KEY_PRE
+
"charge:"
USER_INFO_LOCK_DURATION
=
10
*
1000
*
1000
)
type
UserInfo
struct
{
Deleted
int
`json:"deleted"`
Level
int
`json:"level"`
Balance
int64
`json:"balance"`
Charge
int64
`json:"charge"`
}
func
(
c
*
CacheData
)
checkExist
(
uid
int64
)
(
bool
,
error
)
{
key
:=
USER_INFO_DELETED_KEY
+
strconv
.
FormatInt
(
uid
,
10
)
if
_
,
err
:=
c
.
rdb
.
Get
(
c
.
ctx
,
key
)
.
Result
();
err
==
nil
{
return
true
,
nil
}
else
if
err
==
goredislib
.
Nil
{
return
false
,
nil
}
else
{
return
false
,
err
}
}
// value: 0: not deleted, 1: deleted
func
(
c
*
CacheData
)
UpdateUserDeleted
(
uid
int64
,
value
int
)
error
{
exist
,
err
:=
c
.
checkExist
(
uid
)
if
err
!=
nil
{
return
err
}
if
!
exist
{
return
ErrNotExist
}
lockKey
:=
USER_INFO_LOCK_PRE
+
strconv
.
FormatInt
(
uid
,
10
)
for
{
locked
,
release
,
err
:=
redisService
.
TryAcquire
(
c
.
ctx
,
c
.
rdb
,
lockKey
,
USER_INFO_LOCK_DURATION
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to acquire user lock"
)
return
err
}
if
!
locked
{
time
.
Sleep
(
USER_INFO_LOCK_DURATION
)
continue
}
defer
release
()
key
:=
USER_INFO_DELETED_KEY
+
strconv
.
FormatInt
(
uid
,
10
)
err
=
c
.
rdb
.
Set
(
c
.
ctx
,
key
,
value
,
0
)
.
Err
()
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to set user deleted"
)
return
err
}
}
return
nil
}
func
(
c
*
CacheData
)
UpdateUserLevel
(
uid
int64
,
value
int
)
error
{
exist
,
err
:=
c
.
checkExist
(
uid
)
if
err
!=
nil
{
return
err
}
if
!
exist
{
return
ErrNotExist
}
lockKey
:=
USER_INFO_LOCK_PRE
+
strconv
.
FormatInt
(
uid
,
10
)
for
{
locked
,
release
,
err
:=
redisService
.
TryAcquire
(
c
.
ctx
,
c
.
rdb
,
lockKey
,
USER_INFO_LOCK_DURATION
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to acquire user lock"
)
return
err
}
if
!
locked
{
time
.
Sleep
(
USER_INFO_LOCK_DURATION
)
continue
}
defer
release
()
key
:=
USER_INFO_LEVEL_KEY
+
strconv
.
FormatInt
(
uid
,
10
)
err
=
c
.
rdb
.
Set
(
c
.
ctx
,
key
,
value
,
0
)
.
Err
()
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to set user level"
)
return
err
}
}
return
nil
}
func
(
c
*
CacheData
)
UpdateUserBalance
(
uid
int64
,
value
int
)
error
{
exist
,
err
:=
c
.
checkExist
(
uid
)
if
err
!=
nil
{
return
err
}
if
!
exist
{
return
ErrNotExist
}
lockKey
:=
USER_INFO_LOCK_PRE
+
strconv
.
FormatInt
(
uid
,
10
)
for
{
locked
,
release
,
err
:=
redisService
.
TryAcquire
(
c
.
ctx
,
c
.
rdb
,
lockKey
,
USER_INFO_LOCK_DURATION
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to acquire user lock"
)
return
err
}
if
!
locked
{
time
.
Sleep
(
USER_INFO_LOCK_DURATION
)
continue
}
defer
release
()
key
:=
USER_INFO_BALANCE_KEY
+
strconv
.
FormatInt
(
uid
,
10
)
err
=
c
.
rdb
.
Set
(
c
.
ctx
,
key
,
value
,
0
)
.
Err
()
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to set user balance"
)
return
err
}
}
return
nil
}
// update equal set
func
(
c
*
CacheData
)
UpdateUserCharge
(
uid
int64
,
value
int
)
error
{
exist
,
err
:=
c
.
checkExist
(
uid
)
if
err
!=
nil
{
return
err
}
if
!
exist
{
return
ErrNotExist
}
lockKey
:=
USER_INFO_LOCK_PRE
+
strconv
.
FormatInt
(
uid
,
10
)
for
{
locked
,
release
,
err
:=
redisService
.
TryAcquire
(
c
.
ctx
,
c
.
rdb
,
lockKey
,
USER_INFO_LOCK_DURATION
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to acquire user lock"
)
return
err
}
if
!
locked
{
time
.
Sleep
(
USER_INFO_LOCK_DURATION
)
continue
}
defer
release
()
key
:=
USER_INFO_CHARGE_KEY
+
strconv
.
FormatInt
(
uid
,
10
)
err
=
c
.
rdb
.
Set
(
c
.
ctx
,
key
,
value
,
0
)
.
Err
()
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to set user charge"
)
return
err
}
}
return
nil
}
func
(
c
*
CacheData
)
SetUserInfo
(
user
*
model
.
User
)
error
{
info
:=
UserInfo
{
Deleted
:
int
(
user
.
Deleted
),
Level
:
int
(
user
.
LevelId
),
Balance
:
user
.
Balance
,
Charge
:
0
,
}
idStr
:=
strconv
.
FormatInt
(
user
.
ID
,
10
)
// set every info with pipeline
pip
:=
c
.
rdb
.
TxPipeline
()
// set user deleted
pip
.
Set
(
c
.
ctx
,
USER_INFO_DELETED_KEY
+
idStr
,
info
.
Deleted
,
0
)
// set user level
pip
.
Set
(
c
.
ctx
,
USER_INFO_LEVEL_KEY
+
idStr
,
info
.
Level
,
0
)
// set user balance
pip
.
Set
(
c
.
ctx
,
USER_INFO_BALANCE_KEY
+
idStr
,
info
.
Balance
,
0
)
// set user charge
pip
.
Set
(
c
.
ctx
,
USER_INFO_CHARGE_KEY
+
idStr
,
info
.
Charge
,
0
)
_
,
err
:=
pip
.
Exec
(
c
.
ctx
)
return
err
}
func
(
c
*
CacheData
)
GetUserInfo
(
uid
int64
)
(
*
UserInfo
,
error
)
{
idStr
:=
strconv
.
FormatInt
(
uid
,
10
)
// get every info with pipeline
pip
:=
c
.
rdb
.
Pipeline
()
// get user deleted
deletedCmd
:=
pip
.
Get
(
c
.
ctx
,
USER_INFO_DELETED_KEY
+
idStr
)
// get user level
levelCmd
:=
pip
.
Get
(
c
.
ctx
,
USER_INFO_LEVEL_KEY
+
idStr
)
// get user balance
balCmd
:=
pip
.
Get
(
c
.
ctx
,
USER_INFO_BALANCE_KEY
+
idStr
)
// get user charge
chargeCmd
:=
pip
.
Get
(
c
.
ctx
,
USER_INFO_CHARGE_KEY
+
idStr
)
_
,
err
:=
pip
.
Exec
(
c
.
ctx
)
if
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"failed to get user info"
)
return
nil
,
err
}
var
info
=
new
(
UserInfo
)
if
deletedCmd
.
Err
()
==
nil
&&
levelCmd
.
Err
()
==
nil
&&
balCmd
.
Err
()
==
nil
&&
chargeCmd
.
Err
()
==
nil
{
info
.
Deleted
,
_
=
strconv
.
Atoi
(
deletedCmd
.
Val
())
info
.
Level
,
_
=
strconv
.
Atoi
(
levelCmd
.
Val
())
info
.
Balance
,
_
=
strconv
.
ParseInt
(
balCmd
.
Val
(),
10
,
64
)
info
.
Charge
,
_
=
strconv
.
ParseInt
(
chargeCmd
.
Val
(),
10
,
64
)
return
info
,
nil
}
if
deletedCmd
.
Err
()
==
goredislib
.
Nil
||
levelCmd
.
Err
()
==
goredislib
.
Nil
||
balCmd
.
Err
()
==
goredislib
.
Nil
||
chargeCmd
.
Err
()
==
goredislib
.
Nil
{
// get user from db.
if
user
,
err
:=
c
.
userRepo
.
GetById
(
uid
);
err
==
nil
{
info
.
Deleted
=
int
(
user
.
Deleted
)
info
.
Level
=
int
(
user
.
LevelId
)
info
.
Balance
=
user
.
Balance
info
.
Charge
=
0
c
.
SetUserInfo
(
user
)
return
info
,
nil
}
}
return
nil
,
err
}
payment.go
View file @
99276f71
...
@@ -2,6 +2,7 @@ package payment
...
@@ -2,6 +2,7 @@ package payment
import
(
import
(
"context"
"context"
"github.com/odysseus/payment/redisService"
"github.com/redis/go-redis/v9"
"github.com/redis/go-redis/v9"
"time"
"time"
)
)
...
@@ -10,6 +11,12 @@ type Payment struct {
...
@@ -10,6 +11,12 @@ type Payment struct {
rdb
*
redis
.
Client
rdb
*
redis
.
Client
}
}
type
RedisConnParam
struct
{
Addr
string
Password
string
DbIndex
int
}
func
NewPayment
(
redisConfig
RedisConnParam
)
*
Payment
{
func
NewPayment
(
redisConfig
RedisConnParam
)
*
Payment
{
return
&
Payment
{
return
&
Payment
{
rdb
:
redis
.
NewClient
(
&
redis
.
Options
{
rdb
:
redis
.
NewClient
(
&
redis
.
Options
{
...
@@ -95,7 +102,7 @@ func (p *Payment) MIncrBalance(ctx context.Context, uids []string, bals []int64)
...
@@ -95,7 +102,7 @@ func (p *Payment) MIncrBalance(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -142,7 +149,7 @@ func (p *Payment) MDecrBalance(ctx context.Context, uids []string, bals []int64)
...
@@ -142,7 +149,7 @@ func (p *Payment) MDecrBalance(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -189,7 +196,7 @@ func (p *Payment) MIncrCharge(ctx context.Context, uids []string, bals []int64)
...
@@ -189,7 +196,7 @@ func (p *Payment) MIncrCharge(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -236,7 +243,7 @@ func (p *Payment) MDecrCharge(ctx context.Context, uids []string, bals []int64)
...
@@ -236,7 +243,7 @@ func (p *Payment) MDecrCharge(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -283,7 +290,7 @@ func (p *Payment) MIncrCredits(ctx context.Context, uids []string, bals []int64)
...
@@ -283,7 +290,7 @@ func (p *Payment) MIncrCredits(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -330,7 +337,7 @@ func (p *Payment) MDecrCredits(ctx context.Context, uids []string, bals []int64)
...
@@ -330,7 +337,7 @@ func (p *Payment) MDecrCredits(ctx context.Context, uids []string, bals []int64)
for
i
,
_
:=
range
uids
{
for
i
,
_
:=
range
uids
{
for
{
for
{
locked
,
release
,
_
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
locked
,
release
,
_
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkeys
[
i
],
5
*
time
.
Second
)
if
locked
{
if
locked
{
releases
[
i
]
=
release
releases
[
i
]
=
release
break
break
...
@@ -365,7 +372,7 @@ func (p *Payment) IncrBalance(ctx context.Context, uid string, bal int64) (int64
...
@@ -365,7 +372,7 @@ func (p *Payment) IncrBalance(ctx context.Context, uid string, bal int64) (int64
key
:=
"balance:"
+
uid
key
:=
"balance:"
+
uid
lockkey
:=
"lk-bal"
+
uid
lockkey
:=
"lk-bal"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
@@ -387,7 +394,7 @@ func (p *Payment) DecrBalance(ctx context.Context, uid string, bal int64) (int64
...
@@ -387,7 +394,7 @@ func (p *Payment) DecrBalance(ctx context.Context, uid string, bal int64) (int64
key
:=
"balance:"
+
uid
key
:=
"balance:"
+
uid
lockkey
:=
"lk-bal"
+
uid
lockkey
:=
"lk-bal"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
@@ -406,7 +413,7 @@ func (p *Payment) IncrCharge(ctx context.Context, uid string, bal int64) (int64,
...
@@ -406,7 +413,7 @@ func (p *Payment) IncrCharge(ctx context.Context, uid string, bal int64) (int64,
key
:=
"charge:"
+
uid
key
:=
"charge:"
+
uid
lockkey
:=
"lk-char"
+
uid
lockkey
:=
"lk-char"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
@@ -430,7 +437,7 @@ func (p *Payment) DecrCharge(ctx context.Context, uid string, bal int64) (int64,
...
@@ -430,7 +437,7 @@ func (p *Payment) DecrCharge(ctx context.Context, uid string, bal int64) (int64,
key
:=
"charge:"
+
uid
key
:=
"charge:"
+
uid
lockkey
:=
"lk-char"
+
uid
lockkey
:=
"lk-char"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
@@ -449,7 +456,7 @@ func (p *Payment) IncrCredits(ctx context.Context, uid string, bal int64) (int64
...
@@ -449,7 +456,7 @@ func (p *Payment) IncrCredits(ctx context.Context, uid string, bal int64) (int64
key
:=
"credits:"
+
uid
key
:=
"credits:"
+
uid
lockkey
:=
"lk-credit"
+
uid
lockkey
:=
"lk-credit"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
@@ -473,7 +480,7 @@ func (p *Payment) DecrCredits(ctx context.Context, uid string, bal int64) (int64
...
@@ -473,7 +480,7 @@ func (p *Payment) DecrCredits(ctx context.Context, uid string, bal int64) (int64
key
:=
"credits:"
+
uid
key
:=
"credits:"
+
uid
lockkey
:=
"lk-credit"
+
uid
lockkey
:=
"lk-credit"
+
uid
for
{
for
{
locked
,
release
,
err
:=
t
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
locked
,
release
,
err
:=
redisService
.
T
ryAcquire
(
ctx
,
p
.
rdb
,
lockkey
,
5
*
time
.
Second
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
err
return
0
,
err
}
}
...
...
redislock.go
→
redis
Service/redis
lock.go
View file @
99276f71
package
payment
package
redisService
import
(
import
(
"context"
"context"
...
@@ -11,13 +11,7 @@ import (
...
@@ -11,13 +11,7 @@ import (
"time"
"time"
)
)
type
RedisConnParam
struct
{
func
TryAcquire
(
ctx
context
.
Context
,
rs
*
goredislib
.
Client
,
lockKey
string
,
lockTimeout
time
.
Duration
)
(
acquired
bool
,
release
func
(),
_
error
)
{
Addr
string
Password
string
DbIndex
int
}
func
tryAcquire
(
ctx
context
.
Context
,
rs
*
goredislib
.
Client
,
lockKey
string
,
lockTimeout
time
.
Duration
)
(
acquired
bool
,
release
func
(),
_
error
)
{
timeout
:=
time
.
Now
()
.
Add
(
lockTimeout
)
.
UnixNano
()
timeout
:=
time
.
Now
()
.
Add
(
lockTimeout
)
.
UnixNano
()
lockToken
:=
fmt
.
Sprintf
(
"%d,%s"
,
timeout
,
uuid
.
New
()
.
String
())
lockToken
:=
fmt
.
Sprintf
(
"%d,%s"
,
timeout
,
uuid
.
New
()
.
String
())
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment