java进程会不会使用缓存,Java进程内缓存

今天和同事聊到了缓存,在Java中实现进程缓存。这里主要思想是,用一个map做缓存。缓存有个生存时间,过期就删除缓存。这里可以考虑两种删除策略,一种是起一个线程,定期删除过期的key。第二个是,剔除模式,比较懒,访问到某个key的时候才,才去检查这个key是否过期,过期删除。

首先,对要缓存的value做了层封装,带了个时间戳

/**

* Created by gxf on 2017/6/28.

*/

public class ValueWithTimeStamp{

private long expireTime;

private V value;

public ValueWithTimeStamp(long expireTime, V value) {

this.expireTime = expireTime;

this.value = value;

}

public long getExpireTime() {

return expireTime;

}

public void setExpireTime(long expireTime) {

this.expireTime = expireTime;

}

public V getValue() {

return value;

}

public void setValue(V value) {

this.value = value;

}

}

ok,起线程定期删除策略的模式

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* Created by gxf on 2017/6/28.

* 使用线程,定期删除过期的key

*/

public class CacheMap {

//这里使用ConcurrentHashMap避免,clean的时候,主线程修改chache,造成异常,

//使用ConcurrentHashMap可以控制并发修改cache

private Map> cache = new ConcurrentHashMap>();

private static boolean cleanTaskIsRunning = false;

//ttl 过期时间 单位:秒

public void put(K key, V value, int ttl){

long expireTime = System.currentTimeMillis() + ttl * 1000;

ValueWithTimeStamp valueWithTimeStamp = new ValueWithTimeStamp<>(expireTime, value);

cache.put(key, valueWithTimeStamp);

if(!cleanTaskIsRunning){

startCleanTask();

cleanTaskIsRunning = !cleanTaskIsRunning;

}

}

public V get(K key){

ValueWithTimeStamp valueWithTimeStamp = cache.get(key);

return null == valueWithTimeStamp ? null : valueWithTimeStamp.getValue();

}

/**

* 启动清理线程

* */

private void startCleanTask(){

Thread cleanThread = new Thread(new CleanTask());

cleanThread.start();

}

/**

* 清理过期的key

* */

class CleanTask implements Runnable{

public void run(){

while(true){

long currentTime = System.currentTimeMillis();

//遍历map

for(Map.Entry> entry : cache.entrySet()){

ValueWithTimeStamp valueWithTimeStamp = entry.getValue();

long expireTime = valueWithTimeStamp.getExpireTime();

//过期时间到了

if(currentTime > expireTime){

System.out.println("key : " + entry.getKey() + " expired ");

cache.remove(entry.getKey());

} //if

} //for

//每隔1s扫描map对象

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

} //while

}

}

}

注意,这里需要使用ConcurrentHashMap做缓存。不然会出现多线线程操作map对象的异常

第二种策略,剔除模式

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* Created by 58 on 2017/6/28.

* 这里使用懒惰模式,获取key的时候,才剔除过期的key

*/

public class CacheMap1 {

private Map> cache = new ConcurrentHashMap>();

public void put(K key, V value, int ttl){

long expireTime = System.currentTimeMillis() + ttl * 1000;

ValueWithTimeStamp valueWithTimeStamp = new ValueWithTimeStamp(expireTime, value);

cache.put(key, valueWithTimeStamp);

}

public V get(K key){

ValueWithTimeStamp valueWithTimeStamp = cache.get(key);

long expireTime = valueWithTimeStamp.getExpireTime();

long currentTime = System.currentTimeMillis();

//key已经过期,删除,返回null

if(currentTime > expireTime){

System.out.println("key :" + key + " is expired.");

cache.remove(key);

return null;

}

return cache.get(key).getValue();

}

}

项目中用到了redis,用这种方式应该会更快,这两天优化一下代码

Java的进程内缓存框架&colon;EhCache &lpar;转&rpar;

EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种缓存 ...

Java的进程内缓存框架&colon;EhCache

EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.   Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种 ...

一文深入了解史上最强的Java堆内缓存框架Caffeine

它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

Spring Boot 2&period;x基础教程:进程内缓存的使用与Cache注解详解

随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5

A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

java应用本地缓存

在java应用中,对于访问频率比较高,又不怎么变化的数据,常用的解决方案是把这些数据加入缓存.相比DB,缓存的读取效率快好不少.java应用缓存一般分两种,一是进程内缓存,就是使用ja ...

java问题排查工具之一板斧jstack——使用 jstack 定位 java进程CPU过高的问题

jstack主要用来查看某个Java进程内的线程堆栈信息.语法格式如下: jstack [option] pid jstack [option] executable core jstack [opt ...

JVM探秘:VisualVM监控远程Java进程

VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM,在后续版本中可能会从JDK移除. VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java ...

随机推荐

返回人民币大写方式(num2rmb)

CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS -- PURPOSE :返回人民币大写方式 v_N ...

Python 代码覆盖率统计工具 coverage&period;py

coverage.py是一个用来统计python程序代码覆盖率的工具.它使用起来非常简单,并且支持最终生成界面友好的html报告.在最新版本中,还提供了分支覆盖的功能. 官方网站: http://ne ...

新接触PHP课程,给自己定制的目标

PHP课程初接触,对自己的计划和展望恢复 从今天开始了为期四个半月的关于PHP课程的学习.从零开始接触一门新的技术知识,而且还是在短短四个月内就要掌握牢固,其实确确实实感觉不易.可是世间再没有路,不还 ...

CSS 透明度 设置 兼容IE FF

filter:Alpha(Opacity=80);/*IE*/ -moz-opacity:0.8;/*FF*/ opacity: 0.8;/*所有元素*/ 参数设置说明: Alpha(Opacity= ...

tp框架总结(二)

一.函数库和类库 项目中的常用的函数库要封装到项目Common/function.php中  在项目中可以直接调用  [ 函数();] import方法是ThinkPHP内建的类库导入方法,提供了方便 ...

关于c&num;动态加载程序集的一些注意事项

Assembly下有LoadFile,LoadFrom等方法可以加载程序集. LoadFile只加载你给定路径的那个dll,LoadFrom会自动加载依赖的dll. 如:A依赖B,LoadFile(& ...

C&num;将汉字转换成全拼的拼音EcanConvertToCh帮助类 (转)

点击下载 EcanConvertToCh.rar 主要功能就是将汉字转换成全拼的拼音,只要你输入一个汉字就会相应的转成拼音 /// /// 编 码 人:苏飞 /// 联 ...

SASS安装的那些事

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

Xcode5 创建模板和UIView 关联XIB

转自:http://www.cnblogs.com/china-ldw/p/3533896.html 在做ios应用开发的过程,难免遇到要创建 子view 和 自定义view的时候,归根到底,我们需要 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值