热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HashMap作为缓存时的性能优化及与redis,EhCache等的应用比较

系统中在用hashmap作为缓存,所以不得不考虑一些因素:多线程并发,最大容量,性能,以及与redis,EhCache等的优劣比较1、容量的问题:源码中,HashMap的最大容量为1<<3

系统中在用hashmap作为缓存,所以不得不考虑一些因素:多线程并发,最大容量,性能,以及与redis,EhCache等的优劣比较

1、容量的问题:

源码中,HashMap的最大容量为1<<30。HashMap的初始默认容量是16,默认负载因子0.75,也就是说,随着数据的不断插入,当数据量不断增大,超过现有容量*负载因子的时候,就是进行容量扩充,即resize操作,而这个操作需要将原来数组的数据逐个全部重新放入到新生成的大容量的数组里面去,这样的代价就会比较高,尤其是hashmap容量在不断迅速增长的情况下。因此,类似我们现在这个系统中,hashmap中需要缓存的数据量基本上是比较稳定的(在可预见的未来不会出现暴增的情况,因此只要在一定范围内,也不会造成内存的急剧膨胀),这种情况下可以考虑在生成hashmap的时候就直接指定一个容量以及负载因子;而且在我们的系统中,hashmap缓存的其实就是一张数据表的数据,这样这个指定的容量其实就可以根据数据表现在的长度来获得。

2、多线程并发的问题

HashMap本身不是线程安全的,因此不能用于多线程并发,因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,但是java中提供了一个ConcurrentHashMap,这个map是线程安全的,通过对get操作不加锁,对put操作分块加锁的方式来保证线程安全的同时还能有较高的读写性能,详细的介绍可以参考:http://goldendoc.iteye.com/blog/1103980,http://www.infoq.com/cn/articles/ConcurrentHashMap

3、操作性能没有进行测试,稍后再来测试这个,暂时可以参考http://blog.csdn.net/java2000_net/article/details/3373181,http://blog.csdn.net/liuzhengkang/article/details/2916829,但是后者看评论好像是有争议的。


在我们的系统中,需要缓存的内容就是一些设备的实时信息,因此总的数量并不会太大,而且不会有数量上的急剧变动,因此用java原生的concurrenthashmap在容量上应该是没有问题的,多线程操作也没有问题;用redis的话还需要建立到redis的连接,然后提交查询请求,等待返回结果,这样会耗费相当多的时间;还有一点,因为实时信息并不需要考虑淘汰旧数据的问题,也就用不到Ehcache及redis等的LRU算法等内容,因此结合本项目实际可以直接采用原生的map而不用专门的缓存服务,当然,如果其他系统中数据量非常大或者存在其他因素的情况下,就得根据实际情况来选择实现方案了。


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • Java之HashMap在多线程情况下导致死循环的问题
    PS:不得不说Java编程思想这本书是真心强大..学习内容:1.HashMap<K,V>在多线程的情况下出现的死循环现象当初学Java的时候只是知道HashMap< ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • 手写HashMap,快手面试官直呼内行
    手写HashMap,快手面试官直呼内行-手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
author-avatar
点提土八撇又254
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有