javamap缓存
/**
*缓存池
*@authorxiaoquan
*@create2015年3月13日上午10:32:13
*@see
*/
publicclassCachePool{
;//缓存池唯一实例
privatestaticMap<String,Object>cacheItems;//缓存Map
privateCachePool(){
cacheItems=newHashMap<String,Object>();
}
/**
*得到唯一实例
*@return
*/
(){
if(instance==null){
instance=newCachePool();
}
returninstance;
}
/**
*清除所有Item缓存
*/
(){
cacheItems.clear();
}
/**
*获取缓存实体
*@paramname
*@return
*/
(Stringname){
if(!cacheItems.containsKey(name)){
returnnull;
}
CacheItemcacheItem=(CacheItem)cacheItems.get(name);
if(cacheItem.isExpired()){
returnnull;
}
returncacheItem.getEntity();
}
/**
*存放缓存信息
*@paramname
*@paramobj
*@paramexpires
*/
(Stringname,Objectobj,longexpires){
if(!cacheItems.containsKey(name)){
cacheItems.put(name,newCacheItem(obj,expires));
}
CacheItemcacheItem=(CacheItem)cacheItems.get(name);
cacheItem.setCreateTime(newDate());
cacheItem.setEntity(obj);
cacheItem.setExpireTime(expires);
}
(Stringname,Objectobj){
putCacheItem(name,obj,-1);
}
/**
*移除缓存数据
*@paramname
*/
(Stringname){
if(!cacheItems.containsKey(name)){
return;
}
cacheItems.remove(name);
}
/**
*获取缓存数据的数量
*@return
*/
publicintgetSize(){
returncacheItems.size();
}
}
publicclassCacheItem{
privateDatecreateTime=newDate();//创建缓存的时间
privatelongexpireTime=1;//缓存期满的时间
privateObjectentity;//缓存的实体
publicCacheItem(Objectobj,longexpires){
this.entity=obj;
this.expireTime=expires;
}
publicbooleanisExpired(){
return(expireTime!=-1&&newDate().getTime()-createTime.getTime()>expireTime);
}
/**
*省略getter、setter方法
*/
}
2. 使用java实现以个简单的缓存机制
你这个分数太少了吧,程序到是有,不过给你有点可惜
CacheMgr.java
import java.util.*;
import cn.javass.framework.cache.vo.CacheConfModel;
public class CacheMgr {
private static Map cacheMap = new HashMap();
private static Map cacheConfMap = new HashMap();
private CacheMgr(){
}
private static CacheMgr cm = null;
public static CacheMgr getInstance(){
if(cm==null){
cm = new CacheMgr();
Thread t = new ClearCache();
t.start();
}
return cm;
}
/**
* 增加缓存
* @param key
* @param value
* @param ccm 缓存对象
* @return
*/
public boolean addCache(Object key,Object value,CacheConfModel ccm){
boolean flag = false;
cacheMap.put(key, value);
cacheConfMap.put(key, ccm);
System.out.println("now addcache=="+cacheMap.size());
return true;
}
/**
* 删除缓存
* @param key
* @return
*/
public boolean removeCache(Object key){
cacheMap.remove(key);
cacheConfMap.remove(key);
System.out.println("now removeCache=="+cacheMap.size());
return true;
}
/**
* 清除缓存的类
* @author wanglj
* 继承Thread线程类
*/
private static class ClearCache extends Thread{
public void run(){
while(true){
Set tempSet = new HashSet();
Set set = cacheConfMap.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
Object key = it.next();
CacheConfModel ccm = (CacheConfModel)cacheConfMap.get(key);
//比较是否需要清除
if(!ccm.isForever()){
if((new Date().getTime()-ccm.getBeginTime())>= ccm.getDurableTime()*60*1000){
//可以清除,先记录下来
tempSet.add(key);
}
}
}
//真正清除
Iterator tempIt = tempSet.iterator();
while(tempIt.hasNext()){
Object key = tempIt.next();
cacheMap.remove(key);
cacheConfMap.remove(key);
}
System.out.println("now thread================>"+cacheMap.size());
//休息
try {
Thread.sleep(60*1000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
CacheConfModel.java
public class CacheConfModel implements java.io.Serializable{
private long beginTime;
private boolean isForever = false;
private int rableTime;
public long getBeginTime() {
return beginTime;
}
public void setBeginTime(long beginTime) {
this.beginTime = beginTime;
}
public boolean isForever() {
return isForever;
}
public void setForever(boolean isForever) {
this.isForever = isForever;
}
public int getDurableTime() {
return rableTime;
}
public void setDurableTime(int rableTime) {
this.rableTime = rableTime;
}
}
顺便说一句,缓存的管理不是靠时间久来计算的,是靠最大不活动间隔计算的,你的设计思想有问题
3. java中怎么样将方法中的map内数据保存以便在下次调用时继续使用
你可以把这个map定义为类成员,如果是通过静态方法向map里面加东西,那就定义为静态成员。总之,定义为方法内的局部变量是肯定不行的,因为它的作用域是方法内,执行一次方法后,这个map变量的生命周期就到了,下次再调用的时候,是产生一个新的map。(java不像c,c++,没有局部静态变量)
4. java map可以放多少数据
map由key value键值对组成,具体放多少数据和你的服务器运行时的内存有关系,同时也和你代码中及时清理无效缓存有关系。
一般编写代码中不会去考虑放多少数据问题,除非你数据量超级大对内存要求比较高。这个时候需要对代码和服务器进行优化
5. 请教java中怎么缓存大量的数据,比如100w条记录
通常Java的缓存都是用HashMap,数据大的话,占用内存就大,所以JVM虚拟机在启动的时候要把内存设置大点,否则会内存溢出。
Java学习交流!
6. java下载图片出错使用map集合缓存地址怎么写
理论上,jvm会定期帮你回收垃圾,释放内存。 如果短时间大量调用该方法,建议用System.gc(),强制回收,jvm会较快响应(非及时)。
另外, refreshData 需要谨慎,不用的对象尽量赋值null,方便回收
7. 为什么Java的Hashmap比Python的dictionary慢得多
如果按照题主给出的Java和Python代码,在常见环境里按照默认配置来跑测试,确实会发现Python版例子比Java版例子跑得快。这自然也算是Java性能的一个坑啦——从来就没有什么“理论上Java应该比Python快”的理论,而是在知道常见性能坑、知道best practice的前提下,纯Java程序在较大规模的运算上有可能比纯Python程序有更好的性能,并且相对来说更scalable。
话说回来,这个例子要让Java比Python跑得快无需修改代码,只要稍微修改一下Java的启动参数即可。另外我也相信这个小例子不一定充分反映了题主说的“需要3个小时以上”的那个Java程序的性能问题。那个程序或许也只需要稍微调整一下启动参数就可以大幅提高性能,也可能要修改代码去掉一些不好的做法。
所以具体到题主这个例子,是什么造成Java比Python慢得多?是HashMap写得没dict好?是因为HashMap用Java实现而dict用C实现?是因为JIT的预热开销?还是别的?
假定题主运行Java和Python的环境都是常见的,例如说Oracle JDK vs 原装CPython,那么在Java一侧讨论的对象就是Oracle JDK里的HotSpot VM的性能。
答案是:是因为题主没有设置好GC的参数,而HotSpot VM默认的GC参数在这个例子上非常不适用,导致默认参数下Java版的性能非常糟糕。Java的HashMap自身并不慢,特别是经过JIT编译后它其实不会比CPython的dict慢,至少不是造成这个例子的性能差异的原因。
8. java static map 静态的集合类型变量(大数据)多次重复赋值对内存占用会产生什么样的影响
这种做法是个不好做法。
可以:1 实用缓存组件 如OSCache 之类
2 如果不用缓存组件 ,可以使用软引用,来使JVM能正常释放内存。
9. java jdis 可以缓存map 吗
缓存是Java中主要的内容,主要目的是缓解项目访问数据库的压力以及提升访问数据的效率,以下是通过Map实现java缓存的功能,并没有用cache相关框架。
一、缓存管理类 CacheMgr.java
[java] view plain
package cache.com;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* 缓存管理类
* @author Administrator
*
*/
public class CacheMgr {
private static Map cacheMap = new HashMap();
private static Map cacheConfMap = new HashMap();
private static CacheMgr cm = null;
//构造方法
private CacheMgr(){
}
public static CacheMgr getInstance(){
if(cm==null){
cm = new CacheMgr();
Thread t = new ClearCache();
t.start();
}
return cm;
}
/**
* 增加缓存
* @param key
* @param value
* @param ccm 缓存对象
* @return
*/
public boolean addCache(Object key,Object value,CacheConfModel ccm){
System.out.println("开始增加缓存-------------");
boolean flag = false;
try {
cacheMap.put(key, value);
cacheConfMap.put(key, ccm);
System.out.println("增加缓存结束-------------");
System.out.println("now addcache=="+cacheMap.size());
flag=true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 获取缓存实体
*/
public Object getValue(String key){
Object ob=cacheMap.get(key);
if(ob!=null){
return ob;
}else{
return null;
}
}
/**
* 获取缓存数据的数量
* @return
*/
public int getSize(){
return cacheMap.size();
}
/**
* 删除缓存
* @param key
* @return
*/
public boolean removeCache(Object key){
boolean flag=false;
try {
cacheMap.remove(key);
cacheConfMap.remove(key);
flag=true;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 清除缓存的类
* 继承Thread线程类
*/
private static class ClearCache extends Thread{
public void run(){
while(true){
Set tempSet = new HashSet();
Set set = cacheConfMap.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
Object key = it.next();
CacheConfModel ccm = (CacheConfModel)cacheConfMap.get(key);
//比较是否需要清除
if(!ccm.isForever()){
if((new Date().getTime()-ccm.getBeginTime())>= ccm.getDurableTime()*60*1000){
//可以清除,先记录下来
tempSet.add(key);
}
}
}
//真正清除
Iterator tempIt = tempSet.iterator();
while(tempIt.hasNext()){
Object key = tempIt.next();
cacheMap.remove(key);
cacheConfMap.remove(key);
}
System.out.println("now thread================>"+cacheMap.size());
//休息
try {
Thread.sleep(60*1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
二、缓存属性类 CacheConfModel.java
[java] view plain
package cache.com;
/**
* 缓存属性类
* @author Administrator
*
*/
public class CacheConfModel implements java.io.Serializable{
private long beginTime;//缓存开始时间
private boolean isForever = false;//是否持久
private int rableTime;//持续时间
public long getBeginTime() {
return beginTime;
}
public void setBeginTime(long beginTime) {
this.beginTime = beginTime;
}
public boolean isForever() {
return isForever;
}
public void setForever(boolean isForever) {
this.isForever = isForever;
}
public int getDurableTime() {
return rableTime;
}
public void setDurableTime(int rableTime) {
this.rableTime = rableTime;
}
}
10. java语言如何设置Map中一个键值对的生命周期
通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的。下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题。
0、将Map转换为List类型
在java中Map接口提供了三种集合获取方式:Key set,,value set, and key-value set.。它们都可以通过构造方法或者addAll()方法来转换为List类型。下面代码就说明了如何从Map中构造ArrayList:
// key list
List keyList = new ArrayList(map.keySet());
// value list
List valueList = new ArrayList(map.valueSet());
// key-value list
List entryList = new ArrayList(map.entrySet());
1、通过Entry 遍历Map
java中这种以键值对存在的方式被称为Map.Entry。Map.entrySet()返回的是一个key-value 集合,这是一种非常高效的遍历方式。
for(Entry entry: map.entrySet()) {
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
Iterator 我们也经常用到,尤其是在JDK1.5以前
Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
Entry entry = itr.next();
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
2、通过Key来对Map排序
排序需要对Map的ke进行频繁的操作,一种方式就是通过比较器(comparator )来实现:
List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
另外一种方法就是通过SortedMap,但必须要实现Comparable接口。
SortedMap sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(K k1, K k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(map);
3、对value对Map进行排序
这与上一点有些类似,代码如下:
List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
4、初始化一个static 的常量Map
当你希望创建一个全局静态Map的时候,我们有以下两种方式,而且是线程安全的。
而在Test1中,我们虽然声明了map是静态的,但是在初始化时,我们依然可以改变它的值,就像Test1.map.put(3,”three”);
在Test2中,我们通过一个内部类,将其设置为不可修改,那么当我们运行Test2.map.put(3,”three”)的时候,它就会抛出一个UnsupportedOperationException 异常来禁止你修改。
public class Test1 {
private static final Map map;
static {
map = new HashMap();
map.put(1, “one”);
map.put(2, “two”);
}
}
public class Test2 {
private static final Map map;
static {
Map aMap = new HashMap();
aMap.put(1, “one”);
aMap.put(2, “two”);
map = Collections.unmodifiableMap(aMap);
}
}
5、HashMap, TreeMap, and Hashtable之间的不同
在Map接口中,共有三种实现:HashMap,TreeMap,Hashtable。
它们之间各有不同,详细内容请参考《 HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap》一文。
6、Map中的反向查询
我们在Map添加一个键值对后,意味着这在Map中键和值是一一对应的,一个键就是对应一个值。但是有时候我们需要反向查询,比如通过某一个值来查找它的键,这种数据结构被称为bidirectional map,遗憾的是JDK并没有对其支持。
Apache和Guava 共同提供了这种bidirectional map实现,它在实现中它规定了键和值都是必须是1:1的关系。
7、对Map的复制
java中提供了很多方法都可以实现对一个Map的复制,但是那些方法不见得会时时同步。简单说,就是一个Map发生的变化,而复制的那个依然保持原样。下面是一个比较高效的实现方法:
Map copiedMap = Collections.synchronizedMap(map);
当然还有另外一个方法,那就是克隆。但是我们的java鼻祖Josh
Bloch却不推荐这种方式,他曾经在一次访谈中说过关于Map克隆的问题:在很多类中都提供了克隆的方法,因为人们确实需要。但是克隆非常有局限性,而
且在很多时候造成了不必要的影响。(原文《Copy constructor versus cloning》)
8、创建一个空的Map
如果这个map被置为不可用,可以通过以下实现
map = Collections.emptyMap();
相反,我们会用到的时候,就可以直接
map = new HashMap();