Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gxpt_ht
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
pseer
gxpt_ht
Commits
5bbff7b3
Commit
5bbff7b3
authored
Oct 11, 2024
by
吕明尚
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改验券幂等
parent
a35eee80
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
75 additions
and
81 deletions
+75
-81
pom.xml
share-common/pom.xml
+0
-6
RedisLockUtil.java
...ommon/src/main/java/share/common/utils/RedisLockUtil.java
+75
-0
RepeatSubmit.java
...on/src/main/java/share/common/utils/aop/RepeatSubmit.java
+0
-14
RepeatSubmitAspect.java
.../main/java/share/common/utils/aop/RepeatSubmitAspect.java
+0
-61
QPServiceImpl.java
...rc/main/java/share/system/service/impl/QPServiceImpl.java
+0
-0
TiktokServiceImpl.java
...ain/java/share/system/service/impl/TiktokServiceImpl.java
+0
-0
No files found.
share-common/pom.xml
View file @
5bbff7b3
...
@@ -177,11 +177,6 @@
...
@@ -177,11 +177,6 @@
<version>
1.4.9
</version>
<version>
1.4.9
</version>
</dependency>
</dependency>
<dependency>
<groupId>
com.google.guava
</groupId>
<artifactId>
guava
</artifactId>
<version>
21.0
</version>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
\ No newline at end of file
share-common/src/main/java/share/common/utils/RedisLockUtil.java
0 → 100644
View file @
5bbff7b3
package
share
.
common
.
utils
;
import
org.springframework.data.redis.core.RedisCallback
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Objects
;
/**
* @ClassName RedisLockUtil
* @Description 使用redis做锁
* @Author Wangyujie
* @Version V1.1.0
*/
@Component
public
class
RedisLockUtil
{
@Resource
RedisTemplate
<
String
,
Object
>
redisTemplate
;
/**
* 获取锁Key
*
* @param prefix 前缀
* @param name 名称
* @return
*/
public
static
String
getFullKey
(
String
prefix
,
String
name
)
{
return
prefix
+
"_"
+
name
;
}
/**
* 获取锁,true 则得到锁,false 已被锁定
*
* @param lockName 锁名称
* @param lockExoire 锁时间毫秒
* @return
*/
public
Boolean
getLock
(
String
lockName
,
Integer
lockExoire
)
{
return
(
Boolean
)
redisTemplate
.
execute
((
RedisCallback
<?>)
connection
->
{
// 获取时间毫秒值
long
expireAt
=
System
.
currentTimeMillis
()
+
lockExoire
+
1
;
// 获取锁
Boolean
acquire
=
connection
.
setNX
(
lockName
.
getBytes
(),
String
.
valueOf
(
expireAt
).
getBytes
());
if
(
acquire
)
{
return
true
;
}
else
{
byte
[]
bytes
=
connection
.
get
(
lockName
.
getBytes
());
// 非空判断
if
(
Objects
.
nonNull
(
bytes
)
&&
bytes
.
length
>
0
)
{
long
expireTime
=
Long
.
parseLong
(
new
String
(
bytes
));
// 如果锁已经过期
if
(
expireTime
<
System
.
currentTimeMillis
())
{
// 重新加锁,防止死锁
byte
[]
set
=
connection
.
getSet
(
lockName
.
getBytes
(),
String
.
valueOf
(
System
.
currentTimeMillis
()
+
lockExoire
+
1
).
getBytes
());
return
Long
.
parseLong
(
new
String
(
set
))
<
System
.
currentTimeMillis
();
}
}
}
return
false
;
});
}
/**
* 删除锁
*
* @param lockName
*/
public
void
delLock
(
String
lockName
)
{
redisTemplate
.
delete
(
lockName
);
}
}
share-common/src/main/java/share/common/utils/aop/RepeatSubmit.java
deleted
100644 → 0
View file @
a35eee80
package
share
.
common
.
utils
.
aop
;
import
java.lang.annotation.*
;
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
@Inherited
public
@interface
RepeatSubmit
{
String
key
()
default
""
;
}
share-common/src/main/java/share/common/utils/aop/RepeatSubmitAspect.java
deleted
100644 → 0
View file @
a35eee80
package
share
.
common
.
utils
.
aop
;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
org.apache.commons.lang3.StringUtils
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.reflect.MethodSignature
;
import
org.springframework.stereotype.Component
;
import
java.lang.reflect.Method
;
import
java.util.concurrent.TimeUnit
;
@Aspect
@Component
public
class
RepeatSubmitAspect
{
private
static
final
Cache
<
String
,
Object
>
CACHES
=
CacheBuilder
.
newBuilder
()
// 最大缓存 设置为1000个
.
maximumSize
(
1000
)
// 设置写缓存后1s过期
.
expireAfterWrite
(
1
,
TimeUnit
.
SECONDS
)
.
build
();
@Around
(
"execution(public * *(..)) && @annotation(share.common.utils.aop.RepeatSubmit))"
)
public
Object
interceptor
(
ProceedingJoinPoint
pjp
)
{
MethodSignature
signature
=
(
MethodSignature
)
pjp
.
getSignature
();
Method
method
=
signature
.
getMethod
();
RepeatSubmit
repeatSubmit
=
method
.
getAnnotation
(
RepeatSubmit
.
class
);
String
key
=
getKey
(
repeatSubmit
.
key
(),
pjp
.
getArgs
());
if
(
StringUtils
.
isNotBlank
(
key
))
{
if
(
CACHES
.
getIfPresent
(
key
)
!=
null
)
{
throw
new
RuntimeException
(
"请勿重复请求"
);
}
// 如果是第一次请求,就将key 当前对象压入缓存中
CACHES
.
put
(
key
,
key
);
}
try
{
return
pjp
.
proceed
();
}
catch
(
Throwable
throwable
)
{
throw
new
RuntimeException
(
"服务器异常!"
);
}
}
/**
* key 的生成策略
*
* @param keyExpress 表达式
* @param args 参数
* @return 生成的key
*/
private
String
getKey
(
String
keyExpress
,
Object
[]
args
)
{
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
keyExpress
=
keyExpress
.
replace
(
"arg["
+
i
+
"]"
,
args
[
i
].
toString
());
}
return
keyExpress
;
}
}
share-system/src/main/java/share/system/service/impl/QPServiceImpl.java
View file @
5bbff7b3
This diff is collapsed.
Click to expand it.
share-system/src/main/java/share/system/service/impl/TiktokServiceImpl.java
View file @
5bbff7b3
This diff is collapsed.
Click to expand it.
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