@@ -76,9 +76,11 @@ use crate::get_milltimestamp;
76
76
#[ cfg( feature = "ttl" ) ]
77
77
const DEFAULT_CHECK_STEP : u64 = 120 ;
78
78
79
+ /// Lfu节点数据
79
80
pub ( crate ) struct LfuEntry < K , V > {
80
81
pub key : mem:: MaybeUninit < K > ,
81
82
pub val : mem:: MaybeUninit < V > ,
83
+ /// 访问总频次
82
84
pub counter : usize ,
83
85
/// 带ttl的过期时间,单位秒
84
86
/// 如果为u64::MAX,则表示不过期
@@ -156,11 +158,15 @@ pub struct LfuCache<K, V, S> {
156
158
/// 因为HashSet的pop耗时太长, 所以取LfuCache暂时做为平替
157
159
times_map : HashMap < u8 , LruCache < KeyRef < K > , ( ) , DefaultHasher > > ,
158
160
cap : usize ,
161
+ /// 最大的访问频次
159
162
max_freq : u8 ,
163
+ /// 最小的访问频次
160
164
min_freq : u8 ,
165
+ /// 总的访问次数
161
166
visit_count : usize ,
162
-
167
+ /// 初始的访问次数
163
168
default_count : usize ,
169
+ /// 每多少次访问进行一次衰减
164
170
reduce_count : usize ,
165
171
166
172
/// 下一次检查的时间点,如果大于该时间点则全部检查是否过期
@@ -552,7 +558,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
552
558
if val. is_empty ( ) {
553
559
continue ;
554
560
}
555
- let key = Self :: _pop_one ( val) . unwrap ( ) ;
561
+ let key = val. pop_unusual ( ) . unwrap ( ) . 0 ;
556
562
let value = self . map . remove ( & key) . expect ( "must ok" ) ;
557
563
let node = * Box :: from_raw ( value. as_ptr ( ) ) ;
558
564
let LfuEntry { key, val, .. } = node;
@@ -587,7 +593,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
587
593
if val. is_empty ( ) {
588
594
continue ;
589
595
}
590
- let key = Self :: _pop_one ( val) . unwrap ( ) ;
596
+ let key = val. pop_unusual ( ) . unwrap ( ) . 0 ;
591
597
let value = self . map . remove ( & key) . expect ( "must ok" ) ;
592
598
let node = * Box :: from_raw ( value. as_ptr ( ) ) ;
593
599
let LfuEntry { key, val, .. } = node;
@@ -1061,7 +1067,7 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
1061
1067
if val. is_empty ( ) {
1062
1068
continue ;
1063
1069
}
1064
- let key = Self :: _pop_one ( val) . unwrap ( ) ;
1070
+ let key = val. pop_unusual ( ) . unwrap ( ) . 0 ;
1065
1071
let old_node = self . map . remove ( & key) . unwrap ( ) ;
1066
1072
let node_ptr: * mut LfuEntry < K , V > = old_node. as_ptr ( ) ;
1067
1073
@@ -1123,16 +1129,16 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
1123
1129
}
1124
1130
}
1125
1131
1126
- fn _pop_one ( keys : & mut LruCache < KeyRef < K > , ( ) , DefaultHasher > ) -> Option < KeyRef < K > > {
1127
- keys. pop_usual ( ) . map ( |( k, _) | k)
1128
- // let k = if let Some(k) = keys.iter().next() {
1129
- // KeyRef { k: k.k }
1130
- // } else {
1131
- // return None;
1132
- // };
1133
- // keys.remove(&k);
1134
- // Some(k)
1135
- }
1132
+ // fn _pop_one(keys: &mut LruCache<KeyRef<K>, (), DefaultHasher>) -> Option<KeyRef<K>> {
1133
+ // keys.pop_usual().map(|(k, _)| k)
1134
+ // // let k = if let Some(k) = keys.iter().next() {
1135
+ // // KeyRef { k: k.k }
1136
+ // // } else {
1137
+ // // return None;
1138
+ // // };
1139
+ // // keys.remove(&k);
1140
+ // // Some(k)
1141
+ // }
1136
1142
}
1137
1143
1138
1144
0 commit comments