package Ġai . plat on . pulsar . common . concurrent Ċ Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġvery Ġsimple Ġyet Ġfast ĠL RU Ġcache Ġwith ĠTTL Ġsupport Ċ Ġ*/ Ċ class ĠConcurrent LR U Cache < K , ĠV > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġfast Ġyet Ġshort Ġlife Ġleast Ġrecently Ġused Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcache : ĠLinkedHashMap < String , ĠV > ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExp ires Ġin Ġseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġttl : ĠLong ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġval Ġsize Ġget () Ġ= Ġcache . size ĊĊĠĠĠ Ġconstructor ( capacity : ĠInt ) Ġ: Ġthis ( 0 , Ġcapacity ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġleast Ġrecently Ġused Ġcache ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġttl ĠĠĠĠĠ ĠTime Ġto Ġlive Ġfor Ġitems ĊĠĠĠĠ Ġ* Ġ@ param Ġcapacity ĠThe Ġmax Ġsize Ġof Ġthe Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ttl : ĠDuration , Ġcapacity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ttl Ġ= Ġttl . seconds ĊĠĠĠĠĠĠĠ Ġcache Ġ= Ġobject Ġ: ĠLinkedHashMap < String , ĠV >( capacity , Ġ 0 . 7 5 f , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove El dest Entry ( el dest : ĠMap . Entry < String , ĠV >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize Ġ> Ġcapacity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstruct Ġa Ġleast Ġrecently Ġused Ġcache ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġttl ĠĠĠĠĠ ĠTime Ġto Ġlive Ġfor Ġitems , Ġin Ġseconds ĊĠĠĠĠ Ġ* Ġ@ param Ġcapacity ĠThe Ġmax Ġsize Ġof Ġthe Ġcache ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ttl : ĠLong , Ġcapacity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ttl Ġ= Ġttl ĊĠĠĠĠĠĠĠ Ġcache Ġ= Ġobject Ġ: ĠLinkedHashMap < String , ĠV >( capacity , Ġ 0 . 7 5 f , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove El dest Entry ( el dest : ĠMap . Entry < String , ĠV >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize Ġ> Ġcapacity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġttl Key Ġ= Ġget TTL Key ( key ) ĊĠĠĠĠĠĠĠ Ġsynchronized ( cache ) Ġ{ Ġreturn Ġcache [ ttl Key ] Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġttl Key Ġ= Ġget TTL Key ( key ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( cache ) Ġ{ Ġcache . put ( ttl Key , Ġvalue ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġttl Key Ġ= Ġget TTL Key ( key ) ĊĠĠĠĠĠĠĠ Ġsynchronized ( cache ) Ġ{ Ġreturn Ġcache . remove ( ttl Key ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute If Absent ( key : ĠK , Ġmapping Function : Ġ( K ) Ġ-> ĠV ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġttl Key Ġ= Ġget TTL Key ( key ) ĊĠĠĠĠĠĠĠ Ġsynchronized ( cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache [ ttl Key ] Ġ?: Ġmapping Function ( key ). also Ġ{ Ġcache [ ttl Key ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ= Ġsynchronized ( cache ) Ġ{ Ġcache . clear () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget TTL Key ( key : ĠK ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ttl Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġseconds Div TTL Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 Ġ/ Ġttl ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ seconds Div TTL \ t $ key " ĊĠĠĠ Ġ} Ċ } Ċ