我们结合平常使用的Redis来想下,自己实现本地缓存需要考虑哪些因素呢,我这里总结了三点:

  • 数据存储,基于Java实现的话我首先想到的是key-value结构的集合,如HashMap,并发环境下的话使用ConcurrentHashMap、随着访问顺序元素位置会变化的LinkedHashMap
  • 缓存过期删除策略,参考Redis的定期删除和惰性删除
  • 缓存淘汰策略,有先进先出、最少使用、最近最少使用(LRU)、随机等策略。

由以上可知,

  • 要实现缓存过期删除的话,需要记录元素的生效时间,可以实现一个监控线程或用ScheduledExecutorService实现延迟删除。
  • 缓存淘汰策略采用最近最少使用(LRU)的话,需要维护一个元素的使用队列

实现方式需要涉及的Java类有两种方式:

  • ReentrantLock+ConcurrentHashMap + ConcurrentLinkedQueue
  • ReentrantLock+ LinkedHashMap(本文以这种方式实现)

详细实现代码见下,

public class LocalCache {//默认的缓存容量private static int DEFAULT_CAPACITY = 16;//最大容量private static int MAX_CAPACITY = 64;private ReentrantLock lock = new ReentrantLock();private static Map<String, CacheData> linkedHashMap = new LinkedHashMap<String, CacheData>(DEFAULT_CAPACITY, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {//缓存淘汰return MAX_CAPACITY < linkedHashMap.size();}};private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();public void put(String key, String value, long expire) {lock.lock();try {CacheData data = new CacheData();data.setKey(key);data.setValue(value);data.setExpireTime(expire + System.currentTimeMillis());linkedHashMap.put(key, data);if (expire > 0) {removeAfterExpireTime(key, expire);}} finally {lock.unlock();}}/*** 过期删除*/public CacheData get(String key) {lock.lock();try {return linkedHashMap.getOrDefault(key, new CacheData());} finally {lock.unlock();}}private void removeAfterExpireTime(String key, long expireTime) {scheduledExecutorService.schedule(() -> {System.out.println("过期后清除该键值对");linkedHashMap.remove(key);}, expireTime, TimeUnit.MILLISECONDS);}private LocalCache () {}private static class CacheLocal {private static LocalCache cache = new LocalCache ();}public static LocalCache getInstance() {return CacheLocal.cache;}private class CacheData {private String key;private String value;/*** 存活时间*/private long expireTime;private String getValue() {return value;}private void setValue(String value) {this.value = value;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}public long getExpireTime() {return expireTime;}public void setExpireTime(long expireTime) {this.expireTime = expireTime;}}
}

基于Java实现本地缓存,缓存过期删除和LRU缓存淘汰相关推荐

  1. redis详解- 过期删除策略和内存淘汰策略

    设置redis键过期时间 Redis提供了四个命令来设置过期时间(生存时间). ①.EXPIRE <key> <ttl> :表示将键 key 的生存时间设置为 ttl 秒. ② ...

  2. Redis过期删除策略和内存淘汰策略

    目录 一.过期删除策略 1.如何设置过期时间? 2.如何判定 key 已过期了? 3.过期删除策略有哪些? 1.定时删除策略 2.惰性删除策略 3.定期删除策略 4.Redis 过期删除策略 5.Re ...

  3. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  4. stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制

    Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 本篇文章将介绍一下Redis的过期策略和内存淘汰 ...

  5. redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...

    大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前,我 ...

  6. 【Redis】Redis过期删除策略和内存淘汰策略剖析(Redis专栏启动)

  7. 简简单单做一个带过期时间的内存缓存

    做手机验证码的时候,一般都有五分钟或十分钟的限时机制,所以就需要把"号码–验证码"的信息暂存起来,过期便无效--类似于 Redis 自带过期的机制就适合了.不过应用 Redis 此 ...

  8. Python之使用LRU缓存策略进行缓存

    一.Python 缓存 ① 缓存作用 缓存是一种优化技术,可以在应用程序中使用它来将最近或经常使用的数据保存在内存中,通过这种方式来访问数据的速度比直接读取磁盘文件的高很多. 假设我们搭建了一个新闻聚 ...

  9. 实现 LRU 缓存机制

    实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...

最新文章

  1. css div 边缘渐变,围绕div的CSS3渐变边框
  2. 总结 @ 在 C# string 中的用法
  3. js 监听页面url锚点变化 window.onpopstate
  4. C++内存管理(1)
  5. 大数据建设意义_大数据一体化平台打造政府智能数据库,助力智慧政务建设
  6. 数据库(5)SQL约束
  7. 吴恩达《机器学习》第十二章:支持向量机SVM
  8. C# winfrom gridview全部选择和全部取消
  9. ***利用高考传播*** 考生上网谨防中毒
  10. 【问题1】项目中缓存是如何使用的?为什么要用缓存?
  11. 对接GA/T1400协议注册流程简易demo【Java版】
  12. Oracle RMAN 备份与恢复
  13. 面向计算机视觉的深度学习 | iBooker·ApacheCN
  14. debezium报错处理系列七:The database history couldn‘t be recovered. Consider to increase the value for datab
  15. 【hdu】6441 Find Integer - 费马大定理
  16. 两代 Windows 性能大比拼!Win8 完胜 Win7
  17. 一周信创舆情观察(11.22~11.28)
  18. 大败局:知名企业的失败教训
  19. 高红冰:1个贫困县连接280个城市 电商减贫潜力巨大
  20. 自学量化投资之旅-计算股票的复权价

热门文章

  1. 计算机二级考试的进场流程,大学计算机二级考试流程是什么
  2. YCSB测试levedb
  3. android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
  4. Android Gson类型转换错误解决 com.google.gson.internal.LinkedTreeMap
  5. Github库名命名规范
  6. DDS设计产生线性调频信号(一)
  7. burp跑字典,验证码破解4/6
  8. DBCP连接池使用方法
  9. 【服务器数据恢复】硬盘坏道和不稳定扇区导致服务器崩溃的数据恢复案例
  10. 转:《走出软件作坊》读书笔记