此前一直不知道缓存的具体实现,只知道是把数据存储在内存中,以便下次直接从内存中读取。对于缓存的使用也没有概念,觉得缓存技术是一个比较”神秘陌生“的领域。但最近要用到缓存技术,发现还是很有必要一探究竟的。
缓存技术使用背景:一般来说,对于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刷新缓存中的内容,避免缓存中的内容没有及时跟数据同步。调用之后,它会重新查库,把新的结果保存在缓存中。
相关推荐
c#与数据库的交互--
XML与数据库数据的交互技术研究,利用XML+XMLHTTP技术实现异地数据库的交互技术
ajax与数据库的数据交互问题,实现与数据库的数据交互操作。
pyQt5及mysql制作的一个带UI界面的简易ATM系统,可以与数据库进行交互 pyQt5及mysql制作的一个带UI界面的简易ATM系统,可以与数据库进行交互 pyQt5及mysql制作的一个带UI界面的简易ATM系统,可以与数据库进行交互 ...
极客学院java中级课程,SpringMVC系列教材——SpringMVC 与底层数据库的交互
实现图片与数据库的交互,实现了上传图片存储到数据库,然后显示,还可以删除。
blazor页面组件与数据库数据交互示例
是AJAX效果实例,与数据库交互实例,里面有上百个实例,标记的很清楚.一起学习
java script 纯页面与数据库交互 mysql数据库
一款仿商城的javaweb项目,可以与后台数据库交互,后台数据库为mysql一款仿商城的javaweb项目,可以与后台数据库交互,后台数据库为mysql一款仿商城的javaweb项目,可以与后台数据库交互,后台数据库为mysql一款仿...
ext精髓,Extjs如何与数据库交互,可以很快的叫你EXT一些知识
excel与SQL书数据库的交互工具,这个工具很好的....
ext 与数据库交互实例 ext 与数据库交互实例 ext 与数据库交互实例
主要介绍了redis数据库及与python交互用法,结合实例形式分析了Redis数据库的基本类型、操作以及Python针对Redis数据库的连接、增删改查等相关操作技巧,需要的朋友可以参考下
过HttpClient的方式向服务器发送请求,服务器的Servlet接收并执行数据处理(从数据库中提取数据),最后返回给Android平台,平台解析
自己开发的一个小系统,datagridview增删改查、数据库的增删改查、
描述与iBatis相关技术与数据库进行增删改查操作
Extjs和数据库交互,增删改查Extjs和数据库交互,增删改查(修改测试通过)
在当代 Web 应用中,任意逻辑经常牵涉到与数据库的交互。 数据库驱动网站 在后台连接数据库服务器,从中取出一些数据,然后在 Web 页面用漂亮的格式展示这些数据。或者,站点也提供让访问者自行填充数据库的功能。 ...
这篇文章描述了Wonderware InTouch软件如何读、写关系数据库数据的步骤。本文以Microsoft Access ...在实际应用中,Wonderware InTouch软件可通过类似步骤实现与其他关系数据库的数据交互,如Oracle、SQL Server等。