Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
ssssssss-team
magic-api
提交
24a7c9ea
M
magic-api
项目概览
ssssssss-team
/
magic-api
10 个月 前同步成功
通知
41
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
magic-api
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
24a7c9ea
编写于
3月 04, 2022
作者:
M
mxd
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修复无法`new HashMap()`的`BUG`
上级
70b2152a
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
140 addition
and
107 deletion
+140
-107
magic-api/src/main/java/org/ssssssss/magicapi/modules/db/cache/DefaultSqlCache.java
...g/ssssssss/magicapi/modules/db/cache/DefaultSqlCache.java
+7
-107
magic-api/src/main/java/org/ssssssss/magicapi/modules/db/cache/LRUCache.java
...java/org/ssssssss/magicapi/modules/db/cache/LRUCache.java
+133
-0
未找到文件。
magic-api/src/main/java/org/ssssssss/magicapi/modules/db/cache/DefaultSqlCache.java
浏览文件 @
24a7c9ea
package
org.ssssssss.magicapi.modules.db.cache
;
package
org.ssssssss.magicapi.modules.db.cache
;
import
java.util.Iterator
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
/**
/**
* 默认SQL缓存实现
* 默认SQL缓存实现
*
*
* @author mxd
* @author mxd
*/
*/
public
class
DefaultSqlCache
extends
LinkedHashMap
<
String
,
DefaultSqlCache
.
ExpireNode
<
Object
>>
implements
SqlCache
{
public
class
DefaultSqlCache
implements
SqlCache
{
private
final
String
separator
=
":"
;
private
final
int
capacity
;
private
final
long
expire
;
private
final
ReentrantReadWriteLock
lock
=
new
ReentrantReadWriteLock
()
;
private
final
LRUCache
cache
;
public
DefaultSqlCache
(
int
capacity
,
long
expire
)
{
public
DefaultSqlCache
(
int
capacity
,
long
expire
)
{
super
((
int
)
Math
.
ceil
(
capacity
/
0.75
)
+
1
,
0.75f
,
true
);
this
.
cache
=
new
LRUCache
(
capacity
,
expire
);
// 容量
this
.
capacity
=
capacity
;
// 固定过期时间
this
.
expire
=
expire
;
}
}
@Override
@Override
public
void
put
(
String
name
,
String
key
,
Object
value
)
{
public
void
put
(
String
name
,
String
key
,
Object
value
)
{
// 封装成过期时间节点
cache
.
put
(
name
,
key
,
value
);
put
(
name
,
key
,
value
,
this
.
expire
);
}
}
@Override
@Override
public
void
put
(
String
name
,
String
key
,
Object
value
,
long
ttl
)
{
public
void
put
(
String
name
,
String
key
,
Object
value
,
long
ttl
)
{
long
expireTime
=
ttl
>
0
?
(
System
.
currentTimeMillis
()
+
ttl
)
:
(
this
.
expire
>
-
1
?
System
.
currentTimeMillis
()
+
this
.
expire
:
Long
.
MAX_VALUE
);
cache
.
put
(
name
,
key
,
value
,
ttl
);
lock
.
writeLock
().
lock
();
try
{
// 封装成过期时间节点
put
(
name
+
separator
+
key
,
new
ExpireNode
<>(
expireTime
,
value
));
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
}
@Override
@Override
public
Object
get
(
String
name
,
String
key
)
{
public
Object
get
(
String
name
,
String
key
)
{
key
=
name
+
separator
+
key
;
return
cache
.
get
(
name
,
key
);
lock
.
readLock
().
lock
();
ExpireNode
<
Object
>
expireNode
;
try
{
expireNode
=
super
.
get
(
key
);
}
finally
{
lock
.
readLock
().
unlock
();
}
if
(
expireNode
==
null
)
{
return
null
;
}
// 惰性删除过期的
// if (this.expire > -1L && expireNode.expire < System.currentTimeMillis()) {
if
(
expireNode
.
expire
<
System
.
currentTimeMillis
())
{
try
{
lock
.
writeLock
().
lock
();
super
.
remove
(
key
);
}
finally
{
lock
.
writeLock
().
unlock
();
}
return
null
;
}
return
expireNode
.
value
;
}
}
@Override
@Override
public
void
delete
(
String
name
)
{
public
void
delete
(
String
name
)
{
try
{
cache
.
delete
(
name
);
lock
.
writeLock
().
lock
();
Iterator
<
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>>
iterator
=
super
.
entrySet
().
iterator
();
String
prefix
=
name
+
separator
;
// 清除所有key前缀为name + separator的缓存
while
(
iterator
.
hasNext
())
{
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
entry
=
iterator
.
next
();
if
(
entry
.
getKey
().
startsWith
(
prefix
))
{
iterator
.
remove
();
}
}
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
}
@Override
protected
boolean
removeEldestEntry
(
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
eldest
)
{
if
(
this
.
expire
>
-
1L
&&
size
()
>
capacity
)
{
clean
();
}
// lru淘汰
return
size
()
>
this
.
capacity
;
}
/**
* 清理已过期的数据
*/
private
void
clean
()
{
try
{
lock
.
writeLock
().
lock
();
Iterator
<
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>>
iterator
=
super
.
entrySet
().
iterator
();
long
now
=
System
.
currentTimeMillis
();
while
(
iterator
.
hasNext
())
{
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
next
=
iterator
.
next
();
// 判断是否过期
if
(
next
.
getValue
().
expire
<
now
)
{
iterator
.
remove
();
}
}
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
/**
* 过期时间节点
*/
static
class
ExpireNode
<
V
>
{
long
expire
;
V
value
;
ExpireNode
(
long
expire
,
V
value
)
{
this
.
expire
=
expire
;
this
.
value
=
value
;
}
}
}
}
magic-api/src/main/java/org/ssssssss/magicapi/modules/db/cache/LRUCache.java
0 → 100644
浏览文件 @
24a7c9ea
package
org.ssssssss.magicapi.modules.db.cache
;
import
java.util.Iterator
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
/**
* LRU缓存实现
*
* @author mxd
*/
public
class
LRUCache
extends
LinkedHashMap
<
String
,
LRUCache
.
ExpireNode
<
Object
>>
{
private
final
String
separator
=
":"
;
private
final
int
capacity
;
private
final
long
expire
;
private
final
ReentrantReadWriteLock
lock
=
new
ReentrantReadWriteLock
();
public
LRUCache
(
int
capacity
,
long
expire
)
{
super
((
int
)
Math
.
ceil
(
capacity
/
0.75
)
+
1
,
0.75f
,
true
);
// 容量
this
.
capacity
=
capacity
;
// 固定过期时间
this
.
expire
=
expire
;
}
public
void
put
(
String
name
,
String
key
,
Object
value
)
{
// 封装成过期时间节点
put
(
name
,
key
,
value
,
this
.
expire
);
}
public
void
put
(
String
name
,
String
key
,
Object
value
,
long
ttl
)
{
long
expireTime
=
ttl
>
0
?
(
System
.
currentTimeMillis
()
+
ttl
)
:
(
this
.
expire
>
-
1
?
System
.
currentTimeMillis
()
+
this
.
expire
:
Long
.
MAX_VALUE
);
lock
.
writeLock
().
lock
();
try
{
// 封装成过期时间节点
put
(
name
+
separator
+
key
,
new
ExpireNode
<>(
expireTime
,
value
));
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
public
Object
get
(
String
name
,
String
key
)
{
key
=
name
+
separator
+
key
;
lock
.
readLock
().
lock
();
ExpireNode
<
Object
>
expireNode
;
try
{
expireNode
=
super
.
get
(
key
);
}
finally
{
lock
.
readLock
().
unlock
();
}
if
(
expireNode
==
null
)
{
return
null
;
}
// 惰性删除过期的
// if (this.expire > -1L && expireNode.expire < System.currentTimeMillis()) {
if
(
expireNode
.
expire
<
System
.
currentTimeMillis
())
{
try
{
lock
.
writeLock
().
lock
();
super
.
remove
(
key
);
}
finally
{
lock
.
writeLock
().
unlock
();
}
return
null
;
}
return
expireNode
.
value
;
}
public
void
delete
(
String
name
)
{
try
{
lock
.
writeLock
().
lock
();
Iterator
<
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>>
iterator
=
super
.
entrySet
().
iterator
();
String
prefix
=
name
+
separator
;
// 清除所有key前缀为name + separator的缓存
while
(
iterator
.
hasNext
())
{
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
entry
=
iterator
.
next
();
if
(
entry
.
getKey
().
startsWith
(
prefix
))
{
iterator
.
remove
();
}
}
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
@Override
protected
boolean
removeEldestEntry
(
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
eldest
)
{
if
(
this
.
expire
>
-
1L
&&
size
()
>
capacity
)
{
clean
();
}
// lru淘汰
return
size
()
>
this
.
capacity
;
}
/**
* 清理已过期的数据
*/
private
void
clean
()
{
try
{
lock
.
writeLock
().
lock
();
Iterator
<
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>>
iterator
=
super
.
entrySet
().
iterator
();
long
now
=
System
.
currentTimeMillis
();
while
(
iterator
.
hasNext
())
{
Map
.
Entry
<
String
,
ExpireNode
<
Object
>>
next
=
iterator
.
next
();
// 判断是否过期
if
(
next
.
getValue
().
expire
<
now
)
{
iterator
.
remove
();
}
}
}
finally
{
lock
.
writeLock
().
unlock
();
}
}
/**
* 过期时间节点
*/
static
class
ExpireNode
<
V
>
{
long
expire
;
V
value
;
ExpireNode
(
long
expire
,
V
value
)
{
this
.
expire
=
expire
;
this
.
value
=
value
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录