网站开发中的服务器缓存处理

此生再无相见时 提交于 2019-12-25 19:37:21

服务器缓存的概述

使用服务器缓存的好处

缓存:就是存放在内存中的数据
浏览器缓存:浏览器内存中保存的以前的服务器做出的响应
服务器缓存:保存在服务器内存中的数据

服务器缓存通常都保存些什么

一般来讲,服务器缓存就是用来保存数据字典的,因为数据字典数据量大,而且值不是很容易发生变化。(重点是:值不容易发生变化

总是在实时更新表中的数据,每一次我们使用都要求重新从表中取得最新的数据。而不是从服务器缓存中取得老数据。

处理服务器缓存的最佳时机

使用监听器处理服务器缓存
监听器作为web开发3大组件(Servlet(controller)、Filter、Listener),是由Tomcat服务器帮我们维护的。

监听器,能够监听域对象的创建与销毁,还能够监听域对象中属性值的创建,更新和移除。

最常用的是监听域对象创建、销毁本身。
你监听什么,我们就是实现哪个所需的监听器
例如:
我们现在拿spring的监听器来举例

public class ContextLoaderListener extends ContextLoader implements ServletContextListener

ContextLoaderListener所实现的是ServletContextListener接口,证明ContextLoaderListener要监听的是上下文(全局域)对象的创建与销毁。
简单来说,监听的就是application域对象的创建与销毁。
contextInitialized:是用来监听application对象创建的方法,
当application对象创建,该监听器就监听到了,立即执行该方法。
contextDestroyed:是用来监听application对象销毁的方法,
当application对象销毁,该监听器就监听到了,立即执行该方法。

以上我们举得例子是监听application,除了application之外,还会有其他的域对象,例如request或者是session,你监听谁,你就必须要实现相应的域对象的接口。

模拟一下spring工厂的创建时机。

我们可以自己创建一个监听器,监听的仍然是application域对象。

将数据字典处理到服务器缓存中的最佳方式
启动Tomcat服务器,服务器启动之后,服务器会自动的为我们创建一个application对象,当application对象创建完毕后,监听器中的contextInitialized就执行了,我们就可以在这个contextInitialized方法中将所有的数据字典值取出,将他们保存到application域对象中。
将数据字典值保存到application域对象中的过程,就是将数据字典保存到服务器内存中,产生缓存的过程。
关键代码:application.setAttribute(“key”,List dvList);

application对象的生命周期
创建:服务器启动
销毁:服务器关闭

所谓的服务器缓存其实就是往application域对象中存值。

服务器缓存处理前的问题

  1. 在监听器中,我们需要使用到数据字典的业务层对象
    但是我们不能像以前那样直接以如下形式来使用
    //监听器不认识该注解
    /@Autowired
    private DicService dicService;
    /
    监听器的创建,必须是 Tomcat容器帮我们完成的,而不是spring的IOC帮我们管理创建的
    所以使用spring配置监听器,再注入service是不行的
    我们需要使用WebApplicationContextUtils工具类,该工具类的作用是获取到spring容器的引用,进而获取到我们需要的bean实例
    WebApplicationContextUtils.getWebApplicationContext(application).getBean(DicService.class);
  2. 注意:配置的上下顺序
    Spring提供监听器配置在上方 先由spring容器创建好service
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

我们自定义的监听器配置在下方 再由tomcat容器引用service对象

<listener>
  <listener-class>com.bjpowernode.crm.web.listener.SysInitListener</listener-class>
</listener>

服务器缓存处理

1.监听器关键代码实现:

@Override
public void contextInitialized(ServletContextEvent event) {
	//创建全局作用域对象
    ServletContext application = event.getServletContext();
    //取得service对象
    DicService dicService = WebApplicationContextUtils.getWebApplicationContext(application).getBean(DicService.class);
    
    Map<String, List<DicValue>> map = dicService.getAll();
    Set<String> set = map.keySet();
    for(String key:set){
    	//将值放在全局作用对象中
        application.setAttribute(key,map.get(key));
    }
}

2.业务层关键代码实现

@Override
public Map<String, List<DicValue>> getAll() {
    List<DicType> dtList = dicTypeDao.getTypeList();
    Map<String, List<DicValue>> map = new HashMap<>();
    
    for(DicType dt:dtList){
        String code = dt.getCode();
        List<DicValue> dvList = dicValueDao.getValueListByCode(code);
        map.put(code+"List",dvList);
    }
    return map;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!