基于Java实现本地缓存,缓存过期删除和LRU缓存淘汰
我们结合平常使用的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缓存淘汰相关推荐
- redis详解- 过期删除策略和内存淘汰策略
设置redis键过期时间 Redis提供了四个命令来设置过期时间(生存时间). ①.EXPIRE <key> <ttl> :表示将键 key 的生存时间设置为 ttl 秒. ② ...
- Redis过期删除策略和内存淘汰策略
目录 一.过期删除策略 1.如何设置过期时间? 2.如何判定 key 已过期了? 3.过期删除策略有哪些? 1.定时删除策略 2.惰性删除策略 3.定期删除策略 4.Redis 过期删除策略 5.Re ...
- 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...
- stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制
Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 本篇文章将介绍一下Redis的过期策略和内存淘汰 ...
- redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...
大家好,我是可乐,一个专注原创,乐于分享的程序猿. 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 在介绍这篇文章之前,我 ...
- 【Redis】Redis过期删除策略和内存淘汰策略剖析(Redis专栏启动)
- 简简单单做一个带过期时间的内存缓存
做手机验证码的时候,一般都有五分钟或十分钟的限时机制,所以就需要把"号码–验证码"的信息暂存起来,过期便无效--类似于 Redis 自带过期的机制就适合了.不过应用 Redis 此 ...
- Python之使用LRU缓存策略进行缓存
一.Python 缓存 ① 缓存作用 缓存是一种优化技术,可以在应用程序中使用它来将最近或经常使用的数据保存在内存中,通过这种方式来访问数据的速度比直接读取磁盘文件的高很多. 假设我们搭建了一个新闻聚 ...
- 实现 LRU 缓存机制
实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...
最新文章
- css div 边缘渐变,围绕div的CSS3渐变边框
- 总结 @ 在 C# string 中的用法
- js 监听页面url锚点变化 window.onpopstate
- C++内存管理(1)
- 大数据建设意义_大数据一体化平台打造政府智能数据库,助力智慧政务建设
- 数据库(5)SQL约束
- 吴恩达《机器学习》第十二章:支持向量机SVM
- C# winfrom gridview全部选择和全部取消
- ***利用高考传播*** 考生上网谨防中毒
- 【问题1】项目中缓存是如何使用的?为什么要用缓存?
- 对接GA/T1400协议注册流程简易demo【Java版】
- Oracle RMAN 备份与恢复
- 面向计算机视觉的深度学习 | iBooker·ApacheCN
- debezium报错处理系列七:The database history couldn‘t be recovered. Consider to increase the value for datab
- 【hdu】6441 Find Integer - 费马大定理
- 两代 Windows 性能大比拼!Win8 完胜 Win7
- 一周信创舆情观察(11.22~11.28)
- 大败局:知名企业的失败教训
- 高红冰:1个贫困县连接280个城市 电商减贫潜力巨大
- 自学量化投资之旅-计算股票的复权价
热门文章
- 计算机二级考试的进场流程,大学计算机二级考试流程是什么
- YCSB测试levedb
- android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
- Android Gson类型转换错误解决 com.google.gson.internal.LinkedTreeMap
- Github库名命名规范
- DDS设计产生线性调频信号(一)
- burp跑字典,验证码破解4/6
- DBCP连接池使用方法
- 【服务器数据恢复】硬盘坏道和不稳定扇区导致服务器崩溃的数据恢复案例
- 转:《走出软件作坊》读书笔记