对于缓存的作用不言而喻,可以提高查询效率,比去DB查询的速度要快。项目中我们经常会使用Nosql数据库,如Redis等做缓存。但是对于数据量很小的,访问非常频繁的,我们也可以存在本地缓存中。我将利用concurrentHashMap等集合容器实现一个本地缓存。

1.基于concurrentHashMap的本地缓存。

本地缓存一般使用键值对方式的存储,那么在Java中肯定是选用map,由于concurrentHashMap的线程安全性,所以就选择了这个。过期策略采用的定时清除,实现方式可以后台起一个线程去扫,也可以用定时器,本例子使用的是定时器。

/***     基于concurrentHash的本地缓存工具类*     缓存删除基于timer定时器*/
public class CacheUtil {//默认大小private static final int DEFAULT_CAPACITY = 1024;// 最大缓存大小private static final int MAX_CAPACITY = 10000;//默认缓存过期时间private static final long DEFAULT_TIMEOUT = 3600;//1000毫秒private static final long SECOND_TIME = 1000;//存储缓存的Mapprivate static final ConcurrentHashMap<String, Object> map;private static final Timer timer;static {map = new ConcurrentHashMap<>(DEFAULT_CAPACITY);timer = new Timer();}//私有化构造方法private CacheUtil() {}/***     缓存任务清除类*/static class ClearTask extends TimerTask {private String key;public ClearTask(String key) {this.key = key;}@Overridepublic void run() {CacheUtil.remove(key);}}//==================缓存的增删改查/***     添加缓存*/public static boolean put(String key, Object object) {if (checkCapacity()) {map.put(key, object);//默认缓存时间timer.schedule(new ClearTask(key), DEFAULT_TIMEOUT);return true;}return false;}/***     添加缓存*/public static boolean put(String key, Object object, int time_out) {if (checkCapacity()) {map.put(key, object);//默认缓存时间timer.schedule(new ClearTask(key), time_out * SECOND_TIME);}return false;}/***     判断容量大小*/public static boolean checkCapacity() {return map.size() < MAX_CAPACITY;}/***     批量增加缓存*/public static boolean put(Map<String, Object> m, int time_out) {if (map.size() + m.size() <= MAX_CAPACITY) {map.putAll(map);for (String key : m.keySet()) {timer.schedule(new ClearTask(key), time_out * SECOND_TIME);}return true;}return false;}/***     删除缓存*/public static void remove(String key) {map.remove(key);}/***     清除所有缓存*/public void clearAll() {if (map.size() > 0) {map.clear();}timer.cancel();}/***     获取缓存*/public static Object get(String key) {return map.get(key);}/***     是否包含某个缓存*/public static boolean isContain(String key) {return map.contains(key);}
}

每日一道Java面试题

点击关注支持一下:Java有话说

Java实现本地缓存相关推荐

  1. Java高性能本地缓存框架Caffeine

    文章目录 Java高性能本地缓存框架Caffeine 如何使用 缓存加载 手动加载 自动加载 手动异步加载 自动异步加载 过期策略 基于大小 基于时间 基于引用 Caffeine.weakKeys() ...

  2. 基于Java实现本地缓存,缓存过期删除和LRU缓存淘汰

    我们结合平常使用的Redis来想下,自己实现本地缓存需要考虑哪些因素呢,我这里总结了三点: 数据存储,基于Java实现的话我首先想到的是key-value结构的集合,如HashMap,并发环境下的话使 ...

  3. java本地缓存 google guava

    本地缓存产生背景: 本地缓存是指在我们本地的物理空间开辟出一片物理空间,专门用来存储我们需要向服务器端频繁需要的数据, 比如前端页面需要频繁的向后台访问某些数据,这时候我们每次都去数据库查找数据再返回 ...

  4. 实现 Java 本地缓存

    缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache.对于这些工具,我想大家肯定都非常熟悉,所以今天 ...

  5. Caffeine Cache~高性能 Java 本地缓存之王

    前面刚说到Guava Cache,他的优点是封装了get,put操作:提供线程安全的缓存操作:提供过期策略:提供回收策略:缓存监控.当缓存的数据超过最大值时,使用LRU算法替换.这一篇我们将要谈到一个 ...

  6. Java技术分享:如何设计一个本地缓存?

    前言 最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存:一级缓存相对来说比较简单,功能比较齐全的是二级缓存,基本上满足了一个缓存该有的功能:当然如果拿来和专门的 ...

  7. java 最少使用(lru)置换算法_一篇文章学会如何基于LRU-K算法设计本地缓存实现流量削峰...

    专注于Java领域优质技术号,欢迎关注 作者:一个Java菜鸟 1.背景介绍 1.1.现象 QPS突然增长2倍以上(45w~60w每分钟) 将产生下面一些问题: 1)响应接口响应时长增加了5倍(qps ...

  8. java几点钟_实现 Java 本地缓存,该从这几点开始

    缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache. 对于这些工具,我想大家肯定都非常熟悉,所以今 ...

  9. Java 8 Friday Goodies:轻松派本地缓存

    在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们已经写了一些关于Java ...

  10. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

最新文章

  1. 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)
  2. 鸿蒙系统第五批公测,鸿蒙系统即将迎来二轮公测,nova机型增添其中
  3. 在CentOS7上配置Open vSwitch和VXLAN
  4. 区块链培训资料(特别是以太坊)
  5. 机器学习相关——SVD分解
  6. react前端显示图片_在react里怎么引用图片
  7. HDU 4812 D Tree
  8. python调用dll时路径问题_使用ctypes(python)在带括号的路径中加载dll时出错
  9. 芬朗DSP电脑调音软件
  10. PCWorld:IT界14对经典“生死冤家”
  11. 嵌入式开发笔记——调试组件SEGGER_HardFaultHandle
  12. 天正多条线段长度lisp下载_AutoCAD求多条线的长度
  13. python 多线程 假的_天啦噜!Python多线程居然是骗人的
  14. 美国Java程序员收入和疫情期间面试心得体会
  15. ZZULIOJ:1016: 银行利率
  16. APP开发流程实例讲解-儒释道网络电台八天开发全程-百度云深度兼容测试并进一步优化排错
  17. [ROS](06)ROS通信 —— 话题(Topic)通信
  18. 视频怎么制作虚化边框背景的效果?
  19. 马克思主义理论-资本主义的发展及趋势
  20. java——Scanner中nextLine()方法和next()方法的区别

热门文章

  1. 【ENVI | Landsat 8】预处理—辐射校正定标
  2. qq微信淘宝京东自动转链转发机器人MkStone京东淘宝转链助手
  3. matlab 倒位序fft程序,FFT算法设计与实现
  4. tomcat启动startup出现闪退问题
  5. .net反编译工具Reflector下载(转)
  6. CSS安全字体的写法
  7. 移动通信原理学习笔记之二—— 移动通信中的调制解调技术
  8. RS232,RS485 标准DB9接口(串口通信线标准接口)
  9. Android系统终端命令大全
  10. 浙江工业大学计算机学院的博士招生,浙江工业大学计算机科学与技术学院、软件学院...