缓存模块设计浅谈

时间:2022-07-12 02:08:55

缓存模块设计浅谈

摘 要:随着社会和计算机水平的不断的发展,人们在日常生活和工作中处理的数据越来越多,这给数据库服务器带来很大的负担,并且大量的数据传送造成网络传输瓶颈。大量的用户都需要通过数据库来查询符合自己需求的数据,而且很多的用户查询的是相同的数据。开始人们用提升服务器的配置来解决工作负担大的问题,但这是换汤不换药的做法,没有从根本上解决这个问题。可采用缓存减轻服务器的负担,把以前查询过的结果存放在客户端,再有相同的查询时不用去请求服务器返回结果,而是由客户端直接返回结果给用户。这篇论文主要讨论缓存模块中数据库返回的查询结果如何存取。

关键词:Cache;OSCache;缓存;客户端;数据库服务器

文件存取模块的设计

下面我们以Map接口为例来说明设计下文件存取模块使用各种实现类时,总是要生成数据结构的具体实现,因为系统不知道集合中如何存放对象。但在访问实际集合时,用使用接口的方法,这样就可以在需要时将数据结构从数组集合变成散列表的集合然后由于集合类仍然实现相同的集合接口,不需要改变他的代码。

用何种方式存放对象呢?这是缓存最为重要的一步,在Java 2中有很多的数据结构接口,接口和集合类的选择是缓存非常重要的。

Map接口用于保持关键字(Key)和数值(Value)的集合,集合中的每个项目加入时都提供数值和关键字

Map接口有三个实现集合类;HashMap、WeakHashMap、和TreeMap 类。HashMap是基于Hash表的映射;WeakHashMap是基于弱引用Hash表的映射;TreeHash是基于平衡树的映射。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许 还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

HashMap可谓JDK的一大实用工具,把各个Object映射起来,实现了“键--值”对应的快速存取。但实际里面做了些什么呢?

在这之前,先介绍一下负载因子和容量的属性。大家都知道其实一个HashMap 的实际容量就因子*容量,其默认值是 16×0.75=12;这个很重要,对效率很一定影响!当存入HashMap的对象超过这个容量时,HashMap 就会重新构造存取表。两个关键的方法,put和get:

先有这样一个概念,HashMap是声明了Map,Cloneable, Serializable接口,和继承了AbstractMap类,里面的 Iterator其实主要都是其内部类HashIterator和其他几个 iterator类实现,当然还有一个很重要的继承了Map.Entry的 Entry内部类,它包含了hash,value,key和next这四个属性,很重要。

这个就是判断键值是否为空,并不很深奥,其实如果为空,它会返回一个static Object作为键值,这就是为什么HashMap允许空键值的原因。

我们把关键的方法拿出来分析:

因为hash的算法有可能令不同的键值有相同的hash码并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它经过indexfor之后的索引一定都为i,这样在new的时候这个Entry的next就会指向这个原本的table[i],再有下一个也如此,形成一个链表,和put的循环对定e.next获得旧的值。到这里,HashMap的结构,大家也十分明白了吧?

所谓的重构也不万能的,就是建一个两倍大的table,然后再一个个indexfor进去,如果你能让你的HashMap不需要重构那么多次,效率会大大提高!

[参考文献]

[1]飞思科技产品研发中心.《Java 2应用开发指南》.电子工业出版社.

[2]王亚平.《数据库系统工程师教程》.清华大学出版社.

[3]肖军模.《程序设计语言编译方法》.大连理工大学出版社.

上一篇:淄博市广场舞开展现状调查分析 下一篇:数据业务传输分析及优化技术探讨