├── .idea
├── .gitignore
├── compiler.xml
├── encodings.xml
├── jarRepositories.xml
├── jpa-buddy.xml
├── misc.xml
├── uiDesigner.xml
└── vcs.xml
├── CR-api
├── pom.xml
└── src
│ └── main
│ └── java
│ ├── annotation
│ └── CacheInterceptor.java
│ └── api
│ ├── ICache.java
│ ├── ICacheContext.java
│ ├── ICacheEntry.java
│ ├── ICacheEvict.java
│ ├── ICacheEvictContext.java
│ ├── ICacheExpire.java
│ ├── ICacheInterceptor.java
│ ├── ICacheInterceptorContext.java
│ ├── ICacheLoad.java
│ ├── ICachePersist.java
│ ├── ICacheRemoveListener.java
│ ├── ICacheRemoveListenerContext.java
│ ├── ICacheSlowListener.java
│ ├── ICacheSlowListenerContext.java
│ └── package-info.java
├── CR-core
├── pom.xml
└── src
│ └── main
│ └── java
│ └── core
│ ├── Context
│ ├── Evict
│ │ ├── Evict.java
│ │ ├── EvictFIFO.java
│ │ └── EvictLFU.java
│ └── Expire
│ │ └── Expire.java
│ ├── KV
│ ├── Key.java
│ ├── KeyValueNode.java
│ └── Values
│ │ ├── HashValue.java
│ │ ├── ListValue.java
│ │ ├── SetValue.java
│ │ ├── StringValue.java
│ │ ├── Value.java
│ │ └── ZSetValue.java
│ ├── bs
│ ├── CacheBs.java
│ └── package-info.java
│ ├── constant
│ ├── GlobalCode.java
│ ├── enums
│ │ ├── CacheRemoveType.java
│ │ └── model
│ │ │ ├── CacheEntry.java
│ │ │ ├── CircleListNode.java
│ │ │ ├── DoubleListNode.java
│ │ │ ├── FreqNode.java
│ │ │ ├── PersistAofEntry.java
│ │ │ └── PersistRdbEntry.java
│ └── package-info.java
│ ├── core
│ ├── CR.java
│ ├── CRcontext.java
│ ├── Cache.java
│ ├── CacheContext.java
│ ├── exception
│ │ ├── CRRunTimeException.java
│ │ ├── CacheRuntimeException.java
│ │ ├── ExceptionCode.java
│ │ └── ExceptionCouple.java
│ └── util
│ │ └── GlobalUtils.java
│ └── support
│ ├── evict
│ ├── AbstractCacheEvict.java
│ ├── CacheEvictClock.java
│ ├── CacheEvictContext.java
│ ├── CacheEvictFifo.java
│ ├── CacheEvictLfu.java
│ ├── CacheEvictLru.java
│ ├── CacheEvictLru2.java
│ ├── CacheEvictLru2Q.java
│ ├── CacheEvictLruDoubleListMap.java
│ ├── CacheEvictLruLinkedHashMap.java
│ ├── CacheEvictNone.java
│ ├── CacheEvicts.java
│ └── package-info.java
│ ├── expire
│ ├── CacheExpire.java
│ ├── CacheExpireRandom.java
│ ├── CacheExpireSort.java
│ └── package-info.java
│ ├── interceptor
│ ├── CacheInterceptorContext.java
│ ├── CacheInterceptors.java
│ ├── aof
│ │ └── CacheInterceptorAof.java
│ ├── common
│ │ └── CacheInterceptorCost.java
│ ├── evict
│ │ └── CacheInterceptorEvict.java
│ ├── package-info.java
│ └── refresh
│ │ └── CacheInterceptorRefresh.java
│ ├── listener
│ ├── package-info.java
│ ├── remove
│ │ ├── CacheRemoveListener.java
│ │ ├── CacheRemoveListenerContext.java
│ │ └── CacheRemoveListeners.java
│ └── slow
│ │ ├── CacheSlowListener.java
│ │ ├── CacheSlowListenerContext.java
│ │ ├── CacheSlowListeners.java
│ │ └── package-info.java
│ ├── load
│ ├── CacheLoadAof.java
│ ├── CacheLoadDbJson.java
│ ├── CacheLoadNone.java
│ ├── CacheLoads.java
│ └── package-info.java
│ ├── map
│ ├── Maps.java
│ └── package-info.java
│ ├── package-info.java
│ ├── persist
│ ├── CachePersistAdaptor.java
│ ├── CachePersistAof.java
│ ├── CachePersistDbJson.java
│ ├── CachePersistNone.java
│ ├── CachePersists.java
│ ├── InnerCachePersist.java
│ └── package-info.java
│ ├── proxy
│ ├── CacheProxy.java
│ ├── ICacheProxy.java
│ ├── bs
│ │ ├── CacheProxyBs.java
│ │ ├── CacheProxyBsContext.java
│ │ └── ICacheProxyBsContext.java
│ ├── cglib
│ │ └── CglibProxy.java
│ ├── dynamic
│ │ ├── DynamicProxy.java
│ │ └── package-info.java
│ ├── none
│ │ └── NoneProxy.java
│ └── package-info.java
│ └── struct
│ ├── lru
│ ├── ILruMap.java
│ └── impl
│ │ ├── LruMapCircleList.java
│ │ └── LruMapDoubleList.java
│ └── package-info.java
├── Readme.md
└── pom.xml
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # 默认忽略的文件
2 | /shelf/
3 | /workspace.xml
4 | # 基于编辑器的 HTTP 客户端请求
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 | # Zeppelin ignored files
10 | /ZeppelinRemoteNotebooks/
11 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
23 |
24 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/jpa-buddy.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/CR-api/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | CacheRedis
7 | org.example
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | CR-api
13 |
14 |
15 | 17
16 | 17
17 |
18 |
19 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/annotation/CacheInterceptor.java:
--------------------------------------------------------------------------------
1 | package annotation;
2 |
3 | import java.lang.annotation.*;
4 |
5 | /**
6 | *
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | @Documented
11 | @Inherited
12 | @Target(ElementType.METHOD)
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface CacheInterceptor {
15 |
16 | /**
17 | * 通用拦截器
18 | *
19 | * 1. 耗时统计
20 | * 2. 慢日志统计
21 | *
22 | * etc.
23 | * @return 默认开启
24 | * @since 0.0.5
25 | */
26 | boolean common() default true;
27 |
28 | /**
29 | * 是否启用刷新
30 | * @return false
31 | * @since 0.0.5
32 | */
33 | boolean refresh() default false;
34 |
35 | /**
36 | * 操作是否需要 append to file,默认为 false
37 | * 主要针对 cache 内容有变更的操作,不包括查询操作。
38 | * 包括删除,添加,过期等操作。
39 | * @return 是否
40 | * @since 0.0.10
41 | */
42 | boolean aof() default false;
43 |
44 | /**
45 | * 是否执行驱除更新
46 | *
47 | * 主要用于 LRU/LFU 等驱除策略
48 | * @return 是否
49 | * @since 0.0.11
50 | */
51 | boolean evict() default false;
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICache.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 | /**
7 | * 缓存接口
8 | * @author xmbcc
9 | * @since 0.0.1
10 | */
11 | public interface ICache extends Map {
12 |
13 | /**
14 | * 设置过期时间
15 | * (1)如果 key 不存在,则什么都不做。
16 | * (2)暂时不提供新建 key 指定过期时间的方式,会破坏原来的方法。
17 | *
18 | * 会做什么:
19 | * 类似于 redis
20 | * (1)惰性删除。
21 | * 在执行下面的方法时,如果过期则进行删除。
22 | * {@link ICache#get(Object)} 获取
23 | * {@link ICache#values()} 获取所有值
24 | * {@link ICache#entrySet()} 获取所有明细
25 | *
26 | * 【数据的不一致性】
27 | * 调用其他方法,可能得到的不是使用者的预期结果,因为此时的 expire 信息可能没有被及时更新。
28 | * 比如
29 | * {@link ICache#isEmpty()} 是否为空
30 | * {@link ICache#size()} 当前大小
31 | * 同时会导致以 size() 作为过期条件的问题。
32 | *
33 | * 解决方案:考虑添加 refresh 等方法,暂时不做一致性的考虑。
34 | * 对于实际的使用,我们更关心 K/V 的信息。
35 | *
36 | * (2)定时删除
37 | * 启动一个定时任务。每次随机选择指定大小的 key 进行是否过期判断。
38 | * 类似于 redis,为了简化,可以考虑设定超时时间,频率与超时时间成反比。
39 | *
40 | * 其他拓展性考虑:
41 | * 后期考虑提供原子性操作,保证事务性。暂时不做考虑。
42 | * 此处默认使用 TTL 作为比较的基准,暂时不想支持 LastAccessTime 的淘汰策略。会增加复杂度。
43 | * 如果增加 lastAccessTime 过期,本方法可以不做修改。
44 | *
45 | * @param key key
46 | * @param timeInMills 毫秒时间之后过期
47 | * @return this
48 | * @since 0.0.3
49 | */
50 | ICache expire(final K key, final long timeInMills);
51 |
52 | /**
53 | * 在指定的时间过期
54 | * @param key key
55 | * @param timeInMills 时间戳
56 | * @return this
57 | * @since 0.0.3
58 | */
59 | ICache expireAt(final K key, final long timeInMills);
60 |
61 | /**
62 | * 获取缓存的过期处理类
63 | * @return 处理类实现
64 | * @since 0.0.4
65 | */
66 | ICacheExpire expire();
67 |
68 | /**
69 | * 删除监听类列表
70 | * @return 监听器列表
71 | * @since 0.0.6
72 | */
73 | List> removeListeners();
74 |
75 | /**
76 | * 慢日志监听类列表
77 | * @return 监听器列表
78 | * @since 0.0.9
79 | */
80 | List slowListeners();
81 |
82 | /**
83 | * 加载信息
84 | * @return 加载信息
85 | * @since 0.0.7
86 | */
87 | ICacheLoad load();
88 |
89 | /**
90 | * 持久化类
91 | * @return 持久化类
92 | * @since 0.0.10
93 | */
94 | ICachePersist persist();
95 |
96 | /**
97 | * 淘汰策略
98 | * @return 淘汰
99 | * @since 0.0.11
100 | */
101 | ICacheEvict evict();
102 |
103 | }
104 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheContext.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | import java.util.Map;
4 |
5 | /**
6 | *
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | public interface ICacheContext {
11 |
12 | /**
13 | * map 信息
14 | * @return map
15 | * @since 0.0.2
16 | */
17 | Map map();
18 |
19 | /**
20 | * 大小限制
21 | * @return 大小限制
22 | * @since 0.0.2
23 | */
24 | int size();
25 |
26 | /**
27 | * 驱除策略
28 | * @return 策略
29 | * @since 0.0.2
30 | */
31 | ICacheEvict cacheEvict();
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheEntry.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheEntry {
9 |
10 | /**
11 | * @since 0.0.11
12 | * @return key
13 | */
14 | K key();
15 |
16 | /**
17 | * @since 0.0.11
18 | * @return value
19 | */
20 | V value();
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheEvict.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheEvict {
9 |
10 | /**
11 | * 驱除策略
12 | *
13 | * @param context 上下文
14 | * @since 0.0.2
15 | * @return 被移除的明细,没有时返回 null
16 | */
17 | ICacheEntry evict(final ICacheEvictContext context);
18 |
19 | /**
20 | * 更新 key 信息
21 | * @param key key
22 | * @since 0.0.11
23 | */
24 | void updateKey(final K key);
25 |
26 | /**
27 | * 删除 key 信息
28 | * @param key key
29 | * @since 0.0.11
30 | */
31 | void removeKey(final K key);
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheEvictContext.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheEvictContext {
9 |
10 | /**
11 | * 新加的 key
12 | * @return key
13 | * @since 0.0.2
14 | */
15 | K key();
16 |
17 | /**
18 | * cache 实现
19 | * @return map
20 | * @since 0.0.2
21 | */
22 | ICache cache();
23 |
24 | /**
25 | * 获取大小
26 | * @return 大小
27 | * @since 0.0.2
28 | */
29 | int size();
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheExpire.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | import java.util.Collection;
4 |
5 | /**
6 | *
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | public interface ICacheExpire {
11 |
12 | /**
13 | * 指定过期信息
14 | * @param key key
15 | * @param expireAt 什么时候过期
16 | * @since 0.0.3
17 | */
18 | void expire(final K key, final long expireAt);
19 |
20 | /**
21 | * 惰性删除中需要处理的 keys
22 | * @param keyList keys
23 | * @since 0.0.3
24 | */
25 | void refreshExpire(final Collection keyList);
26 |
27 | /**
28 | * 待过期的 key
29 | * 不存在,则返回 null
30 | * @param key 待过期的 key
31 | * @return 结果
32 | * @since 0.0.8
33 | */
34 | Long expireTime(final K key);
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheInterceptor.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheInterceptor {
9 |
10 | /**
11 | * 方法执行之前
12 | * @param context 上下文
13 | * @since 0.0.5
14 | */
15 | void before(ICacheInterceptorContext context);
16 |
17 | /**
18 | * 方法执行之后
19 | * @param context 上下文
20 | * @since 0.0.5
21 | */
22 | void after(ICacheInterceptorContext context);
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheInterceptorContext.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | /**
6 | *
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | public interface ICacheInterceptorContext {
11 |
12 | /**
13 | * 缓存信息
14 | * @return 缓存信息
15 | * @since 0.0.5
16 | */
17 | ICache cache();
18 |
19 | /**
20 | * 执行的方法信息
21 | * @return 方法
22 | * @since 0.0.5
23 | */
24 | Method method();
25 |
26 | /**
27 | * 执行的参数
28 | * @return 参数
29 | * @since 0.0.5
30 | */
31 | Object[] params();
32 |
33 | /**
34 | * 方法执行的结果
35 | * @return 结果
36 | * @since 0.0.5
37 | */
38 | Object result();
39 |
40 | /**
41 | * 开始时间
42 | * @return 时间
43 | * @since 0.0.5
44 | */
45 | long startMills();
46 |
47 | /**
48 | * 结束时间
49 | * @return 时间
50 | * @since 0.0.5
51 | */
52 | long endMills();
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheLoad.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheLoad {
9 |
10 | /**
11 | * 加载缓存信息
12 | * @param cache 缓存
13 | * @since 0.0.7
14 | */
15 | void load(final ICache cache);
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICachePersist.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | import java.util.concurrent.TimeUnit;
4 |
5 | /**
6 | *
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | public interface ICachePersist {
11 |
12 | /**
13 | * 持久化缓存信息
14 | * @param cache 缓存
15 | * @since 0.0.7
16 | */
17 | void persist(final ICache cache);
18 |
19 | /**
20 | * 延迟时间
21 | * @return 延迟
22 | * @since 0.0.10
23 | */
24 | long delay();
25 |
26 | /**
27 | * 时间间隔
28 | * @return 间隔
29 | * @since 0.0.10
30 | */
31 | long period();
32 |
33 | /**
34 | * 时间单位
35 | * @return 时间单位
36 | * @since 0.0.10
37 | */
38 | TimeUnit timeUnit();
39 | }
40 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheRemoveListener.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | *
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheRemoveListener {
9 |
10 | /**
11 | * 监听
12 | * @param context 上下文
13 | * @since 0.0.6
14 | */
15 | void listen(final ICacheRemoveListenerContext context);
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheRemoveListenerContext.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | * 删除监听器上下文
5 | *(1)耗时统计
6 | *(2)监听器
7 | * @author lujiaxin
8 | * @date 2023/5/8
9 | */
10 | public interface ICacheRemoveListenerContext {
11 |
12 | /**
13 | * 清空的 key
14 | * @return key
15 | * @since 0.0.6
16 | */
17 | K key();
18 |
19 | /**
20 | * 值
21 | * @return 值
22 | * @since 0.0.6
23 | */
24 | V value();
25 |
26 | /**
27 | * 删除类型
28 | * @return 类型
29 | * @since 0.0.6
30 | */
31 | String type();
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheSlowListener.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | * 慢日志操作接口
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheSlowListener {
9 |
10 | /**
11 | * 监听
12 | * @param context 上下文
13 | * @since 0.0.6
14 | */
15 | void listen(final ICacheSlowListenerContext context);
16 |
17 | /**
18 | * 慢日志的阈值
19 | * @return 慢日志的阈值
20 | * @since 0.0.9
21 | */
22 | long slowerThanMills();
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/ICacheSlowListenerContext.java:
--------------------------------------------------------------------------------
1 | package api;
2 |
3 | /**
4 | * 慢日志监听器上下文
5 | * @author lujiaxin
6 | * @date 2023/5/8
7 | */
8 | public interface ICacheSlowListenerContext {
9 |
10 | /**
11 | * 方法名称
12 | * @return 方法名称
13 | * @since 0.0.9
14 | */
15 | String methodName();
16 |
17 | /**
18 | * 参数信息
19 | * @return 参数列表
20 | * @since 0.0.9
21 | */
22 | Object[] params();
23 |
24 | /**
25 | * 方法结果
26 | * @return 方法结果
27 | * @since 0.0.9
28 | */
29 | Object result();
30 |
31 | /**
32 | * 开始时间
33 | * @return 时间
34 | * @since 0.0.9
35 | */
36 | long startTimeMills();
37 |
38 | /**
39 | * 结束时间
40 | * @return 结束时间
41 | * @since 0.0.9
42 | */
43 | long endTimeMills();
44 |
45 | /**
46 | * 消耗时间
47 | * @return 耗时
48 | * @since 0.0.9
49 | */
50 | long costTimeMills();
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/CR-api/src/main/java/api/package-info.java:
--------------------------------------------------------------------------------
1 | package api;
--------------------------------------------------------------------------------
/CR-core/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | CacheRedis
7 | org.example
8 | 1.0-SNAPSHOT
9 |
10 |
11 | CR-core
12 |
13 |
14 |
15 | org.example
16 | CR-api
17 | 1.0-SNAPSHOT
18 |
19 |
20 | com.github.houbb
21 | aop-core
22 | 0.0.3
23 |
24 |
25 | org.slf4j
26 | jcl-over-slf4j
27 | 2.0.4
28 |
29 |
30 | cglib
31 | cglib
32 | 3.1
33 |
34 |
35 | ch.qos.logback
36 | logback-core
37 | 1.4.5
38 |
39 |
40 | 4.0.0
41 |
42 |
43 |
44 | 17
45 | 17
46 |
47 |
48 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/Context/Evict/Evict.java:
--------------------------------------------------------------------------------
1 | package core.Context.Evict;
2 |
3 | import core.KV.Key;
4 | import core.KV.Values.Value;
5 | import core.core.CRcontext;
6 | import core.core.exception.CRRunTimeException;
7 |
8 | /**
9 | * 淘汰策略接口
10 | * @author lujiaxin
11 | * @date 2023/5/11
12 | */
13 | public interface Evict {
14 |
15 | void doEvict(Key key, Object value, CRcontext crc) throws CRRunTimeException;
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/Context/Evict/EvictFIFO.java:
--------------------------------------------------------------------------------
1 | package core.Context.Evict;
2 |
3 | import core.KV.Key;
4 | import core.core.CRcontext;
5 |
6 | import java.util.LinkedList;
7 | import java.util.Queue;
8 |
9 | import static core.constant.GlobalCode.CACHE_LIMIT_MAX;
10 |
11 | /**
12 | * FIFO(先进先出)淘汰策略
13 | * @author lujiaxin
14 | * @date 2023/5/11
15 | */
16 | public class EvictFIFO implements Evict{
17 |
18 | private Queue list = new LinkedList();
19 |
20 | @Override
21 | public void doEvict(Key key, Object value, CRcontext crc) {
22 |
23 | if(list.size() >= CACHE_LIMIT_MAX){
24 | //超出长度限制,进行淘汰
25 | crc.getMap().remove(list.poll());
26 | }
27 | list.offer(key);
28 | crc.getMap().put(key,value);
29 |
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/Context/Evict/EvictLFU.java:
--------------------------------------------------------------------------------
1 | package core.Context.Evict;
2 |
3 | import core.KV.Key;
4 | import core.KV.KeyValueNode;
5 | import core.core.CRcontext;
6 | import core.core.exception.CRRunTimeException;
7 |
8 | import java.util.HashMap;
9 | import java.util.LinkedHashSet;
10 | import java.util.Map;
11 |
12 | import static core.constant.GlobalCode.*;
13 | import static core.core.exception.ExceptionCode.LFU_MIN_NOTFIND;
14 |
15 | /**
16 | * 淘汰策略-最小使用频次
17 | * @author lujiaxin
18 | * @date 2023/5/11
19 | */
20 | public class EvictLFU implements Evict{
21 |
22 | private Map> map;
23 |
24 | private Integer min;
25 |
26 | public EvictLFU() {
27 | init();
28 | }
29 |
30 | private void init() {
31 |
32 | map = new HashMap<>();
33 | min = LFU_MIN;
34 |
35 | }
36 |
37 | @Override
38 | public void doEvict(Key key, Object value, CRcontext crc) throws CRRunTimeException {
39 |
40 | if(crc.getMap().size() >= CACHE_LIMIT_MAX){
41 | //超出限制,进行淘汰
42 | LinkedHashSet minSet = map.get(min);
43 | //判断是否为空
44 | while(minSet.isEmpty()){
45 | min++;
46 | if(min>crc.getMap().size()) throw new CRRunTimeException(LFU_MIN_NOTFIND);
47 | }
48 | KeyValueNode next = minSet.iterator().next();
49 | crc.getMap().remove(next.getKey(),next.getValue());
50 | }
51 | //放入新元素
52 | LinkedHashSet set = map.get(LFU_INIT_NUM);
53 | KeyValueNode node = new KeyValueNode(key,value);
54 | set.add(node);
55 | map.put(LFU_INIT_NUM,set);
56 | min = LFU_MIN;
57 |
58 | }
59 |
60 | /**
61 | * 频次自增操作
62 | * @param key
63 | * @param value
64 | */
65 | public void doIncrease(Key key,Object value) {
66 |
67 | //自增操作
68 | KeyValueNode node = new KeyValueNode(key, value);
69 | for(int i=0;i set = map.get(i);
71 | if(set.contains(node)){
72 | set.remove(node);
73 | //获取下一个频次,没有就创建
74 | map.getOrDefault(i+1,new LinkedHashSet<>()).add(node);
75 | }
76 | }
77 |
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/Context/Expire/Expire.java:
--------------------------------------------------------------------------------
1 | package core.Context.Expire;
2 |
3 | /**
4 | * 过期策略接口
5 | * @author lujiaxin
6 | * @date 2023/5/11
7 | */
8 | public interface Expire {
9 |
10 | void expire();
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/KV/Key.java:
--------------------------------------------------------------------------------
1 | package core.KV;
2 |
3 | import java.nio.charset.Charset;
4 | import java.nio.charset.StandardCharsets;
5 | import java.util.Arrays;
6 |
7 | /**
8 | * Key为封装的String
9 | *
10 | * @author lujiaxin
11 | * @date 2023/5/9
12 | */
13 | public class Key implements Comparable {
14 |
15 | static final Charset charset = StandardCharsets.UTF_8;
16 | private final byte[] content;
17 | private long expireSeconds;
18 |
19 | /**
20 | * 构造函数
21 | * @param bytes
22 | */
23 | public Key(byte[] bytes){
24 | this.content = bytes;
25 | }
26 |
27 | /**
28 | * 过期构造
29 | *
30 | * @param bytes
31 | * @param expireSeconds
32 | */
33 | public Key(byte[] bytes, long expireSeconds){
34 | this.content = bytes;
35 | this.expireSeconds = expireSeconds;
36 | }
37 | /**
38 | * 重写hashcode
39 | * @return
40 | */
41 | @Override
42 | public int hashCode() {
43 | return Arrays.hashCode(content);
44 | }
45 |
46 | /**
47 | * 转换为utf-8
48 | * @return
49 | */
50 | public String toUtf8(){
51 | return new String(content,charset);
52 | }
53 |
54 | /**
55 | * 重写equals判断key是否唯一
56 | * @param obj
57 | * @return
58 | */
59 | @Override
60 | public boolean equals(Object obj) {
61 |
62 | if (this == obj) return true;
63 |
64 | if(getClass() != obj.getClass() || obj == null) return false;
65 |
66 | Key k = (Key) obj;
67 |
68 | return Arrays.equals(content,k.content);
69 |
70 | }
71 |
72 | @Override
73 | public int compareTo(Key o) {
74 | return 0;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/KV/KeyValueNode.java:
--------------------------------------------------------------------------------
1 | package core.KV;
2 |
3 | /**
4 | * 封装Key、Value的Node节点
5 | * @author lujiaxin
6 | * @date 2023/5/11
7 | */
8 | public class KeyValueNode {
9 |
10 | private Key key;
11 | private Object value;
12 |
13 | public KeyValueNode(Key key, Object value) {
14 | this.key = key;
15 | this.value = value;
16 | }
17 |
18 | public Key getKey() {
19 | return key;
20 | }
21 |
22 | public void setKey(Key key) {
23 | this.key = key;
24 | }
25 |
26 | public Object getValue() {
27 | return value;
28 | }
29 |
30 | public void setValue(Object value) {
31 | this.value = value;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/CR-core/src/main/java/core/KV/Values/HashValue.java:
--------------------------------------------------------------------------------
1 | package core.KV.Values;
2 |
3 | import core.KV.Key;
4 | import core.core.CRcontext;
5 |
6 | import java.util.Map;
7 |
8 | public class HashValue implements Value {
9 |
10 | private Map