一、缓存
-
当用户访问量很大时,需要多次访问数据库,为了提高性能,需要引入缓存cache
-
缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。
-
缓存的工作原理是当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
二、redis
- redis是现在主流的缓存工具了,因为使用简单、高效且对服务器要求较小,用于大数据量下的缓存。
- redis是内存数据库,不能执行sql语言
- 相当于一个远程的hasmap
- 采用的是C语言编写
三、hashmap模拟缓存工作原理
此处为了方便,连接数据库没有采用分层架构去完善,简单演示,了解原理即可
1)首先查看数据库中存储的数据格式
2)连接数据库,利用spring在浏览器中显示
定义一个Student类,用于将数据库的每条记录,创建一个对象
Student
public class Studnet {
private String id;
private String name;
private Integer age;
private String gender;
private String clazz;
public Studnet(String id, String name, Integer age, String gender, String clazz) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.clazz = clazz;
}
public Studnet() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
Studentquery
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
//http://localhost:8080/studentquery?id=1500100002185&key=123
@RestController
public class Studentquery {
/**
* 定义一个hashmap用于缓存
* 键值为ID,值为学生对象
*/
HashMap<String,Studnet> cache =new HashMap<String,Studnet>();
/**
*由于是spring项目,这里只要添加注解供扫描即可
* 两个参数,一个是要查询的ID,另一个是为了数据安全,需加上密码才能访问
* key就相当于访问该方法的钥匙,这里key为123
*/
@GetMapping("/studentquery")
public Studnet studentquery(String id,String key) throws Exception {
if(id.trim().isEmpty()|!key.equals("123")){
return null;
}
/**
* 现在缓存中查找,如果有学生信息,直接返回,如果没有接着在数据库中查找
*/
Studnet stu=cache.get(id);
if(stu!=null){
return stu;
}
/**加载驱动
* 建立连接
* 查询语句
*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/user", "root", "123456");
PreparedStatement ps = conn.prepareStatement("select * from student where id=?");
ps.setString(1,id);
ResultSet rs = ps.executeQuery();
if(rs.next()){
String name = rs.getString("name");
Integer age = rs.getInt("age");
String gender = rs.getString("gender");
String clazz = rs.getString("clazz");
stu=new Studnet(id,name,age,gender,clazz);
//查询到加入到缓存,便于后期查询
cache.put(id,stu);
//由于是spring项目,会自动把student对象,转化为json格式
return stu;
}
return null;
}
}
3)测试,运行spring接口
一旦运行就不会停止,直接在浏览器中给值刷新
在浏览器中输入网址查看
在浏览器中找到更多工具,开发者工具,观察加入缓存后运行时间的变化
第一次查找,cache中没有数据,需建立连接,在数据库中查询
第二次查找,直接在浏览器中更改学生的学号,由于第一次运行后,数据库的连接已经建立,虽然缓存中也没有该学生,但是相比于第一次,没有了建立连接的时间,时间也会减少一点
第三次查找,查找之前第一次查找的那个人,此时直接去cache缓存中查找,比在数据库中查找,要更快一点
java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
java应用一(反射的应用)
java应用二(配置文件、工具类)
java应用三(数据库索引、spring)
Linux
Linux基础一
Linux基础二
Mysql
mysql一
mysql二
mysql三
mysql四
java连接数据库
redis
redis一(缓存,redis简介)
redis二(在虚拟机中的安装,桌面插件)