javaweb笔记4——web程序的缓存机制

文章详细介绍了Java中的缓存机制,包括字符串常量池、整数型常量池、连接池的概念和工作原理,以及线程池如何提升服务器性能。此外,还讨论了Redis作为缓存数据库的角色,以及在Web开发中应用域(如application、session和request)的使用和Cookie作为本地缓存的作用。
摘要由CSDN通过智能技术生成


缓存池

堆内存当中的字符串常量池。

  • “abc” 先在字符串常量池中查找,如果有,直接拿来用。如果没有则新建,然后再放入字符串常量池。

堆内存当中的整数型常量池。

  • [-128 ~ 127] 一共256个Integer类型的引用,放在整数型常量池中。没有超出这个范围的话,直接从常量池中取。

连接池(Connection Cache)

  • 这里所说的连接池中的连接是java语言连接数据库的连接对象:java.sql.Connection对象。
  • JVM是一个进程。MySQL数据库是一个进程。进程和进程之间建立连接,打开通道是很费劲的。是很耗费资源的。怎么办?可以提前先创建好N个Connection连接对象,将连接对象放到一个集合当中,我们把这个放有Connection对象的集合称为连接池。每一次用户连接的时候不需要再新建连接对象,省去了新建的环节,直接从连接池中获取连接对象,大大提升访问效率。
  • 连接池
    • 最小连接数
    • 最大连接数
    • 连接池可以提高用户的访问效率。当然也可以保证数据库的安全性。

线程池

  • Tomcat服务器本身就是支持多线程的。
  • Tomcat服务器是在用户发送一次请求,就新建一个Thread线程对象吗?
    • 当然不是,实际上是在Tomcat服务器启动的时候,会先创建好N多个线程Thread对象,然后将线程对象放到集合当中,称为线程池。用户发送请求过来之后,需要有一个对应的线程来处理这个请求,这个时候线程对象就会直接从线程池中拿,效率比较高。
  • 所有的WEB服务器,或者应用服务器,都是支持多线程的,都有线程池机制。

缓存数据库

redis

  • NoSQL数据库。非关系型数据库。缓存数据库。

域对象

application域

  • 对应的类名:ServletContext
  • 定义和作用
    • 创建:由服务器创建的唯一一个
    • 作用:给所有的用户都公共享有的区域
    • 建议:不要常用,因为多个用户都可以访问
    • service方法调用:直接this.getContext()方法就可以调用应用域
  • 常用的方法
    • setAttribute(向域当中绑定数据)
    • getAttribute(从域当中获取数据)
    • removeAttribute(删除域当中的数据)
    • getContextPath (获取应用的根路径)
    • getInitParameter (通过初始化参数的name获取value)
    • getInitParameterNames (获取所有的初始化参数的name)

session域(cookie的子效果)

  • 对应的类名:httpsession
  • 定义和作用
    • JSESSIONID=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的。浏览器只要关闭。这个cookie就没有了。
    • 物理上是通过本地存放cookie来实现的,但逻辑上是用户的一次完整的服务器访问
    • 在service中调用:在request对象中直接调用request.getsession()
    • 典型的例子:登录使用web程序
  • 常用的方法
    • setAttribute(向域当中绑定数据)
    • getAttribute(从域当中获取数据)
    • removeAttribute(删除域当中的数据)

request域

  • 对应的类名:httprequest
  • 定义和作用
    • 就是一次请求所拥有的东西
    • 本质上就是客户端向服务器的请求所包含的所有内容
    • 服务器sevlet程序可以向其中取数据,偶尔也会向其中存数据,这一般体现在程序转发上
  • 常用的方法
    • setAttribute(向域当中绑定数据)
    • getAttribute(从域当中获取数据)
    • removeAttribute(删除域当中的数据)

本地缓存机制

cookie

  • cookie的意义
    • cookie和cookie保存的session就是为了保存会话的状态
    • 在B/S结构中,都是一次次的请求,所以需要记录上一次的会话
    • 每一次request请求都会带上这个路径上的cookie
    • 可以通过request请求来找到该路径下的所有cookie
  • 一个cookie的必要属性
    • cookie的有效时间
    • cookie的path(path下的所有路径)
    • cookie中存储的数据 (Name–Value)
  • 通过request找到一个路径下的所有cookie
Cookie[] cookies = request.getCookies(); // 这个方法可能返回null
if(cookies != null){
   for(Cookie cookie : cookies){
     // 获取cookie的name
     String name = cookie.getName();
     // 获取cookie的value
     String value = cookie.getValue();
 }
}
  • 通过response增加一条路径下的cookie
Cookie cookie = new Cookie("token",token);
cookie.setMaxAge(60); //60s
cookie.setPath("/");
response.addCookie(cookie);
  • 通过response删除或更新一条路径下的cookie
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                if ("token".equals(cookie.getName())){
                    cookie.setMaxAge(0); //删除 cookie
                    cookie.setPath("/"); //创建时设置了什么参数,删除时就要设置什么参数
                    
                    Cookie cookie1 = new Cookie("token",cookie.getValue());
                    cookie1.setMaxAge(60);
                    cookie1.setPath("/");
                    
                    response.addCookie(cookie);
                    response.addCookie(cookie1);
            }
     }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值