自己用HashMap来模拟一个Session缓存(简易版)

本文记录:Hibernate中一级缓存的特点。

一级缓存的细节什么操作会向一

1.级缓存放入数据

save,update,saveOrUpdate,load,get,list,iterate,lock

2.什么操作会从一级缓存取数据。
get / load / list

get / load 会首先从一级缓存中取,如没有,再有不同的操作[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求。
?list 会不会从session缓存取数据?

3.一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象。

evict 是清除一个对象,clear是清除所有的sesion缓存对象

4.session级缓存中对象的生命周期, 当session关闭后,就自动销毁.

5.自己用HashMap来模拟一个Session缓存,加深对缓存的深入。

复制代码
package dome;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyCache {
    // 使用map来模拟缓存
    static Map<Integer, Student> maps = new HashMap<Integer, Student>();
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        getStudent(1);
        getStudent(1);
        getStudent(1);
        getStudent(1);
        getStudent(3);
        getStudent(3);

    }

    public static Student getStudent(Integer id) { // s.get()

        // 先到缓存去
        if (maps.containsKey(id)) {
            // 在缓存有
            System.out.println("从缓存取出");
            return maps.get(id);
        } else {
            System.out.println("从数据库中取");
            // 到数据库取
            Student stu = MyDB.getStudentFromDB(id);
            // 放入缓存
            maps.put(id, stu);
            return stu;
        }

    }

}

// 我的数据库
class MyDB {

    static List<Student> lists = new ArrayList<Student>();

    // 初始化数据库,假设有三个学生
    static {
        Student s1 = new Student();
        s1.setId(1);
        s1.setName("aaa");
        Student s2 = new Student();
        s2.setId(2);
        s2.setName("bbb");
        Student s3 = new Student();
        s3.setId(3);
        s3.setName("ccc");
        lists.add(s1);
        lists.add(s2);
        lists.add(s3);

    }

    public static Student getStudentFromDB(Integer id) {
        for (Student s : lists) {
            if (s.getId().equals(id)) {
                return s;
            }
        }
        return null;// 在数据库中没有.

    }
}

class Student {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

posted @   江河湖泊  阅读(1050)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示