`
Everyday都不同
  • 浏览: 726529 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

使用oscahe缓存技术减少与数据库的频繁交互

阅读更多

此前一直不知道缓存的具体实现,只知道是把数据存储在内存中,以便下次直接从内存中读取。对于缓存的使用也没有概念,觉得缓存技术是一个比较”神秘陌生“的领域。但最近要用到缓存技术,发现还是很有必要一探究竟的。

 

缓存技术使用背景:一般来说,对于web项目,如果我们要什么数据直接jdbc查库好了,但是在遇到高并发的情形下,不可能每一次都是去查数据库,因为这样在高并发的情形下显得不太合理——频繁地与数据库交互不是件好事儿,除了在并发情况不是很多的情况下或者没有并发的情况下。我们可以找到一个解决方案:那就是第一次去查库,把查询到的数据缓存到内存中(用key来指定该数据),下次再到这一步时,判断查询条件是不是一样,一样的话,直接从内存中取;不一样则去查库,并把结果缓存起来以便下次使用……

这样做的好处,就是减少了与数据库的交互。。

 

开始使用oscahe缓存技术来探讨吧。这里我用到了oscache.jar包,反编译该jar,找到一个缓存管理的核心类GeneralCacheAdministrator.java,这个类负责创建、销毁、操作缓存Cache对象。这个类extends了一个基类AbstractCacheAdministrator,这个基类有以下一些基本属性:

 

// 缓存的内存
public static final String CACHE_MEMORY_KEY = "cache.memory";
//  缓存容量(可以容纳的key-value对数)
public static final String CACHE_CAPACITY_KEY = "cache.capacity";
//缓存的算法
  public static final String CACHE_ALGORITHM_KEY = "cache.algorithm";

 

 

看到GeneralCacheAdministrator里面有些关键的方法

 

//得到缓存
public Cache getCache()
  {
    return this.applicationCache;
  }

//从缓存中删除内容
  public void removeEntry(String key)
  {
    getCache().removeEntry(key);
  }
//从缓存中得到内容
  public Object getFromCache(String key)
    throws NeedsRefreshException
  {
    return getCache().getFromCache(key);
//取消缓存的更新
public void cancelUpdate(String key)
  {
    getCache().cancelUpdate(key);
  }
//刷新缓存
public void flushEntry(String key)
  {
    getCache().flushEntry(key);
  }
//刷新某组缓存
  public void flushGroup(String group)
  {
    getCache().flushGroup(group);
  }

……

 

还有很多方法,只不过这几个方法用得比较普遍,从代码来看也比较好理解它们的作用。 

 

如何在项目中使用oscahe缓存?

 

为了能够在web项目中更好地使用oscahe,首先配置是必不可少的:

进一步看GeneralCacheAdministrator.java类的构造方法:

 

 private Cache applicationCache = null;
public GeneralCacheAdministrator()
  {
    this(null);
  }

  public GeneralCacheAdministrator(Properties p)
  {
    super(p);
    log.info("Constructed GeneralCacheAdministrator()");
    createCache();
  }

 public Cache getCache()
  {
    return this.applicationCache;
  }

private void createCache()
  {
    log.info("Creating new cache");

    this.applicationCache = new Cache(isMemoryCaching(), isUnlimitedDiskCache(), isOverflowPersistence(), isBlocking(), this.algorithmClass, this.cacheCapacity);

    configureStandardListeners(this.applicationCache);
  }

 我们肯定选带参数的构造了,因为要指定一些必要的属性。。而通过createCache()方法可知,要构建一个缓存对象,可指定一些基本的属性。

 

 

<bean id="sysCacheOscache"
		class="com.opensymphony.oscache.general.GeneralCacheAdministrator"
		scope="singleton" destroy-method="destroy">
		<constructor-arg index="0">
			<props>
				<prop key="cache.memory">true</prop>
				<prop key="cache.capacity">600</prop><!-- 缓存元素个数最大值 -->
				<!-- 缓存元素超过最大值,采用先进先出(first int first out)算法移除 -->
				<prop key="cache.algorithm">com.opensymphony.oscache.base.algorithm.FIFOCache
				</prop>
			</props>
		</constructor-arg>
	</bean>

 

 

 

注意:

1)数据库数据更新时,别忘了调用flush缓存的方法;

2)缓存的key设置问题:

——当你需要得到一个集合时,缓存的key可用常量表示(select * from);

——当你根据不同的条件去数据库查到结果不一样时(select xxx, xx, xx… from xx where …),需要注意key不能用常量固定死,否则当你第一次查库时,会把结果缓存到内存中,而当你查询条件变化后,本来结果应该改变(重新查库。。,此时数据结构为查询结果为map,查询条件的组合为key)

3)不要忘记数据库数据改变时,缓存也需要调用flushEntry刷新缓存中的内容,避免缓存中的内容没有及时跟数据同步。调用之后,它会重新查库,把新的结果保存在缓存中。

 

分享到:
评论

相关推荐

    InTouch与关系数据库的数据交互.PDF

    InTouch与关系数据库的数据交互 ...本文档详细介绍了InTouch软件如何与关系数据库进行数据交互,包括如何读取和写入关系数据库数据,并提供了相关的技术信息和步骤,供中国地区的分销商、系统集成商和最终用户参考。

    带有缓存功能的mysqli数据库操作类

    "带有缓存功能的mysqli数据库操作类"是一个专门为PHP设计的实用工具,它将MySQLi数据库连接与缓存机制相结合,旨在优化数据库查询,减少不必要的数据库交互,从而提升整体性能。 MySQLi(Improved MySQL)是PHP中的...

    web大作业--前端,后端,数据库交互

    前端通过发送Ajax请求,可能使用JSON格式传递数据,与后端接口进行交互,后端再通过SQL语句与数据库进行通信,实现数据的增删改查。数据库管理系统可能包括MySQL、Oracle、SQL Server等,具体选择取决于项目需求和...

    Go语言数据库交互技术详解:关系型与NoSQL数据库操作

    使用database/sql包连接不同类型的数据库、执行基本的CRUD操作、处理事务和错误、使用连接池、SQL预编译和参数绑定、数据库迁移和版本控制、SQL注入防护、数据库性能调优(包括连接池、批处理和缓存),以及在微服务...

    JAVA缓存技术_深入了解.ppt

    Java缓存技术是提高应用程序性能的关键技术之一,它通过存储频繁访问的数据,减少了对慢速资源(如磁盘或远程服务)的依赖,从而提升了系统的响应速度。本篇将深入探讨Java缓存技术的原理、分类以及在不同层次的应用...

    asp.net(c#) 与 highcharts 数据库交互

    ASP.NET (C#) 与 Highcharts 数据库交互是一个关键的技能点,它涉及Web开发中的数据可视化和后端数据处理。Highcharts 是一个流行的JavaScript图表库,用于在网页上创建交互式的图表,而ASP.NET (C#) 则是微软的...

    easyui-tree多级菜单并动态与数据库交互

    在本项目中,我们主要探讨的是如何利用EasyUI框架创建一个具有多级菜单功能的树形结构,并且能够与后台数据库进行动态交互。EasyUI是一个基于jQuery的UI库,提供了丰富的组件,包括我们这里用到的树形控件(tree)。...

    人工智能-项目实践-搜索引擎-基于springboot框架开发,使用 mysql 数据库做数据交互,redis 做缓存

    通过Ajax技术,JavaScript可以与后端Spring Boot应用进行异步通信,实现无刷新的页面更新,提升用户的交互体验。 项目结构"Community98-master"可能表明这是一个名为"Community98"的项目,其中包含了主分支或主版本...

    html与java交互实现数据库连接和发送消息 Chat

    Java端接收到这个请求后,可以使用Java的 JDBC(Java Database Connectivity)API与数据库交互,将消息存储到数据库中。 数据库连接是Java后端的重要部分。为了与数据库进行通信,开发者通常会使用诸如MySQL、...

    缓存与数据库交互优化.pptx

    解决方案,研究报告,行业报告

    Oracle JDBC连接缓存对JSP数据库处理性能的优化.pdf

    - **事务管理**:优化事务处理,减少不必要的数据库交互,例如使用批处理(Batching)来处理多个SQL语句,降低网络传输开销。 - **连接回收与释放**:确保JSP页面在完成数据库操作后正确关闭和释放连接,避免资源...

    提高Java数据库访问效率的策略研究.zip

    2. 批量处理:批量提交SQL语句,减少与数据库的交互次数,显著提升性能。 3. 数据库连接池:通过连接池管理数据库连接,避免频繁创建和关闭连接,降低系统开销。 二、ORM框架优化 1. Hibernate或MyBatis:选择合适...

    C++ Builder编程技巧(网络与数据库篇)

    5. 数据集的缓存更新和批处理:在大量数据操作时,可以使用TClientDataSet的缓存更新和批处理功能,减少与数据库的交互次数,提高性能。 三、综合应用 1. Web服务:结合Indy和ADO,C++ Builder可以构建SOAP或...

    Delphi使用SQLite3内存数据库

    在本文中,我们将深入探讨如何在Delphi编程环境中利用SQLite3数据库系统,特别是关于本地数据库与内存数据库的使用。SQLite3是一种轻量级、自包含的数据库引擎,它不需要独立的服务器进程,使得在Delphi应用程序中...

    matlab gui与数据库Access编程详解

    本文将深入探讨MATLAB GUI与Access数据库的集成以及相关编程技术。 首先,MATLAB提供了Database Toolbox,使得我们能够连接到各种类型的数据库,包括Microsoft Access。使用`database`函数,我们可以创建到Access...

    xml与数据库中数据的导入导出

    9. **性能优化**:大量数据导入导出时,可能需要批量处理,避免频繁的数据库交互。还可以考虑使用数据库的批量插入功能,或者使用存储过程来提升效率。 10. **测试与调试**:编写单元测试以验证XML解析、数据库操作...

    Spring+Struts+页面缓存+内存数据库+licence+proxool+EhCache 搭建的系统基础平台

    其中Spring管理业务逻辑,Struts处理用户交互,Proxool优化数据库访问,内存数据库提供快速的数据存储,EhCache则用于缓存以提升性能,而Licence管理则保证了软件的合规使用。这个平台可以作为一个基本的开发环境,...

    PHP 交互式网页数据库实战手册(PDG)

    本书通过一系列实用的实例,详细介绍了PHP与数据库交互的核心技术和实践技巧。 PHP(Hypertext Preprocessor)是一种广泛应用于Web开发的开源脚本语言,尤其在处理服务器端动态网页和数据库交互方面具有强大功能。...

    抽象工厂访问不同的数据库(反射+缓存)

    在数据库访问中,可能会缓存数据库连接或者预编译的SQL语句,以减少不必要的数据库交互。例如,可以使用ConcurrentHashMap来存储已创建的数据库连接,当需要新连接时,首先检查缓存中是否存在,如果存在则直接使用,...

Global site tag (gtag.js) - Google Analytics