为应用程序添加缓存

服务端添加缓存

1. 背景

由于项目进度赶得比较紧,而且第一次自己设计系统的架构,刚开始考虑的并不完全,主要想着先把系统的功能实现了再说。因此刚开始设计系统的时候并没有考虑缓存的问题,但是对已一个web系统,缓存不仅可以大大的减少数据库的压力,也可以很大程度的提高系统的响应时间。现在系统的功能完成的基本差不多了,因此现在需要为系统添加缓存,但是由于系统功能已经完成的差不多了,代码写的也很多了,所以现在添加缓存确实显得比较困难了。

先说说我们当前系统的整体框架结构吧。

从图中可以清楚的看出,我们目前采用的架构比较简单,所有的请求都通过.htaccess文件转发到index.php然后在index.php文件中启动转发函数,通过请求的将请求分配到特定的’Server’执行特定的Action,在此Action里调用一个服务从数据库里取出数据返回给客户端。下面是当前系统的类图(为了显示出调用的方法,所以有点不规范)。

2. 添加缓存

添加缓存的方法有很多,最让人想到的就是直接在dao层添加,在从数据库取数据之前,首先先从缓存取,如果缓存没有的话再从数据库取,然后放到缓存里。另一种策略是在service层添加缓存,也就说从将从dao层取出的取出的数据进行拼装之后放到缓存里。

首先分析一下两种方案的优缺点:

第一种方案:

优点:首先在dao层添加缓存对每条sql的执行结果进行缓存,缓存的粒度比较小,缓存的命中率会比较高。

缺点:每个sql查询数据不一样,则可能本来是同一个信息,但是可能仅仅是多了一个字段确又多了一条缓存记录,这是很大的浪费,毕竟缓存的成本还是比较高的。其次如果直接在dao层进行缓存,有些地方其实是不想进行缓存的,那么这样就比较不方便控制了。

第二种方案:

优点:在service进行缓存,首先是在原来系统的基础上添加代码比较少,其次对拼装好的数据缓存由于service的参数一般变化不大,缓存的数据就会比较少,命中率也不错。

缺点:缓存的粒度比较大,命中率不会那么理想,而且缓存的重用性也比较差。

综合上面的分析基本可以知道无论是在dao层还是service层进行缓存都既有优点又有缺点,最后经过考虑结合两者的优点,抽象出一个缓存层,在缓存层里控制是否进行缓存,以及缓存的逻辑,同时将缓存的对象改为数据库对应的一个一个对象,这样缓存对象的重用性以及命中率都有很不错的效果。

下面是添加缓存后的类图:

在原来的框架基础上再service里直接调用cacheServer加载指定的cache,原来的service逻辑不用改变,只有叫原来调用dao的改为调用cache即可。

到此缓存基本已经添加完成,编码也完成了,使用起来目前感觉还可以,又不合适的地方希望读者可以多多交流。

最后感谢http://www.crackedzone.com/server-need-a-new-datastore-layar.html文章的博主,给了我很到的启发。

时间: 2024-10-03 13:12:12

为应用程序添加缓存的相关文章

debian中 将一个程序添加到favorite

debian中 将一个程序添加到favorite创建一个×.desktop文件,内容如下,然后保存到application文件夹下即可[Desktop Entry] Type=Application Name=Eclipse Comment=Eclipse Integrated Development Environment Icon=/opt/eclipse-4.2.1/icon.xpm Exec=/opt/eclipse-4.2.1/eclipse Terminal=false Catego

给go程序添加命令行参数

操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 需要应用程序根据不同的配置文件访问不同的服务器,希望程序启动时可以指定配置文件. 解决方案 package main import ( "os" "fmt" ) func main() { argsWithProg := os.Args if(len(argsWithProg) < 2) { fmt.Println("usage : ",argsWithProg

为WPF程序添加字体

很多时候我们开发的程序可能会在多个版本的Windows上运行,比如XP.Win7.Win8. 为了程序美观,现在很多公司会使用WPF作为程序的界面设计. 跨版本的操作的操作系统往往有一些字体上的问题,比如Win7和Win8有微软雅黑字体,而XP上没有(虽然微软已经明确不在维护XP,但往往还是有很多一部分使用者会使用相当长一段时间,比如医疗机构.企事业单位),还有的一种情况就是为了程序效果的需要而使用一些特殊的字体. WPF程序只要下面几个步骤就可以为程序自带字体,而不需要放到系统目录的Fonts

添加缓存实例

@Servicepublic class ItemServiceImpl implements ItemService { @Autowired private TbItemMapper itemMapper; @Value("${REDIS_ITEM_KEY}") private String REDIS_ITEM_KEY; @Value("${REDIS_ITEM_EXPIRE}") private Integer REDIS_ITEM_EXPIRE; @Aut

在Ubuntu的系统中如何将应用程序添加到开始菜单中

/*********************************************************************  * Author  : Samson  * Date    : 07/03/2014  * Test platform:  *              3.11.0.11-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

C# 为网络程序添加用户代理

如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 我建议大家在网上找找类似 http://www.proxy.com.ru/免费的代理的网站,代码上的代理是在网上找的 几日后你在使用我的代码则没有代理效果 因为代理服务器无效,所有后面 需要查阅方法的自己去找一个免费代理的服务器地址 不要说我没提醒. 我不建议大家在Wininet层使用Intern

linux如何给程序添加自启动

我要使我的服务程序在重启系统后也随之自动启动.启动我的服务用到了一个脚本.现在有两个方法: 法1: sudo vi /etc/init.d/rc.local在这里添加启动服务的脚本命令. 这个方法的优点是:此时尚未登录用户,启动服务用的是su.相当于sudo.权限无比大. 这个方法的缺陷是:这个时候用户尚未login,当然更没有指定用户主目录,因此假如我们的服务程序里有用到'~'作为路径的,那就废了,'~'表示'null'...ps:可以在/var/log/boot.log里看日志. 法2: s

c程序添加apue头文件

#include "apue.h" (c程序添加的头文件) 1. 超级用户权限登入 #cd /usr/include 2. 将apue.h和error.c两个文件copy到该目录下.(apue.h位于 your_apue_path/inlcude ; error.c位于your_apue_path/lib ) 以我的路径为例: #cp /root/apue.2e/inlcude/apue.h . #cp /root/apue.2e/lib/error.c . (实现apue.h中的出错

将程序添加到右键菜单(以记事本、UltraEdit为例)

原文:将程序添加到右键菜单(以记事本.UltraEdit为例) 如何将程序加入右键菜单,这里分别以记事本.UltraEdit为例! 以记事本程序为例: 1. 在运行中输入regedit,打开注册表,找到HKEY_CLASSES_ROOT\*\shell分支,如果没有shell分支,则在*下点击右键,选择“新建-项”,建立shell分支. 2. 在shell下新建“用记事本打开”项,在右侧窗口的“默认”键值栏内输入“用记事本打开”.项的名称和键值可以任意,以含义明确为好.其中键值将显示在右键菜单中